ReactJS:状态更改时元素不会更新

时间:2018-08-16 14:36:40

标签: javascript reactjs

我有一个像这样设置的React组件:

export default class FormDialog extends React.Component {
  constructor(){
    super();
    this.state = {allowedToDelete: false};
  }
  onChange(event) {

    if (event.target.value.match(this.targetName)) {
      console.log("It's a match!");
      this.state = {allowedToDelete: true};
      console.log(this.state); 
    } else {
      this.state = {allowedToDelete: false};
    }
  }

  render() {
    const { profile, deleteUser, handleDialogClose, ...other } = this.props;
    this.targetName = `${profile.firstName} ${profile.lastName}`;
    console.log({...other})

    return (
      <Dialog {...other}>
        <DialogTitle id="form-dialog-title">Delete this user?</DialogTitle>
        <DialogContent>
          <DialogContentText>
            allowedToDelete: {String(this.state.allowedToDelete)}
          </DialogContentText>
          <TextField
            autoFocus
            margin="dense"
            id="name"
            label="User's Full Name"
            type="text"
            fullWidth
            onChange={this.onChange.bind(this)}
          />
        </DialogContent>
        <DialogActions>
          <Button variant="outlined" onClick={this.handleDialogClose} color="primary">
            Cancel
          </Button>
          <Button variant="outlined" onClick={this.deleteUser} disabled={!this.state.allowedToDelete} color="primary">
            Delete User! 
          </Button>
        </DialogActions>
      </Dialog>
    );
  }
}

(我在这里使用material-ui的表单对话框组件)。

如上所述,提示用户输入要删除的配置文件的全名;如果名称匹配,则“删除用户!”按钮应变为禁用状态。

我的onChange()事件正在运行,因为当我输入正确的名称时,我在控制台中看到It's a match!,并且this.state的日志显示了this.state.allowedToDelete === true

但是,我的渲染函数allowedToDelete: {String(this.state.allowedToDelete)}和按钮的disabled={!this.state.allowedToDelete}都保留为false

我在这里做错了什么?我是React的新手,我对状态的理解可能很困惑,但是我尝试使用直接附加到this而不是state的变量来执行此操作,但这也不起作用...

1 个答案:

答案 0 :(得分:2)

您需要致电setState。您可以阅读有关in the react docs的信息。这就是告诉react组件触发生命周期以显示新状态的原因。

this.setState({allowedToDelete: false});