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

在ReactJS中从父状态更新子道具

毛博
2023-03-14

我试图了解如何构建具有不同"页面"或"视图"的ReactJS应用程序。

我将以下组件作为我的基础应用程序,并且我正在React状态中使用currentState属性在视图中的活动组件之间切换。

class App extends React.Component {

    constructor(props) {
        super(props);
        this.state = {currentState: 'Loading', recipes: []};
        this.appStates = {
            'Loading': <Loading/>,
            'Home': <RecipeList recipes={this.state.recipes}/>
        }
    }

    dataLoaded(data) {
        this.setState({
            recipes: data,
            currentState: 'Home'
        });
    }

    componentDidMount() {

        // AJAX Code that retrieves recipes from server and then calls dataLoaded
    }

    render() {
        return this.appStates[this.state.currentState];
    }
}

它执行此任务,但在启动dataLoaded回调时,组件从不接收更新的recipes数组。

如何根据应用程序中的更新状态更新道具?

还是我处理这整件事的方式错了?

共有3个答案

韦寒
2023-03-14

我建议将构造函数中的所有组件代码推送到render函数内部。react的美妙之处在于,您可以以极低的成本完全重新渲染所有内容。React将努力比较DOM中的差异,只重新呈现最小的差异。

马绪
2023-03-14

构造函数方法仅在组件挂载时执行,此时recipes为空,并将该空数组传递给AppState。从本质上讲,应用程序状态永远不会改变。

许鸿志
2023-03-14

我认为你的观点并不是真正的反应,你至少有几个概念可以改进。

首先,我肯定会使用react-router来实现任何复杂的页面/组件之间的导航React.js.实现它自己是更复杂和容易出错。

其次,我认为您几乎不应该直接将内容存储在上下文this中。基本上是因为它会导致像您这样的错误:没有意识到appStates根本没有改变。React的状态是存储应用程序状态的一个很好的工具(有时必须用其他工具(如Redux)替换/补充)。

在将组件中应该呈现的内容存储在状态中的情况下,您可能应该使用构造函数中初始化的状态中的简单标志来补充react router功能,这些标志允许您知道在呈现函数中应该返回什么。

下面的示例演示了如何通过使用just React的状态,告诉组件在加载和加载之间动态更改其视图。当然,您可以在componentDidMount中调用AJAX并更改状态以在加载完成时停止加载,而不是使用按钮,从而重新创建一个非常类似的行为。

class App extends React.Component {

    constructor(props) {
        super(props);
        this.state = {loading: true};
        this.stopLoading = this.stopLoading.bind(this);
    }

    stopLoading() {
        this.setState({
           loading: false,
        });
    }

    render() {
        let view=<div><h1>loading</h1><button onClick={this.stopLoading}>FINISH</button></div>;
        if(!this.state.loading){
          view=<h1>loaded</h1>;
        }
        return <div>{view}</div>;
    }
}

ReactDOM.render(
  <App />,
  document.getElementById('container')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="container"></div>
 类似资料:
  • 我刚刚开始使用ReactJs开发,并一直遵循serverless-stack.com教程。我已经准备好扩展应用程序并创建一个模板,带有n个子组件,但是在管理孙子组件之间的用户会话时遇到了麻烦。 我有管理用户会话的App.js。但是我在孙子组件中有我的注销按钮,我无法让它调用App.js signOut()函数。 App.js 我的布局组件有一系列不同的组件,如页眉、页脚、导航等。。 最后,我的Na

  • 我正在将父组件的状态从父组件传递到子组件。在子组件中,我有一个不同的状态。我正在对子组件的状态执行一些操作,并且结果必须添加到父组件的状态。因此,在我的父组件中,我编写了一个回调函数,该函数将更新父组件的状态。代码为: 因此,这个函数随后作为道具传递给子组件: 然后在我的子组件中,我试图实现回调函数为: 但这并没有达到预期效果。这是正确的方法吗?有人能帮我吗? 我试图通过实现这里提供的解决方案来解

  • 在父组件中: 我有一个布尔状态: 我将其发送到子组件: 根据布尔值,我希望它呈现不同的组件。

  • 我是reactjs的新手,我不知道如何从父组件中更改子组件的状态。下面是代码 每当对父组件中的执行时,我希望子组件接收。 有什么建议吗?

  • 我正在学习如何应对,我整天都在试图找到解决问题的办法,但都没有成功。然后决定在这里提出我的第一个问题。 我有子组件,包括React-Datepicker组件和单独的“第二天”和“前一天”按钮来更改选定的日期。 SelectedDate存储在父组件的状态中。 我试图从子组件更新父组件的状态,当状态更新时,子组件应该重新呈现,因为该状态作为道具传递给同一个子组件。 我已设法从child更改父状态,但子

  • 我是新来的反应。我被困在这件事上,真的很感激你的帮助! 父组件将把一个数组传递到这个子组件中。当我console.log(this.props.repairs)时,它显示了一个4的数组。每当传入修复数组时,我都试图更新this.state.SortedDataList。console.log(this.state)仍然将sortedDataList显示为空数组。 我做错了什么?非常感谢,谢谢你的帮