Ответ на данные Не удается сопоставить в маршрутизаторе реагирования - PullRequest
0 голосов
/ 26 сентября 2018

Я создал приложение Commerce в ответ.Как видно из скриншота ниже, когда я нажимаю на «Одежда-> Девочки-> Обувь», данные не отображаются на экране.

enter image description here

Итак, сначала, в файле index.js, я установил BrowserRouter и создал компонент Main, который содержит все остальные мои компоненты.

index.js

import React from "react";
import ReactDOM from "react-dom";
import Main from "./Main";
import "./index.css";
import 'bootstrap/dist/css/bootstrap.css';
import {Route, NavLink, BrowserRouter} from 'react-router-dom';

ReactDOM.render((


  <BrowserRouter>
   <Main/>
   </BrowserRouter>



)

 , 
  document.getElementById("root")
);

После этогоЯ создал Main.js, где я создал компоненты для Navigation и PLPMenu (которые должны отображаться после нажатия на Girls-> Shoes).Кроме того, в файле Main.js я установил параметры коммутатора и пути маршрутов

Main.js

import React, { Component } from "react";
import 'bootstrap/dist/css/bootstrap.min.css';
import { Route, Switch } from 'react-router-dom';
import Navigation from "./components/topNavigation";
import Footer from "./components/Footer";
import Banner from "./components/Banner";
import PLPMenu from "./components/PLPMenu";
import PDP from "./components/PDP";
import Home from "./components/Home";





class Main extends Component {


  render() {


    return (
      <div>


        <Navigation />

        <Switch>
          <Route exact path="/" component={Home} />
          <Route path="Apparel/Girls/:id" component={PLPMenu}/>
          <Route path="/PDP" component={PDP} />
          <Route path="/Banner" component={Banner} />
          <Route path="/Footer" component={Footer} />
        </Switch>


      </div>

    )

  }


}

export default Main;

В файле topNavigation.js я отображаю первый уровень категорий, таких как Одежда, Электроника, Бакалея и т. Д. Кроме того, я создал компонент SubMenu для отображения второго уровня категорий, таких как Девушки, Мальчики, Женщины и т. Д.

topNavigation.js

import React, { Component } from 'react';
import axios from 'axios';
import SubMenu from './subMenu';



class Navigation extends Component {

  state = {
    mainCategory: []
  }

  componentDidMount() {
    axios.get('http://localhost:3030/topCategory')
      .then(res => {
        console.log(res.data.express);
        this.setState({
          mainCategory: res.data.express.catalogGroupView
        })
      })
  }



  render() {

    const { mainCategory } = this.state;
    return mainCategory.map(navList => {
      return (

        <ul className="header">
          <li key={navList.uniqueID}>
            <a className="dropbtn ">{navList.name} </a>
              <ul className="dropdown-content">
                <SubMenu below={navList.catalogGroupView} />
              </ul>


          </li>
        </ul>

      )

    })

  }


}

export default Navigation;

subMenu.js

In the submenu.js, I have created one more component SubListMenu for displaying the inner categories like Shoes, Pants, Skirts, Tops etc.

import React, { Component } from 'react';
import SubListMenu from './subListMenu';


class SubMenu extends Component {
    render() {
        const { below } = this.props;
        return below.map(sub => {

            return (

                <React.Fragment>

                    <li key={sub.uniqueID}>

                        <a>{sub.name}</a>

                        {
                            <ul className="sub-menu">
                                {sub.catalogGroupView !== undefined && <SubListMenu id={sub.uniqueID} subBelow={sub.catalogGroupView} />}
                            </ul>


                        }

                    </li>

                </React.Fragment>

            )
        })

    }

}

export default SubMenu;

subListMenu.js

    import React, { Component } from 'react';
    import {Link} from 'react-router-dom';

    class SubListMenu extends Component {
      render() {
        const { subBelow, id } = this.props;
       console.log(subBelow)
        return(
           <React.Fragment>
               {subBelow && subBelow.map(subl => {
                 return (
                    <li key={subl.uniqueID}><Link to = {`Apparel/Girls/${subl.name}/${ subl.uniqueID }`}>{subl.name}</Link></li>

                 )
              })
            }
           </React.Fragment>
        )        
       } 
     }

    export default SubListMenu;

Как видно из моего кода subListMenu.js, я установил ссылку на PLPMenu.js.Но в моем случае этого не происходит.Кроме того, в части «Одежда / Девушки в ссылке», я жестко запрограммирован, и я не могу сделать ее динамичной.

PLPMenu.js

import React, { Component } from 'react';
import { Link } from 'react-router-dom';


import axios from 'axios';

class PLPMenu extends Component {

  state = {
    shoeCategory: []
  }



