首页 文章

如何在React中更改父级状态?

提问于
浏览
-1

我想写一个包含四列可编辑的小用户列表 .

到目前为止我一切都很好 . 在我的父组件中,我将一个对象添加到我的状态,该状态具有一些虚拟用户数据 . 然后,我通过子组件呈现数据 . 在子元素中,我使用其状态将文本字段更改为输入字段 .

现在我想更改父级的状态,以反映输入字段中所做的更改 .

父组件:

editUser(username, firstName, lastName, email, createdAt, key) {
  this.setState({ // THIS LINE WILL THROW AN ERROR
    users[key]: {
      username: username,
      firstName: firstName,
      lastName: lastName,
      email: email,
      createdAt: createdAt
    }
  }); 
}

render() {
  return (
    <div>
      <table width="100%">
        <thead>
          <tr>
            ...
          </tr>
        </thead>
        <tbody>
          {_.map(this.state.users, (entry, key) => {
            return <UserEntry editUser={this.editUser} username={entry.username} firstName={entry.firstName} lastName={entry.lastName} email={entry.email} createdAt={entry.createdAt} key={key}/>
          })}
        </tbody>
      </table>
    </div>
  );
}

子组件:

isEdit(e) {
  this.setState({ editable: true });
}

changeValue(username, firstName, lastName, email, createdAt, key) {
  this.setState({ editable: false });
  this.props.editUser(username, firstName, lastName, email, createdAt, key);
}

render() {
  const {username, firstName, lastName, email, createdAt} = this.props;
  if (this.state.editable) {
    return (
      <tr>
        <td><input type="text" defaultValue={username}/></td>
        <td><input type="text" defaultValue={firstName}/></td>
        <td><input type="text" defaultValue={lastName}/></td>
        <td><input type="text" defaultValue={email}/></td>
        <td><input type="text" defaultValue={createdAt}/></td>
        <td><button onClick={this.changeValue.bind(this, username, firstName, lastName, email, createdAt, this.props.key)} type="button" value="Ok">Ok</button></td>
      </tr>
    )
  } else {
    return (
      <tr>
        <td>{username}</td>
        <td>{firstName}</td>
        <td>{lastName}</td>
        <td>{email}</td>
        <td>{createdAt}</td>
        <td><input onClick={this.isEdit.bind(this)} type="button" value="Edit"/></td>
      </tr>
    )
  }
}

我的父组件中的editUser方法将引发错误:

未捕获的TypeError:this.setState不是函数

我究竟做错了什么?

2 回答

  • 1

    我看到你使用ES6,你应该在父元素的构造函数中有以下行:

    constructor() {
      this.editUser = this.editUser.bind(this);
    }
    
  • 3

    您必须将 this 绑定到editUser方法 .

    return <UserEntry editUser={this.editUser.bind(this)} ...
    

相关问题