【问题标题】:setState using spread operator on currentState objectsetState 在 currentState 对象上使用扩展运算符
【发布时间】:2020-10-04 07:15:17
【问题描述】:

我试图理解以下语法:

this.setState(currState => ({
      ...currState,
      user: {
        ...currState.user,
        [name]: value,
      },
    }));

我知道 setState 会通过影响组件的当前状态来更新这个组件的状态,在这种情况下,将 currentState 和 user 对象各自合并为一个新状态。这是否意味着当我添加一个新用户A 然后添加第二个用户B 时,状态对象将同时具有AB 对象作为新状态,即两个user 对象?

class AddUser extends Component {
  state = {
    user: {
      firstName: '',
      lastName: '',
      username: '',
    },
    userExists: false,
  };
  contactExists = currUsername => {};

  handleSubmit = event => {};

  handleInputChange = event => {
    const { name, value } = event.target;
    this.setState(currState => ({
      ...currState,
      user: {
        ...currState.user,
        [name]: value,
      },
    }));
  };
  isDisabled = () => {};

  render() {
    const { firstName, lastName, username } = this.state.user;

    return (
      <div>
        <h1>New User</h1>
        <form onSubmit={this.handleSubmit}>
          <div>
            <input
              type="text"
              name="firstName"
              placeholder="Enter First Name"
              value={firstName}
              onChange={this.handleInputChange}
            />
            <input
              type="text"
              name="lastName"
              placeholder="Enter Last Name"
              value={lastName}
              onChange={this.handleInputChange}
            />
            <input
              type="text"
              name="username"
              placeholder="Enter username"
              value={username}
              onChange={this.handleInputChange}
            />
          </div>
          <button disabled={this.isDisabled()}>Add</button>
        </form>
        {this.state.userExists ? (
          <p className="error">You cannot add a user that already exists.</p>
        ) : (
          ''
        )}
      </div>
    );
  }
} 

【问题讨论】:

  • 你可以试试运行看看会发生什么:)
  • 您将覆盖user 子对象的相应属性。如果您想拥有多个用户,该属性应该是一个此类对象的数组(显然您必须更改您的状态更新代码以匹配)。
  • @ggorlen 我确实在控制台中运行过它,谢谢!但是您是否注意到接受的答案如何帮助我揭示了一些完全让我失望的东西!?无论如何,谢谢!

标签: javascript reactjs ecmascript-6 destructuring


【解决方案1】:

这会更新 state.user 以反映触发事件的输入的更改,使用输入的名称作为属性/键,输入的值作为其值,同时保留其他值。

括号语法 [name] 是 computed property,因此如果输入的名称是“banana”,则相当于设置 { banana: value }

【讨论】:

  • 我是 ES6 语法的新手。非常感谢您解释计算属性。这就是拼图中缺失的部分。我还尝试在控制台中运行测试:var state = { user: { firstName: '', lastName: '', username: '', }, userExists: false, } 并使用:( { ...state, user: { ...state.user, firstName: 'AJ', } } ) 进行测试,这更清楚了!
猜你喜欢
  • 2018-10-04
  • 2017-03-17
  • 1970-01-01
  • 2019-08-10
  • 2020-06-22
  • 2019-09-29
  • 2019-09-11
  • 2018-09-04
  • 1970-01-01
相关资源
最近更新 更多