【问题标题】:Data Response Not able to map in the react router数据响应无法在反应路由器中映射
【发布时间】:2019-03-01 18:58:39
【问题描述】:

我在 react 中创建了一个电子商务应用程序。从下面的截图可以看出,当我点击 Apparels->Girls->Shoes 时,屏幕上没有显示数据。

首先,在 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 中,我正在显示第一级类别,如服装、电子产品、杂货等。此外,我创建了一个组件子菜单,用于显示第二级类别,如女孩、男孩、女性等。

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}`));

我不知道我的代码哪里出错了。也许我觉得从节点服务器来看,与 reactjs 路由不匹配,仅在 url 中,它显示的是链接而不是内容。有人可以给我一个见解。我的控制台浏览器窗口:

【问题讨论】:

  • console this.props 检查 id 是否存在于`subListMenu.js`中
  • 你如何向 SubListMenu.js 发送道具?
  • 显示为未定义
  • @AkshayAggarwal this.props.id 是我正在使用的。如果我只使用 this.props 这是它在控制台中显示的响应。标识符:“女鞋”名称:“鞋” parentCatalogGroupID:(2)[“10001_5”,“10502_5”] resourceId:“149.129.128.3:3737/search/resources/store/1/categoryview/byId/…”shortDescription:“鞋” storeID:“10501” uniqueID:“10015”原型:对象
  • 等等我正在编辑我的问题......然后你会得到整个图片

标签: node.js reactjs react-router


【解决方案1】:

关于这个问题

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
  })
});
}

试试这个,它会解决未定义的问题。

【讨论】:

  • 现在 Id 即将出现在 url 中,但在控制台中,它显示未定义。我应该编辑关于我到目前为止所做的事情的问题
  • 在我的控制台中显示为 (4) [{...}, {...}, {...}, {...}] 0: {identifier: "Girls Shoes", fullImage: "/wcsstore /ExtendedSitesCatalogAssetStore/images/catalog/apparel/girls/category/catr_gsh_shoes.png”,缩略图:“/wcsstore/ExtendedSitesCatalogAssetStore/images/catalog/apparel/girls/category/catr_gsh_shoes.png”,storeID:“10501”,名称:“鞋”,...}未定义
  • @ShaswatiBhattacharyya 是的,请更新问题
  • 请提供SublistMenu.js的代码@ShaswatiBhattacharyya
  • 我已将代码推送到仓库,我认为它解决了问题。从现在开始你必须自己去......祝你好运;-) ....还有一件事你今天所做的任何改变......请删除它们并拉动然后测试并重新开始工作
【解决方案2】:

我相信你必须从subBelow 中取走id 而不是this.props.id

所以像这样更改代码。

<li key={subl.uniqueID}><Link to = {`Apparel/Girls/${ subl.uniqueID }`}>{subl.name}</Link></li>

【讨论】:

  • id 显示在 url...但在控制台中,它在控制台中显示为 undefined
  • 修改了代码之后,还是点击了Shoe Link,还是黑屏
  • 你的意思是什么?
  • 你能帮帮我吗?我已经对代码进行了更改并更新了我的问题
  • 真的很困惑 Shaswati,你为什么不能作为新问题提出。
【解决方案3】:

您在 URL 栏中未定义的原因是因为您没有将唯一 id 从 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() 并在下一个 .then 获取数据

 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 => (

【讨论】:

  • 在控制台浏览器窗口中显示为未定义
  • 对不起,我没听懂。你能指出我代码中的 console.log 行吗?
  • 对不起,我的错。我现在有你的问题。我更新了我的答案。请试一试
  • 未定义的错误已经消失,响应显示在浏览器窗口中......但是,当我点击女孩->鞋子时,它显示为空白屏幕。
猜你喜欢
  • 2021-07-13
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 2018-03-22
  • 2015-10-19
相关资源
最近更新 更多