我在 React 中使用 Redux 和类组件。Redux 存储中有以下两种状态。
{ spinner: false, refresh: false }
在父组件中,我有一个调度函数来改变这个状态。
class App extends React.Component { reloadHandler = () => { console.log("[App] reloadComponent"); this.props.onShowSpinner(); this.props.onRefresh(); }; render() { return <Child reloadApp={this.reloadHandler} />; } }
在子组件中,我尝试像下面一样重新加载父组件。
class Child extends React.Component { static getDerivedStateFromProps(props, state) { if (somecondition) { // doing some redux store update props.reloadApp(); } } render() { return <button />; } }
我收到如下错误。
警告:无法从不同组件的函数体内更新组件。
如何消除此警告?我在这里做错了什么?
您看到的警告是因为您尝试从另一个组件 ( ) 的静态方法App中更新组件 ( )。这不是正确的方法,因为静态方法是用于根据 props 的变化更新组件的状态,而不是用于触发影响其他组件的操作。getDerivedStateFromProps``Child``getDerivedStateFromProps
App
getDerivedStateFromProps``Child``getDerivedStateFromProps
App相反,您应该在方法之外处理触发父组件 ( ) 重新加载的逻辑getDerivedStateFromProps。您可以通过在方法中或从事件处理程序中直接调用reloadApp从父组件 ( ) 传递下来的函数来执行此操作。App``render
相反,您应该在方法之外处理触发父组件 ( ) 重新加载的逻辑
。您可以通过在方法中或从事件处理程序中直接调用
从父组件 ( ) 传递下来的函数来执行此操作。
重构代码的方法如下:
class App extends React.Component { reloadHandler = () => { console.log("[App] reloadComponent"); this.props.onShowSpinner(); this.props.onRefresh(); }; render() { return <Child reloadApp={this.reloadHandler} />; } } class Child extends React.Component { componentDidMount() { // Check some condition and trigger the reload if needed if (somecondition) { this.props.reloadApp(); } } render() { return <button />; } }
在此示例中:
reloadHandler
Child
componentDidMount
reloadHandler通过直接从组件的生命周期方法中调用该函数Child,您可以避免有关从不同组件的函数体中更新组件的警告。