antd + select 默认选中问题?

新手上路,请多包涵

题目描述

react + antd select 默认选中问题

题目来源及自己的思路

我是通过 const { getFieldDecorator } = this.props.form;来设置他们的默认值的,并通过action监听select的变化,但是数据拿过来后,并不是我想要的数据格式,是这样的observerObject。我只有通过JSON.stringify来转化,然后在通过JSON.parse转化回去。现在我想用antd里面的select里面的labelInValue来设置。

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)
@observer
class RelativelyStrongIndexForm extends Component {
componentWillMount() {

this.store = this.props.store;                      // 让代码写得短些
this.store.fetchSelectOptions();                    // 取菜单数据

}

handleSubmit = (e) => {

e.preventDefault();
this.props.form.validateFields((err, values) => {
  if (!err) {
    const params = {
      assetName: JSON.parse(values.assetType).name,
      benchmarkName:JSON.parse(values.benchmarkType).name,
      assetType: JSON.parse(values.assetType).index,
      benchmarkType: JSON.parse(values.benchmarkType).index,
      beginDate: values.beginDate.format('YYYYMMDD'),
      endDate: values.endDate.format('YYYYMMDD'),
      interval: values.interval,
      method: JSON.parse(values.method).index
    };
    this.store.fetchChartData(params);
  }
});

};

render() {

const { store: {
  setShowExponential, setShowRelative, setShowExcess,setShowSouthChina,setShowTreasury,
  setShowDeviation, setShowCriteria,
  curStockOptions, curBondOptions, curRoeTypeOptions,
  defaultBeginDate, defaultEndDate, defaultInterval
} } = this.props;
const { getFieldDecorator } = this.props.form;
// TODO: 本来 「指数名称」、「基准指数」两个字段不用提交,不用使用getFieldDecorator,
//       但目前defaultValue不知道为什么不生效,只好继续用getFieldDecorator里的initialValue
return (
  <Form className={styles.form} onSubmit={this.handleSubmit} hideRequiredMark>
    <div className="form-body">
      <FormItem label="指数名称" className="form-item flex-form-item">
        {getFieldDecorator('assetType', {
          initialValue: curStockOptions.length > 0 ? JSON.stringify(curStockOptions[0]) : undefined,
          
        })(
          <Select size="small" >
            {curStockOptions.map(m => (<Option key={m.name} value={JSON.stringify(m)}>{m.name}</Option>))}
          </Select>
        )}
      </FormItem>
      <FormItem label="基准指数" className="form-item flex-form-item">
        {getFieldDecorator('benchmarkType', {
          initialValue: curBondOptions.length > 0 ? JSON.stringify(curBondOptions[0]) : undefined,
          rules: [{ required: true, message: '必填' }],
        })(
          <Select size="small" >
            {curBondOptions.map(i => (<Option key={i.name} value={JSON.stringify(i)}>{i.name}</Option>))}
          </Select>
        )}
      </FormItem> 
      <FormItem label="相对强弱算法" className="form-item flex-form-item">
        {getFieldDecorator('method', {
          initialValue: curRoeTypeOptions.length > 0 ?JSON.stringify(curRoeTypeOptions[0]) : undefined,
          rules: [{ required: true, message: '必填' }],
        })(
          <Select size="small" >
            {curRoeTypeOptions.map(i => (<Option key={i.name} value={JSON.stringify(i)}>{i.name}</Option>))}
          </Select>
        )}
      </FormItem> 
      
      <FormItem label="开始日期" className="form-item flex-form-item">
        {
          getFieldDecorator('beginDate', {
            initialValue: defaultBeginDate,
            rules: [{ required: true, message: '必填' }],
          })(
            <DatePicker size="small" allowClear={false} />
          )
        }
      </FormItem>
      <FormItem label="结束日期" className="form-item flex-form-item">
        {
          getFieldDecorator('endDate', {
            initialValue: defaultEndDate,
            rules: [{ required: true, message: '必填' }],
          })(
            <DatePicker size="small" allowClear={false} />
          )
        }
      </FormItem>
      <FormItem label="超额收益周期" className="form-item flex-form-item">
        {
          getFieldDecorator('interval', {
            initialValue: defaultInterval,
            rules: [{ required: true, message: '必填' }],
          })(
            <Input addonAfter="交易日" type="number" size="small" />
          )
        }
      </FormItem>
      
      <Form.Item className="checkbox-form-item">
        <Checkbox
          defaultChecked={true}
          onChange={(e) => { setShowExponential(e.target.checked); }}
        >
          显示指数走势
        </Checkbox>
      </Form.Item>
      <Form.Item className="checkbox-form-item">
        <Checkbox
          defaultChecked={true}
          onChange={(e) => { setShowRelative(e.target.checked),setShowDeviation(e.target.checked); }}
        >
          显示相对强弱
        </Checkbox>
      </Form.Item>
      <Form.Item className="checkbox-form-item">
        <Checkbox
          defaultChecked={true}
          className="extraYield"
          onChange={(e) => { setShowExcess(e.target.checked),setShowCriteria(e.target.checked); }}
        >
          显示超额收益
        </Checkbox>
      </Form.Item>
      <Form.Item className="checkbox-form-item">
        <Checkbox
          defaultChecked={true}
          className="industry"
          onChange={(e) => { setShowSouthChina(e.target.checked),setShowCriteria(e.target.checked); }}
        >
          显示南华工业 
        </Checkbox>
      </Form.Item>
      <Form.Item className="checkbox-form-item">
        <Checkbox
          defaultChecked={true}
          className="stateDebt"
          onChange={(e) => { setShowTreasury(e.target.checked),setShowCriteria(e.target.checked);}}
        >
          显示国开债10年 
        </Checkbox>
      </Form.Item>
    </div>
    <div className="form-btn-wrapper">
      <Button type="primary" className="btn-ok" htmlType="submit">提交</Button>
    </div>
  </Form>
);

}
}

你期待的结果是什么?实际看到的错误信息又是什么?

希望大神贴上代码,我自己写的错误信息是getFieldDecorator和defaultValue不能同时使用,推荐我使用position.initalValue我试了一下还是不行。

阅读 13.9k
1 个回答

你设置的initialValue是组件的默认值。只设置initialValue时,这个Select组件是一个非受控组件。initialValue的值只在初始化的第一次渲染时才会生效。所以你的initialValue的只变化了,组件的值并没有改变。
解决办法。在改变initialValue值之后。手动让这个Select组件重新渲染一次。比如更改这个组件的Key值。或者让这个组件消失之后重新渲染。也可以将组件改为受控组件。即不使用initialValue指定初始值,而是使用value强制指定组件的值

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题