蚂蚁设计表单设置值表单道具

时间:2018-12-10 14:02:49

标签: reactjs redux state antd react-props

我在表单中使用antd设计。

在这里,我正在使用profilereducer方法从减速器shouldComponentUpdate设置值。

class ProfileForm extends Component {

 componentDidMount = () => {
  this.props.actions.getprofile()
 }

 shouldComponentUpdate = (nextProps) => {
  if (this.props.profile) {
   this.props.form.setFieldsValue({
    name: this.props.profile.name,
   });
  } else {
   this.props.form.setFieldsValue({
    firstname: 'loading',
   });
  }
 }


 render() {
  const { getFieldDecorator, getFieldValue } = this.props.form; 
     <Form layout="vertical">
        <FormItem label="First Name" >
            {getFieldDecorator('name', { rules: [{ required: true, message: 'Required!', }], })(
                <Input addonBefore={selectBefore} placeholder="First Name" />
            )}
        </FormItem>
    </Form>    
}


 function mapStateToProps(state) {
  return {
   profile: state.profilereducer.profile,
  }
 }

 function mapDispatchToProps(dispatch) {
  return {
   actions: bindActionCreators(actions, dispatch)
  }
 }

 const Profile = Form.create()(ProfileForm);

 export default connect(mapStateToProps, mapDispatchToProps)(Profile);
}

错误:

enter image description here

2 个答案:

答案 0 :(得分:1)

您正在循环设置状态,因此出现错误。这是一种更好的处理方法。.我只是将selectBefore保留为变量(在您的代码中,我没有找到设置它的方法)。如果遇到错误,请将其更改为字符串。

componentDidMount = () => {
   this.props.actions.getprofile()
  }

  renderBasicform(initialVal) {
    const { getFieldDecorator, getFieldValue } = this.props.form;
    return (
      <Form layout="vertical">
        <FormItem label="First Name" >
          {getFieldDecorator('name', { initialValue: initialVal,rules: [{ required: true, message: 'Required!', }], })(
            <Input addonBefore={selectBefore} placeholder="First Name" />
          )}
        </FormItem>
      </Form>
    );
  }

  render() {
    if(!this.props.profile) {
        return (
          <div>
          {this.renderBasicform("Loading")}
          </div>
        );
    }

        return (
          <div>
            {this.renderBasicform(this.props.profile.name)}
            </div>
        );
  }

答案 1 :(得分:0)

正如函数名称所暗示的那样,shouldComponentUpdate应该返回一个布尔值。如果应该调用render()(通常是默认值),则返回true;否则,返回false。它主要用于优化功能,在某些情况下,开发人员可以跳过重新渲染组件的操作。有关功能,请参见react文档,例如:https://reactjs.org/docs/react-component.html#shouldcomponentupdate

第二,我注意到您为什么还要在profileform之间进行重新映射。像这样直接在组件类内部直接更改或更改属性通常被认为是一种反模式。为什么要尝试将profile数据重新映射到form属性有特定原因吗?构造映射渲染函数并将其传递到那里的<Form>会不会更简单?或者更好的方法是,让化简工具从一开始就映射该数据,而不必具有相似数据但结构不同的属性。