代码之家  ›  专栏  ›  技术社区  ›  john doe

反应绑定和填充对象

  •  1
  • john doe  · 技术社区  · 6 年前

    我有一个React组件,它维护本地状态,如下所示:

      this.state = {
          user : {}
        }
    

    我在屏幕上有两个文本框,可以输入姓名和年龄。我从文本框发送值并在状态中填充用户对象,如下所示:

     onTextBoxChange = (e) => {
    
       // this.user is a property on the Component declared inside the // constructor
        this.user[e.target.name] = e.target.value
    
        this.setState({
          user : this.user 
        })
      }
    

    是否有更好的方法用包含名称和年龄的用户对象填充状态。

    3 回复  |  直到 6 年前
        1
  •  2
  •   dance2die    6 年前

    不需要创建额外的变量( let user =... )或成员变量( this.user ).

    只需使用扩展语法覆盖以前的值。

      onTextBoxChange = e => {
        this.setState({
          user: {
            ...this.state.user,
            [e.target.name]: e.target.value
          }
        });
      };
    

    这是CodeSandBox的完整工作版本。
    Edit xjkxnzz34p

        2
  •  2
  •   Radix    6 年前

    您可以通过以下三种不同的方式实现相同的目的:

    1)不需要创建 this.user 属性,而不是通过使用局部变量来实现。因此,功能可以更改为:

    onTextBoxChange = (e) => {
        let user = this.state.user;
        user[e.target.name] = e.target.value;
        this.setState({
            user: this.user 
        })
    }
    

    2)如果你不使用 user 在输入文本框中声明值,然后您可以简单地使用 this.用户 属性而不是使用状态,这将导致重新呈现。 然后你可以使用 this.用户 例如,当表单提交时。

    3)如果你不使用 用户 在值的输入文本框中声明,然后还可以使用 React refs 例如,在表单提交时直接从元素中获取值。

        3
  •  -1
  •   ardev    6 年前

    您可以在父组件中尝试此操作:

    onTextBoxChange = (field, value) => {
            this.setState({user:{
                ...this.state.user,
                [field]: value
            }   
            });
        }
    

    然后在子组件中:

    onNameChange = (e) => {
        this.props.onChange('name', e.target.value)
    }
    onAgeChange = (e) => {
        this.props.onChange('age', e.target.value)
    }