Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript React-Redux:映射一个对象数组并从每个对象初始化一个组件_Javascript_Reactjs_Redux_React Redux - Fatal编程技术网

Javascript React-Redux:映射一个对象数组并从每个对象初始化一个组件

Javascript React-Redux:映射一个对象数组并从每个对象初始化一个组件,javascript,reactjs,redux,react-redux,Javascript,Reactjs,Redux,React Redux,我有一个presentational组件,它接受一个{props}对象,并用适当的值填充它自己 我还有一个容器组件,它应该将状态映射到props,获取表示绘图的对象数组,映射它并从每个对象初始化一个 这给我带来了一个错误-Uncaught(in promise)TypeError:无法读取未定义的的属性“name”。讨论中的“名称”是地块的一个属性 查看文档,当我们导入带有花括号的组件时,通常会发生此错误,而我们应该导入不带花括号的组件,但这里的情况并非如此 我有一种感觉,正在发生的事情是,我不

我有一个presentational组件,它接受一个
{props}
对象,并用适当的值填充它自己

我还有一个容器组件,它应该将状态映射到props,获取表示绘图的对象数组,映射它并从每个对象初始化一个

这给我带来了一个错误-
Uncaught(in promise)TypeError:无法读取未定义的
的属性“name”。讨论中的“名称”是地块的一个属性

查看文档,当我们导入带有花括号的组件时,通常会发生此错误,而我们应该导入不带花括号的组件,但这里的情况并非如此

我有一种感觉,正在发生的事情是,我不正确地将道具传递给元素,但不确定正确的方法

Plot.js:

import React from 'react';

const Plot = ({ props }) => {
    return (
        <div className="media col-md-4">
            <div className="media-left">
                <a href="#">
                    <img className="media-object" src="http://placehold.it/200/550" alt="Placehold" />
                </a>
            </div>
            <div className="media-body">
                <h4 className="media-heading">{props.name}</h4>
                <ul>
                    <li><strong>Grower: </strong> {props.grower}</li>
                    <li><strong>Region: </strong> {props.region}</li>
                    <li><strong>Current State: </strong> {props.currentState}</li>
                    <li><strong>Next State: </strong> {props.nextState}</li>
                    <li><strong>Days To Next State: </strong> {props.daysToNext}</li>
                    <br />
                    <span class="pull-right">
                        <i id="like1" class="glyphicon glyphicon-thumbs-up"></i> <div id="like1-bs3"></div>
                        <i id="dislike1" class="glyphicon glyphicon-thumbs-down"></i> <div id="dislike1-bs3"></div>
                    </span>
                </ul>
            </div>
        </div>
    );
};

export default Plot;
我的减速机:

import {AUTH_USER, UNAUTH_USER, AUTH_ERROR, FETCH_MESSAGE, FETCH_PLOTS} from '../actions/types';