  componentDidMount() {
    let pathname= this.props.match.params.id
console.log(pathname)


  axios.get(`http://localhost:3030/${pathname}`)
    .then(res => (res.json()))
    .then(data => {
     this.setState({
          shoeCategory: data.express.catalogEntryView
     })
  });
}



  render() {
    const { shoeCategory } = this.state;

    const picUrl = 'https://149.129.128.3:8443'

    return (

      <div>
        <div className="container">
          <div className="row">
            {

              shoeCategory && shoeCategory.map(shoeList => (

                <div className="col-md-4">

                  <h2 key={shoeList.uniqueID}></h2>


                  <img src={picUrl + shoeList.thumbnail} />
                  <Link to="/PDP"><p className="pdp">{shoeList.name}</p></Link>
                  <p>Price : {shoeList.price[0].value} {shoeList.price[0].currency}</p>


                </div>

              ))
            }
          </div>
        </div>

      </div>




    )

  }

}

export default PLPMenu;

Для извлечения данных яЯ использовал сервер узла.

server.js

const express = require('express');
const cors = require('cors');
const Client = require('node-rest-client').Client;//import it here
const app = express();

app.use(cors());





app.get('/topCategory', (req, res) => {

    var client = new Client();

    // direct way
    client.get("http://149.129.128.3:3737/search/resources/store/1/categoryview/@top?depthAndLimit=-1,-1,-1,-1", (data, response) => {
     res.send({ express: data });
    });
 });

 app.get('/GirlShoeCategory', (req, res) => {

    var client = new Client();

    // direct way
    client.get("http://149.129.128.3:3737/search/resources/store/1/productview/byCategory/10015", (data, response) => {
     res.send({ express: data });
    });
 });



const port = 3030;
app.listen(port, () => console.log(`Server running on port${port}`));

Я не знаю, где мой код ошибается.Может быть, я чувствую, что на сервере узла существует несоответствие с маршрутами реагирования, для которого только в URL-адресе отображается ссылка, а не содержимое.Может кто-нибудь, пожалуйста, дайте мне понимание этого.Окно браузера моей консоли:

enter image description here

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Причина, по которой вы не определены в строке URL, потому что вы не передаете уникальный идентификатор из SubMenu в компонент SubListMenu.

Что вам нужно сделать, это

SubMenu.js

import React, { Component } from 'react';
import SubListMenu from './subListMenu';


class SubMenu extends Component {
    render() {
        const { below } = this.props;
        return below.map(sub => {

            return (

                <React.Fragment>

                    <li key={sub.uniqueID}>

                        <a>{sub.name}</a>

                        {
                            <ul className="sub-menu">
                                {sub.catalogGroupView !== undefined && <SubListMenu id={sub.uniqueID} subBelow={sub.catalogGroupView} />}
                            </ul>


                        }

                    </li>

                </React.Fragment>

            )
        })

    }

}

export default SubMenu;

SubListMenus.js

import React, { Component } from 'react';
import {Link} from 'react-router-dom';

class SubListMenu extends Component {
  render() {
    const { subBelow, id } = this.props;
    console.log(subBelow)
    return(
       <React.Fragment>
           {subBelow && subBelow.map(subl => {
             return (
               <li key={subl.uniqueID}><Link to = {`Apparel/Girls/${ id }`}>{subl.name}</Link></li>
             )
          })
        }
       </React.Fragment>
    )        
   } 
 }

export default SubListMenu;

Относительно проблемы ниже. Вам нужно выполнить res.json () и в следующем. Затем получить данные

 In the PLPMenu.js page, I'm trying to fetch the data. But all I'm getting is this undefined.

Сделайте это

componentDidMount() {
    let pathname= this.props.match.params.id

    console.log(this.props.match.params.id)

  axios.get(`http://localhost:3030/${pathname}`)
    .then(res => (res.json()))
    .then(data => {
     this.setState({
          shoeCategory: data.express.catalogEntryView
     })
  });
}

Редактировать:

Добавить условие ниже в компоненте PLPMenu

{shoeCategory && shoeCategory.map(shoeList => (
0 голосов
/ 26 сентября 2018

для этой проблемы

In the PLPMenu.js page, I'm trying to fetch the data. But all I'm getting is this undefined.

componentDidMount() {
let pathname= this.props.match.params.id

console.log(this.props.match.params.id)

axios.get(`http://localhost:3030/${pathname}`)
 .then(res => {return res.json();})
 .then(data => {
  this.setState({
      shoeCategory: data.express.catalogEntryView
  })
});
}

попробуйте это, это решит неопределенную проблему.

0 голосов
/ 26 сентября 2018

Я считаю, что вы должны взять id из subBelow вместо this.props.id.

, поэтому измените код следующим образом.

<li key={subl.uniqueID}><Link to = {`Apparel/Girls/${ subl.uniqueID }`}>{subl.name}</Link></li>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...