Reactjs 状态更改不会传播到 dynamically-created children 组件

Reactjs state changes do not propagate to dynamically-created children components

我正在学习 React,在处理一个更大的项目时,我创建了这个模型来展示我遇到的问题。

parent 组件 维护一个状态值,它通过 props 传递给 children。我希望此值 传播到 children 并在 parent 状态下更改时在那里更新。这适用于此代码的第一个版本:

import React from "react"
import Child from './Child'

export default class Parent extends React.Component {
    
    constructor() {
        super();
        this.state = {
            single_val: false,
        }
    }

    render() {

        return(
            <div className="Parent" style={{border: "solid orange 1px", padding: "15px"}}>
                <p>Parent val: {this.state.single_val.toString()}</p>
                <Child parent_val={this.state.single_val}/>
                <Child parent_val={this.state.single_val}/>
                <Child parent_val={this.state.single_val}/>
                <div className="switch" 
                    style={{height: "50px", width: "50px", backgroundColor: "lightPink"}}
                    onClick={(e)=>{this.setState({single_val: true})}}
                >
                </div>
            </div>
        )
    }
}

但是,在项目的最终版本中,我需要动态创建children。我这样做:

import React from "react"
import Child from './Child'

export default class Parent extends React.Component {
    
    constructor() {
        super();
        this.state = {
            single_val: false,
            children_divs: [],
        }
        this.setUp = this.setUp.bind(this);
    }

    componentDidMount() {
        this.setUp();
    }

    setUp() {

        var baseArray = [...Array(3)];
        var children = baseArray.map((elem)=>{
            return (<Child parent_val={this.state.single_val} />)
        });

        this.setState({children_divs: children});
    }

    render() {

        return(
            <div className="Parent" style={{border: "solid orange 1px", padding: "15px"}}>
                <p>Parent val: {this.state.single_val.toString()}</p>
                
                {this.state.children_divs}

                <div className="switch" 
                    style={{height: "50px", width: "50px", backgroundColor: "lightPink"}}
                    onClick={(e)=>{this.setState({single_val: true})}}
                >
                </div>
            </div>
        )
    }
}

...和 ​​ 当我按下按钮并更改 parent 的状态时,该值不再传播到 children:results screenshots.

如何保持 child div 的动态创建并仍然传播 parent 值? 我感觉到这个问题可能是因为值和children div 数组都保持在 parent 状态,但我不确定如何修复它。数小时的搜索和查看示例表明我应该从头开始重新创建 children div - 运行 再次设置 - 但对于我认为无论如何都应该传播的状态值来说,这似乎有点过分了。

Child组件代码供参考:

import React from "react"

export default function Child(props) {
    return (
        <div className="Child">
            <p>Child val: {props.parent_val.toString()}</p>
        </div>
    )
}

P.S。我什至尝试将 componentDidUpdate() 添加到 children 以尝试再次接收道具,但它从未触发。

好的,所以这里的问题是你的 children_divs 创建了一次,single_val 的值当时对他们来说是 added/sent (当你在 setUp 功能。 解决方案很简单,在 render 函数中创建 children,因为每次 state 更改时都会调用 render。这也会将您的 children_divs 从状态中删除,因为它仅用于渲染并且没有其他用途。

import React from "react"
import Child from './Child'

export default class Parent extends React.Component {
    
    constructor() {
        super();
        this.state = {
            single_val: false,
        }
    }

    render() {
        var baseArray = [...Array(3)];
        var children_divs= baseArray.map((elem)=>{
            return (<Child parent_val={this.state.single_val} />)
        });

        return(
            <div className="Parent" style={{border: "solid orange 1px", padding: "15px"}}>
                <p>Parent val: {this.state.single_val.toString()}</p>
                
                {children_divs}

                <div className="switch" 
                    style={{height: "50px", width: "50px", backgroundColor: "lightPink"}}
                    onClick={(e)=>{this.setState({single_val: true})}}
                >
                </div>
            </div>
        )
    }
}