代码之家  ›  专栏  ›  技术社区  ›  Craig

基于名称更新状态属性

  •  0
  • Craig  · 技术社区  · 7 年前

    我正在尝试实现一个onchange事件,其中i子组件更新属性,onchange甚至调用一个在状态中更新该属性的父方法。

    使用指向父级中我的onchange事件的属性创建子对象:

    <ChildComponent data={this.state.data} onChange={this.handleStateUpdate} />
    

    我在父母家里更新的数学模型如下:

     handleStateUpdate(property, value) {
            console.log("Client index OnChange event called, " + property, value);
            console.log("Before property update", this.state.data);  
            const stateCopy = {  ...this.state.data };
    
            stateCopy[property] = value;
            console.log("Property updated...", stateCopy);
            // Set the value.
            this.setState({stateCopy}, () => {"New State: ", this.state.data});
    
            console.log("New state: ", this.state)
        }
    

    它接受要作为字符串更新的属性名和新值。

    在子级中,我有一个方法,它只调用props onchange事件,传递要更改的属性名,然后传递值:

    handleNameChange (e)  { this.props.onChange('name', e.target.value); }
    

    在handleStatusUpdate方法上,当我进行更改时,第一条日志行按预期显示属性名和值。

    “新状态”的日志反映了正确的更改。即,我的name属性更新为“value”值。

    但是“新状态”显示了旧值。“setState”似乎没有更新任何内容。此方法是否有任何错误,从而阻止状态按预期进行更新?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Anthony    7 年前

    通过呼叫 this.setState({stateCopy}) ,您正在为 state 打电话 stateCopy ,所以你应该 this.state.stateCopy .这个简短的符号是为了避免变量名与属性匹配时的重复,例如 { someProp: someProp } 变成 { someProp } .你只需要做:

    this.setState({ data: stateCopy });
    
        2
  •  1
  •   Jordan Soltman    7 年前

    React的setState是异步的,因此您仍在获取当前状态。

    由于回调,这将显示正确的值。

    this.setState({stateCopy}, () => {"New State: ", this.state.data});
    

    它在状态改变之前被调用,所以它仍然有旧的值。

    console.log("New state: ", this.state)