Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在reactJS中“更新”状态?_Javascript_Json_Reactjs_React Jsx - Fatal编程技术网

Javascript 如何在reactJS中“更新”状态?

Javascript 如何在reactJS中“更新”状态?,javascript,json,reactjs,react-jsx,Javascript,Json,Reactjs,React Jsx,我有这个 -Ajax回调: success:function(data) { self.setState({ user: { id_user: data.session.id_user, firstname_user: data.session.firstname_user, lastname_user:

我有这个

-Ajax回调:

        success:function(data) {
            self.setState({
                user: {
                    id_user: data.session.id_user,
                    firstname_user: data.session.firstname_user,
                    lastname_user: data.session.lastname_user,
                    action: "updateUser"
                },
            });
        }
-和手动更改我的输入:

handleChange(){
    this.setState({
        user: {
            firstname_user: this.firstname_user.refs.input.value,
            lastname_user: this.lastname_user.refs.input.value
        }
    });
}
请给出:

 console.log(this.state.user);

 /*
   user
      firstname_user: "Blablabla"
      lastname_user: "Blablabla"
 */
相反,这是: console.logthis.state.user

 /*
    user
      id_user: XX
      firstname_user: "Blablabla"
      lastname_user: "Blablabla"
      action: "updateUser"
 */
激发handleChange时,this.state.user将删除id\u用户和操作键。因此,this.state.user只留下firstname\u user和lastname\u user。为什么?

我没有删除任何密钥,所以我不明白为什么

请问如何解决这个问题

感谢

setStatenextStateObject执行nextStateObject到当前状态的浅层合并,因此在您的情况下,类似state.user的嵌套对象不会被扩展,而是被覆盖。您可以使用Object.assign解决问题:

handleChange(){
    let updatedUser = Object.assign({}, this.state.user, {
            firstname_user: this.firstname_user.refs.input.value,
            lastname_user: this.lastname_user.refs.input.value
        });
    this.setState({
        user: updatedUser
    });
}
请检查setState方法的React。

setStatenextStateObject执行将nextStateObject浅合并到当前状态的操作,以便不会扩展嵌套对象(如state.user),而是覆盖它们。您可以使用Object.assign解决问题:

handleChange(){
    let updatedUser = Object.assign({}, this.state.user, {
            firstname_user: this.firstname_user.refs.input.value,
            lastname_user: this.lastname_user.refs.input.value
        });
    this.setState({
        user: updatedUser
    });
}

请检查设置状态方法的反应。

@AndrewLi是正确的。setState设置对象的状态,而不是更新它。我想你也可以看看这个复制品@纽帕特里克是的,这是一种更好的复制目标的方法。@AndrewLi是对的。setState设置对象的状态,而不是更新它。我想你也可以看看这个复制品@是的,这是一个更好的复制目标的方法。