【问题标题】:Failing to Compile Data to Render in ReactJs无法编译数据以在 ReactJs 中呈现
【发布时间】:2021-05-02 00:27:27
【问题描述】:

我目前正在尝试从 JSON 文件中获取数据并将其呈现到研究页面。我所做的一切似乎都不起作用。我想获取数据并将其放入某种表格或可视化中。请让我知道我可能做错了什么。我目前收到以下错误:

TypeError: 无法读取未定义的属性“地图”

在我的数据目录中

damon-data.json(这是一个大文件,放在这里是不可能的,所以我放一小部分)

{

    "hits": [
        {
            "_index": "issflightplan",
            "_type": "issflightplan",
            "_key": "IDP-ISSFLIGHTPLAN-0000000000000447",
            "_version": 1,
            "_score": null,
            "ContentType": {
                "__deferred": {
                    "uri": "https://bi.sp.iss.nasa.gov/Sites/FP/_api/Web/Lists(guid'a9421c5b-186a-4b14-b7b2-4b88ee8fab95')/Items(252)/ContentType"
                }

然后在我的同一个目录中

data.js - 我的想法是我会在这里获取数据并使用道具将其传递到研究页面

import React, {Component} from 'react';
import data from '../data/damon-data.json'
import axios from 'axios';


class Data extends Component {
    constructor(props) {
        super(props);

        this.state = ({
            dataSet: []
        })
    }
    componentDidMount() {
        let url = data;
        axios.get(url)
            .then(response => {
                console.log(response.data.hits)
                this.setState({
                    dataSet: response.data.hits
                })
            })
            .catch(error => {
                console.log(error)
            })
    }
}

researchPage.js - 这是数据应该呈现的地方(一旦我在这里呈现它,我想我可以开始将它放入一个表格中。除非有更好的方法来解决它。

import React, { Component } from "react";


class researchPage extends Component {
    constructor(props) {
        super(props);
    }

    render() {
        return(

            <div>
                {this.props.data.map((dataSet, index) => (
                   return <p>{dataSet.hits}</p>
                ))}
            </div>

        )
    }
}
export default researchPage

App.js

import React, {Component} from 'react';
import {BrowserRouter, Route, Switch} from 'react-router-dom';
import './App.css';
import Navbar from "./components/menu/navbar";
import Home from './pages/home/home'
import Explore from './pages/explore/explore'
import search from './pages/search/search'
import researchPage from "./pages/researchPage/reasearchPage";
import Query from './pages/query/query'
import Visualize from "./pages/visualize/visualize";
import Analyze from "./pages/analyze/analyze";
import Configure from "./pages/configure/configure";

class App extends Component{
  render() {
    return(
        <BrowserRouter>
          <div>
            <Navbar/>
            <Switch>
                <Route path="/" component={Home} exact/>
                <Route path="/explore" component={Explore} exact/>
                <Route path="/search" component={search} exact/>
                <Route path="/query" component={Query} exact/>
                <Route path="/visualize" component={Visualize} exact/>
                <Route path="/analyze" component={Analyze} exact/>
                <Route path="/configure" component={Configure} exact/>
                <Route path="/research" component={researchPage} exact/>
            </Switch>
          </div>
        </BrowserRouter>
    )
  }
}

export default App;

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

reportWebVitals();

【问题讨论】:

  • 您是否将数据从 Data 组件传递到 researchPage?看不到代码。您能否在 console.log(response.data.hits) 中获取数据?
  • 是的,这就是我想要做的,不确定在将 Data 组件传递给 researchPage 时是否遗漏了什么。我在控制台中根本看不到任何数据。我确实放置了以下错误,我得到 TypeError: Cannot read property 'map' of undefined
  • 所以您正在从本地 json 文件中导入一些数据。然后你使用 axios 调用一个 URL,根据你的代码,这个 URL 似乎是你刚刚从 json 文件中导入的数据。我超级困惑。
  • 您如何/在哪里使用研究页面以及如何将数据传递给它?
  • Sanish,我刚刚添加了 App.js 和 index.js。这是我的主要问题,试图弄清楚如何将数据从数据组件传递到研究页面。我知道我做的不对,但我似乎无法弄清楚我做错了什么。

标签: javascript reactjs react-redux


【解决方案1】:

假设您已正确完成所有步骤,则您的代码中立即出现错误,您正在保存 response.data.hits 并再次尝试将其映射为 &lt;p&gt;{dataSet.hits}&lt;/p&gt; 将简单地视为 response.data.hits.hits 因为根据您的代码dataSet 实际上是hits 数组。所以你可能只想做

    this.setState({
        dataSet: response.data
    })

除此之外,您似乎没有将数据传递给researchPage 组件。测试数据的最简单方法是直接在researchPage 组件中调用 API,然后从 props 中获取它,而不是从 state 中获取:

        <div>
            {this.state.data?.map((dataSet, index) => (
                return <p>{dataSet.hits}</p>
            ))}
        </div>

或者,如果您想坚持使用以前的代码,则必须这样做:

        <div>
            {this.state.data?.map((dataSet, index) => (
                return <p>{dataSet}</p>
            ))}
        </div>

现在,如果您想将数据获取逻辑分开,那么您必须使用一些状态管理工具(我认为这对您来说是新的),或者使用 localStorage 进行测试,或者您必须坚持使用 Parent子模式,就像在 Data 组件调用中一样 &lt;ResearchPage data={this.state.dataSet} /&gt;(不推荐,只是提一下),或者你可以做一个丑陋的解决方案,即在 App.js 组件中调用数据 API,然后从那里将其传递给组件。

【讨论】:

  • 尝试了解决方案并收到此错误:TypeError: Cannot read property 'data' of null researchPage.render 3 |类 researchPage 扩展组件 { 4 |渲染() { 5 | return (> 6 |
    7 | {this.state.data?.map((dataSet, index) => { 8 | return

    {dataSet}

    9 | })}
  • 能否分享一下researchPage组件的完整代码。从错误看来,状态未正确初始化。我们在数据初始化之前使用数据,因为在 didMount 之前执行渲染。简单的解决方案是检查数据是否存在: {this.state.data && this.state.data?.map((dataSet, index) //其余代码
猜你喜欢
相关资源
最近更新 更多
热门标签