为啥状态对象的名称不需要与setState中的名称匹配?

Posted

技术标签:

【中文标题】为啥状态对象的名称不需要与setState中的名称匹配?【英文标题】:Why does the name of the state object not need to match the name in setState?为什么状态对象的名称不需要与setState中的名称匹配? 【发布时间】:2018-07-05 10:20:25 【问题描述】:

在下面的代码中,您会看到我异想天开地将 this.state 对象命名为“gladys”。在 handleSubmit 函数中,const 结果返回了一个值,但我在这里将对象的名称设置为更符合逻辑的“错误消息”。为什么这行得通?为什么 this.state 中定义了初始状态的对象的名称不必与 this.setState 更新的对象的名称匹配? (以防万一,handleAddOption 对 optionfield 值运行验证,如果 newoption 等于空字符串或已经存在,则返回错误消息。)

class AddOption extends React.Component 
constructor(props)
    super(props);
    this.handleSubmit = this.handleSubmit.bind(this);
    this.state = 
        gladys: undefined
    

handleSubmit(e) 
    e.preventDefault();
    const newoption = e.target.elements.optionfield.value.trim();
    const result = this.props.handleAddOptions(newoption);
    e.target.elements.optionfield.value = '';

    this.setState((prevState) => ( 
        errormessage: result
    ));

render () 
    return (
        <div>
        this.state.errormessage && <p>this.state.errormessage</p>
        <form onSubmit=this.handleSubmit>
        <input type='text' name='optionfield'/>
        <button>Add an Option</button>
        </form>
        </div>
    );

【问题讨论】:

【参考方案1】:

因为它起作用了

this.state = 
    gladys: undefined

还有这个

this.state = 
    gladys: undefined,
    errormessage: undefined

javascript 中是相等的。

所以当你这样做时

this.setState( errormessage: result )

React 只是替换

errormessage: undefined

errormessage: result

您还应该注意,gladys 不是状态的名称,而是状态的属性。

一个组件的状态可以包含多个属性,例如gladyserrormessage

【讨论】:

谢谢,GG。这有帮助。【参考方案2】:

这是可能的,因为setState 将返回的对象与状态对象浅合并,这种行为允许对状态进行部分更新,例如您的示例中的那个。

// Let's say that the current state looks like this
this.state =  someProp: 'someValue', anotherProp: 'anotherValue' ;

// Calling set state like this
this.setState((prevState) => ( 
    errormessage: 'result'
));

// Means that you are merging the prevState, shown above, into a new
// State object wich will contain the errormessage prop
this.state =  
    someProp: 'someValue', 
    anotherProp: 'anotherValue',
    errormessage: 'result',
;

这里是关于setStateofficial documentation的链接

【讨论】:

TY,朱利安。现在我明白了。干杯!

以上是关于为啥状态对象的名称不需要与setState中的名称匹配?的主要内容,如果未能解决你的问题,请参考以下文章

ES6/React:为啥我的三重嵌套 setState 更新不起作用?

Flutter:状态类:为啥不在 setState 方法调用之前改变状态变量,而不是在 setState 方法中

React 的 setState(),嵌套结构的数据变异,为啥不直接修改状态呢?

更新状态 - 为啥在调用 setState 时创建新的状态副本?

为啥 setState() 在我的情况下不能在 React 中工作?

如果我使用参数相同的参考对象操作 setState,为啥要重新渲染..?