如何根据在文本字段“材料用户界面”

时间:2018-10-16 23:17:56

标签: reactjs material-ui

我为找到答案做了很多尝试,但是失败了。请帮助我。

首先,是一个可行的例子

this.state = {
module:'',
description: '',
status: '',
redirectToModule: false,
error: ''
}
-----------------
  handleChange = name => event => {
    this.setState({[name]: event.target.value})
  }

 Render section has        
 <TextField id="name" label="Module Name" className={classes.textField} value={this.state.module} onChange={this.handleChange('module')} margin="normal"/><br/>
      <TextField id="description" type="text" label="Description" className={classes.textField} value={this.state.description} onChange={this.handleChange('description')} margin="normal"/><br/>
      <TextField id="status" type="text" label="Status" className={classes.textField} value={this.state.status} onChange={this.handleChange('status')} margin="normal"/>

以上操作成功。

但是,我需要像这样设置状态对象

this.state = {
  module: {
      module: '',
      description: '',
      status: ''
    },
  redirectToModule: false,
  error: ''
}

我想我应该在onChange = {this.handleChange('')}中提及“ module.status”而不是“ module”

我是否应该更改功能handleChange,类似这样?。

this.setState({module。[name]:event.target.value});

正确的方法是什么...?

请帮助我。我反应很新,但是很快就掌握了很多东西。坦率地说,我仍然是新手。

整个文件如下...没有导入和样式部分

class EditModule extends Component {
  constructor({match}) {
    super();
    // this.state = {
    //       module: '',
    //       description: '',
    //       status: '',
    //       roles:[],
    //   redirectToModule: false,
    //   error: ''
    // }
    this.state = {
      module: {
        module: '',
        description: '',
        status: '',
        roles:[]
      },
      redirectToModule: false,
      error: ''
    }
    this.match = match
  }

  componentDidMount = () => {
    read({
      moduleId: this.match.params.moduleId
    }).then((data) => {
      if (data.error) {
        this.setState({error: data.error});
      } else {
        this.setState({ 
          module: {
            module: data.module, 
            description: data.description,
            status: data.status,
            roles: data.roles
          }
        });
      }
    })
  };

  clickSubmit = () => {
    const module = {
      module: this.state.module || undefined,
      description: this.state.description || undefined,
      status: this.state.status || undefined,
      roles: this.state.roles || undefined
    }
    update({moduleId: this.match.params.moduleId}, module)
      .then((data) => {
        if (data.error) {
          this.setState({error: data.error})
        } else {
          this.setState({'moduleId': data._id, 'redirectToModule': true});
        }
      }
    );
  };

  handleChange = name => event => {
    this.setState( { module: JSON.stringify( { [name]: event.target.value } )  } )
  };

  render() {
    const {classes} = this.props
    if (this.state.redirectToModule) {
      return (<Redirect to={'/module/' + this.state.moduleId}/>)
    }
    return (
      <Card className={classes.card}>
        <CardContent>
          <Typography type="headline" component="h2" className={classes.title}>
            Edit Module
          </Typography>
          <TextField id="name" label="Module Name" className={classes.textField} value={this.state.module.module} onChange={this.handleChange('module')} margin="normal"/><br/>
          <TextField id="description" type="text" label="Description" className={classes.textField} value={this.state.module.description} onChange={this.handleChange('description')} margin="normal"/><br/>
          <TextField id="status" type="text" label="Status" className={classes.textField} value={this.state.module.status} onChange={this.handleChange('status')} margin="normal"/>
          <br/> {
            this.state.error && (<Typography component="p" color="error">
              <Icon color="error" className={classes.error}>error</Icon>
              {this.state.error}
            </Typography>)
          }
        </CardContent>
        <CardActions>
          <Button color="primary" variant="raised" onClick={this.clickSubmit} className={classes.submit}>Submit</Button>
        </CardActions>
      </Card>
    )
  }
}

EditModule.propTypes = {
  classes: PropTypes.object.isRequired
}

export default withStyles(styles)(EditModule)

1 个答案:

答案 0 :(得分:0)

@Avinash

请像这样更改handleChange函数。

handleChange = name => event => {
    this.setState({module[name]: event.target.value})
}