export default function(state={}, action){
    switch(action.type){
        case AUTH_USER:
            return{...state, error:'',authenticated:true};
        case UNAUTH_USER:
            return{...state, authenticated:false};
        case AUTH_ERROR:
            return { ...state, error: action.payload };
        case FETCH_MESSAGE:
            return { ...state, message: action.payload }
        case FETCH_PLOTS:
            return { ...state, plots: action.payload }
    }
    return state;

您正在进行ajax调用以获取数据。因此ajax调用需要一些时间来执行。因此,
此.props.plots
将是未定义的。因此,您需要在
仪表板
组件中进行空检查

render() {
    const plots = this.props.plots;
    if(plots === undefined){
        return <div>Loading ...</div>
    }
    return (
        <div>
            <span>{this.props.message}</span>
            <div className='container'>
                    <div className="row">
                        {plots && plots.map((plot) => <Plot key={plot._id} name={plot.name} grower={plot.grower} region={plot.region} currentState={plot.currentState} nextState={plot.nextState} daysToNext={plot.daysToNext}/>)}
                    </div>
            </div>
        </div>
    );
}
render(){
const plots=this.props.plots;
如果(图===未定义){
返回加载。。。
}
返回(
{this.props.message}
{plots&&plots.map((plot)=>)}
);
}
ajax调用完成后,将再次调用render函数,然后遵循else条件,然后它将不会给出所得到的错误


还可以从
componentDidMount()
进行api调用,这样就不会在每次状态更改时调用它。

您正在进行ajax调用以获取数据。因此ajax调用需要一些时间来执行。因此,
此.props.plots
将是未定义的。因此,您需要在
仪表板
组件中进行空检查

render() {
    const plots = this.props.plots;
    if(plots === undefined){
        return <div>Loading ...</div>
    }
    return (
        <div>
            <span>{this.props.message}</span>
            <div className='container'>
                    <div className="row">
                        {plots && plots.map((plot) => <Plot key={plot._id} name={plot.name} grower={plot.grower} region={plot.region} currentState={plot.currentState} nextState={plot.nextState} daysToNext={plot.daysToNext}/>)}
                    </div>
            </div>
        </div>
    );
}
render(){
const plots=this.props.plots;
如果(图===未定义){
返回加载。。。
}
返回(
{this.props.message}
{plots&&plots.map((plot)=>)}
);
}
ajax调用完成后,将再次调用render函数,然后遵循else条件,然后它将不会给出所得到的错误



还可以从
componentDidMount()
进行api调用,这样就不会在每次状态更改时调用它。

const Plot=({props})
更改为
const Plot=(props)

const Plot=({props})更改为
const Plot=(props)

您应该在
componentDidMount()
中执行异步。请检查并让我们知道它是否有用。顺便问一下,您可以粘贴
fetchMessage()
fetchPlots()
snippets@hawk您的意思是我应该在componentDidMount中调用fetchMessage()和fetchPlots()?我已经检查过了,它们的输出都在render()中可用,它们正确地存储在state中,并使用MapStateTrops从state中检索。消息呈现良好。您只需获取一次数据。componentDidMount只调用一次。render被多次调用。@BorisK最有可能的问题是在操作分派中,您可以与共享操作处理程序吗us@BorisK是的,一个平均还原应该在
componentDidMount()
中执行异步。请检查并让我们知道它是否有用。顺便问一下,您可以粘贴
fetchMessage()
fetchPlots()
snippets@hawk您的意思是我应该在componentDidMount中调用fetchMessage()和fetchPlots()?我已经检查过了,它们的输出都在render()中可用,它们正确地存储在state中,并使用MapStateTrops从state中检索。消息呈现良好。您只需获取一次数据。componentDidMount只调用一次。render被多次调用。@BorisK最有可能的问题是在操作分派中,您可以与共享操作处理程序吗us@BorisK是的,一个mean reducer
Uncaught(in promise)TypeError:无法读取未定义的属性“name”
任何文件名或行号,它显示了出错的位置@BorisK@BorisK您能在绘图组件中记录道具并查看其打印内容吗?是的,现在控制台将您发送的道具记录在仪表板组件中,并查看您发送的道具。@ShubhamJain收到了!霍克是对的,这就是我在组件中使用道具的方式
Uncaught(in promise)TypeError:无法读取未定义的属性“name”
任何文件名或行号,它显示了出错的位置@BorisK@BorisK您能在绘图组件中记录道具并查看其打印内容吗?是的,现在控制台将您发送的道具记录在仪表板组件中,并查看您发送的道具。@ShubhamJain收到了!霍克是对的,这就是我在组件中使用道具的方式!很好,成功了!但是为什么呢?实际的区别是什么?@BorisK您试图解构props对象并检索
props。props
{props}
意味着解构@BorisK
const Plot=({name})
这也会很好,成功了!但是为什么呢?实际的区别是什么?@BorisK您试图解构props对象并检索
props。props
{props}
意味着解构@BorisK
const Plot=({name})
这也会起作用
render() {
    const plots = this.props.plots;
    if(plots === undefined){
        return <div>Loading ...</div>
    }
    return (
        <div>
            <span>{this.props.message}</span>
            <div className='container'>
                    <div className="row">
                        {plots && plots.map((plot) => <Plot key={plot._id} name={plot.name} grower={plot.grower} region={plot.region} currentState={plot.currentState} nextState={plot.nextState} daysToNext={plot.daysToNext}/>)}
                    </div>
            </div>
        </div>
    );
}