Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.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功能组件中加载道具似乎花费的时间太长?_Javascript_Arrays_Reactjs_React Hooks_Use Effect - Fatal编程技术网

Javascript 在react功能组件中加载道具似乎花费的时间太长?

Javascript 在react功能组件中加载道具似乎花费的时间太长?,javascript,arrays,reactjs,react-hooks,use-effect,Javascript,Arrays,Reactjs,React Hooks,Use Effect,我有一个功能组件,它包含一些道具。其中一个道具是ID的列表。我使用这些ID从后端服务获取数据。它是一个简单的组件,可以显示每个用户的邮件数量,并利用谷歌图表 export const MessageChart = (props) => { const [chartData, setChartData] = useState([]); const createData = async () => { let obj = {Year_Duration:

我有一个功能组件,它包含一些道具。其中一个道具是ID的列表。我使用这些ID从后端服务获取数据。它是一个简单的组件,可以显示每个用户的邮件数量,并利用谷歌图表

export const MessageChart = (props) => {
    const [chartData, setChartData] = useState([]); 

    const createData = async () => {
        let obj = {Year_Duration: "Messages"};
        let message_data = [];
        let array_data = [];

        for(let i=0;i<props.data.length;i++){
            await api.get('/usermessagestats/'+props.data[i]).then(result => {
                let found_data = result.data[0];
                if(props.name == undefined){
                    if(!(found_data.duration_title in obj)){
                        obj[found_data.duration_title] = found_data.number_of_messages;
                    }else{
                        obj[found_data.duration_title]  = obj[found_data.duration_title] + found_data.number_of_messages;
                    }
                }
                else if (props.name == result.data[0].user){
                    message_data.push(result.data[0]);
                    if(!(found_data.duration_title in obj)){
                        obj[found_data.duration_title] = found_data.number_of_messages;
                    }else{
                        obj[found_data.duration_title]  = obj[found_data.duration_title] + found_data.number_of_messages;
                    }
                }
            });
        }
        Object.entries(obj).map(value => {
            array_data.push(value);
        });
        
        setChartData(array_data);
    }

    useEffect(() => {
        createData();
    }, []);

    return (
        <ChartBox>

            <Chart
                width={'100%'}
                height={'100%'}
                chartType="ColumnChart"
                loader={<CircularProgress />}
                data={chartData}
                options={{
                    legend: { position: 'none' },
                    chart: {
                        title: 'Messages',
                        subtitle: 'Per year',
                    },
                    colors: [colours.chartBars],
                    backgroundColor: colours.box,
                    hAxis: {
                        textStyle: {
                            color: colours.chartText
                          }
                    },
                    vAxis: {
                        textStyle: {
                            color: colours.chartText
                          }
                    }
                }}
            />
            <button onClick={createData}>check if chart works</button>
        </ChartBox>
    )
}
export const MessageChart=(道具)=>{
常量[chartData,setChartData]=useState([]);
const createData=async()=>{
设obj={Year_Duration:“Messages”};
让消息_data=[];
让数组_data=[];
for(设i=0;i{
让found_data=result.data[0];
if(props.name==未定义){
如果(!(在obj中找到数据持续时间标题)){
obj[found_data.duration_title]=消息的found_data.number_;
}否则{
obj[found_data.duration_title]=obj[found_data.duration_title]+found_data.number_消息;
}
}
else if(props.name==result.data[0].user){
消息_data.push(结果数据[0]);
如果(!(在obj中找到数据持续时间标题)){
obj[found_data.duration_title]=消息的found_data.number_;
}否则{
obj[found_data.duration_title]=obj[found_data.duration_title]+found_data.number_消息;
}
}
});
}
Object.entries(obj.map)(值=>{
数组_data.push(值);
});
setChartData(数组_数据);
}
useffect(()=>{
createData();
}, []);
返回(
检查图表是否有效
)
}
带有ID列表的道具称为数据。 我遇到的问题是,当我加载页面并加载我得到的组件时,for循环中出现错误,说它无法读取props.data.length,并且它是未定义的。但是,如果我退出错误并按下按钮测试数据是否显示,它是否工作?因此,数据道具(ID列表)肯定存在,但由于某种原因,在几秒钟之后我才能使用它

现在我是一个React初学者,所以我可能只是使用React错误,但道具似乎需要很长时间才能传递到组件

ChartBoxi只是一个样式化组件,因此可以忽略它。
我使用的是最新版本的React。

您最初在props.data中有哪些内容?看来你需要检查一下是否有我们的道具。数据,然后做所有的功能。。类似于:如果props.data{all thr for loop…}props未作为流传递,则它们在组件的初始化阶段初始化,您可以在useEffect中观察props的更改,并仅在以下情况下运行createData函数(props.data&&props.data.length>0)@RoeiGrinshpan props.data只是一个数组,其中包含ID的数字。我已经检查过了,看看它是否是空的,而且从来都不是。因此,数组的长度必须大于0。那么循环应该运行吗?然而,react告诉我props.data未定义,但如果我等几秒钟,它就可用了,我不知道为什么?@Alopwer非常感谢你的建议,它成功了!你最初的道具数据是什么?看来你需要检查一下是否有我们的道具。数据,然后做所有的功能。。类似于:如果props.data{all thr for loop…}props未作为流传递,则它们在组件的初始化阶段初始化,您可以在useEffect中观察props的更改,并仅在以下情况下运行createData函数(props.data&&props.data.length>0)@RoeiGrinshpan props.data只是一个数组,其中包含ID的数字。我已经检查过了,看看它是否是空的,而且从来都不是。因此,数组的长度必须大于0。那么循环应该运行吗?然而,react告诉我props.data未定义,但如果我等几秒钟,它就可用了,我不知道为什么?@Alopwer非常感谢你的建议,它成功了!