当前位置: 首页 > 知识库问答 >
问题:

当父级中的setState()时,子级中的componentWillReceiveProps不接收新的props

洪照
2023-03-14

我在React中有一个名为“app”的父组件,它用HighCharts实现呈现一个“卡路里”子组件。

componentWillReceiveProps: function(){
    const series = this.props.series;

    console.log("component Will Receive Props")
    console.log(this.props);
}

以下是我的完整代码:

const App = React.createClass({
//parent component to render all elements and hold state
    getInitialState(){
        return{
            user: {},
            series: [{
                name: 'Jane',
                data: [1, 0, 4]
             }, {
                name: 'John',
                data: [5, 7, 3]
            }]
        };
    },

    componentDidMount: function(){

      const fb_id = location.pathname.replace("/users/","");

      fetch("https://someurl.com/usersdata/" + fb_id)
        .then(rsp => rsp.json())
        .then(json => {
            if(json.error && json.error.message){
                throw new Error(json.error.message);
            } 
            this.setState({user:json}, ()=>{
                console.log("state updated");
                console.log(this.state);
            });
        });

    },

    render: function(){
        return (
            <div className="container">
                <div clasNames="row">
                    <div className="col-xs-12">
                         {/*Send this.state.user data from fetch to child component*/}
                         <Calories series={this.state.series} user={this.state.user}/>
                    </div>
                </div>
                <div className="row">
                    <div className="col-xs-7">
                        <div className="bottom-left" id="weight-line-chart">
                            <Weight/>
                         </div>
                    </div>
                    <div className="col-xs-5">
                        <div className="bottom-right" id="avg-calories-pie-chart">
                            <AverageCal/>
                        </div>
                    </div>
                </div>
        </div>
        );
    }

});

//Calories Line chart
const Calories = React.createClass({

    componentDidMount: function(){

        const series = this.props.series;

        console.log("component Did Mount");
        console.log(this.props);

        $(function () { 
            const myChart = Highcharts.chart('calories-line-chart', {
            chart: {
                type: 'line'
            },
            title: {
                text: 'Your Calories Over Time'
            },
            xAxis: {
                categories: ['Apples', 'Bananas', 'Oranges']
            },
            yAxis: {
                title: {
                    text: 'Fruit eaten'
                }
            },
            series: series
            });
        });

    },

    componentWillReceiveProps: function(){

        const series = this.props.series;

        console.log("component Will Receive Props")
        console.log(this.props);

        $(function () { 
            const myChart = Highcharts.chart('calories-line-chart', {
            chart: {
                type: 'line'
            },
            title: {
                text: 'Your Calories Over Time'
            },
            xAxis: {
                categories: ['Apples', 'Bananas', 'Oranges']
            },
            yAxis: {
                title: {
                    text: 'Fruit eaten'
                }
            },
            series: series
            });
        });

    },

   render:function(){
       return(
            <div>
                <h3>Calories Intake</h3>
                <div className="top" id="calories-line-chart">

                </div>
           </div>
        );
   }
});

谁能帮我做错了什么?

共有1个答案

段干茂实
2023-03-14

componentwillreceiveprops调用当props更新子组件(父组件内部)的值时,您需要在此Lifecycle方法中作为参数接收新值,如下所示:

componentWillReceiveProps: function(newProps){ //here
    console.log("component Will Receive Props", newProps); //it will log the new values
    ...
}

this.propsinsidecomponentWillReceiveProps将具有以前的值,并且在此Lifecycle方法之后更新。如果在render中执行console.log(this.props),您将看到更新的值。

为什么我们需要接收新值作为参数?

我认为原因是(不确定),每当我们在父组件中执行setstate时都会调用这个方法,不管它是否与子组件相关,所以我们需要在执行子组件中的任何任务之前放一些逻辑(新的道具和旧的道具是否相同),因为this.props将在这个方法中包含旧的值。

有关ComponentWillReceiveProps的更多详细信息,请查看文档。

 类似资料:
  • 问题内容: 我有一个使用Qt Framework的简单程序。它使用QProcess执行RAR并压缩一些文件。在我的程序中,我正在捕获并在发生代码时做一些事情: 当发生时,我检查RAR进程是否完成,如果不是,我将等待它……问题是(我认为)RAR进程也得到了我的程序所需要的,并且在压缩之前退出了所有的文件。 有没有一种方法可以运行RAR进程,以便在程序接收到它时不接收它? 谢谢 问题答案: 如果要在U

  • 问题是要确定子数据的总和是否等于父数据。如果是,返回真,否则返回假。 下面是我的代码,在提交时出现错误。我知道这是一个简单的问题,但在编写了条件之后,我很难通过遍历所有左右节点来递归检查二叉树中每个节点的和条件。 请指导我,因为我哪里做错了。

  • 问题内容: 在子组件的父项上执行setState的推荐模式是什么? 我有一个待办事项数组,保持在父母的状态。我想访问父项的状态,并从的组件中添加新的待办事项。我的想法是在父对象上执行setState,这将呈现新添加的待办事项。 问题答案: 在您的父级中,您可以创建一个类似的函数,该函数将执行所需的setState,然后将该函数作为prop传递给子组件。 您可以在TodoForm的handleCli

  • 我正在使用 VUE JS,我想有一组复选框,如下所示。当有人单击主复选框时,应选中该复选框下的所有复选框。请找到附图供您参考 为了实现这个场景,我使用了两个主要组件。当有人单击某个组件时,我将该组件添加到selectedStreams数组。所选流数组结构类似于下面的结构 当我单击标题复选框时,我正在触发功能 单击全部并尝试更改选定的流[keyv]。 但此操作不会触发子组件,并自动选中该复选框。 我

  • 当使用D3的4时,我在调整下面的代码片段以完全更新一个节点及其所有子节点时遇到了一点麻烦。 null 我相信上面的代码可以保持不变,但我需要做的是为“DragGingNode”添加一些更新,以便它可以正确地更新。 我最初的想法是在将以下代码段添加到“SelectedNode”数组之前简单地将其添加到上面的代码段中: 这很管用!问题是它只在没有子节点的节点上工作。需要更新子节点属性。