antd 使用form组件 setFieldsValue警告问题
原文警告:
Cannot use setFieldsValue
until you use getFieldDecorator
or getFieldProps
to register it
大概意思就是:
在使用“getFieldDecorator”或“getFieldProps”注册之前,不能使用“setFieldsValue”
官网上的解释是这样的的
注意:使用 getFieldsValue getFieldValue setFieldsValue 等时,应确保对应的 field 已经用 getFieldDecorator 注册过了
看了半天也没看懂 百度了一下,this.props.form.form.setFieldsValue 传值的时候只能是form中用到的参数(即是getFieldDecorator方法中的field)没有的field一律不允许多传,否则就会报错
也就是说我们使用setFildsValue 设置value了值 但没有使用
实际场景
由父级页面传值过来
componentWillReceiveProps = (next) => {
// console.log(next)
// console.log(this.props.Type)
if (this.props.ProductRecipientApply !== next.ProductRecipientApply) {
this.props.form.setFieldsValue({
SaleContractNo: next.ProductRecipientApply.SaleContractNo,
IsLetterAuthorization: next.ProductRecipientApply.IsLetterAuthorization,
AppEndTime: next.ProductRecipientApply.AppEndTime,
InnerOrderNo: next.ProductRecipientApply.InnerOrderNo,
})
}
}
render使用
render() {
const { form: { getFieldDecorator }, Type, ProductRecipientApply, ProductSubmitCommitment, LogList } = this.props;
const { IsInnerSettleCheckbox, BoolArr, isSettle, isSell, CheckboxProductRecipientApply, DateCreated } = this.state;
console.log(ProductRecipientApply)
return (
<Row className="ProjectInformationForm_body">
{Type === "LookAt" || Type === "Approval" ?
<Form layout='inline' className="ShowInfor">
<Col span={6}><Form.Item
label="对外销售">{ProductRecipientApply.IsOutsideSale ? '是' : '否'}</Form.Item></Col>
<Col span={6}><Form.Item
label="销售合同编号">{ProductRecipientApply ? ProductRecipientApply.SaleContractNo : ''}</Form.Item></Col>
<Col span={6}><Form.Item
label="出库时间">{DateCreated ? DateCreated : ''}</Form.Item></Col>
<Col span={6}><Form.Item
label="需要正版授权书">{ProductRecipientApply.IsLetterAuthorization === "1" ? '是' : '否'}</Form.Item></Col>
<Col span={6}><Form.Item
label="内部结算">{ProductRecipientApply.IsInnerSettle ? '是' : '否'}</Form.Item></Col>
<Col span={6}><Form.Item
label="内部订单编号">{ProductRecipientApply ? ProductRecipientApply.InnerOrderNo : ''}</Form.Item></Col>
<Col span={12}>
<Form.Item label="相关附件" >
{
ProductSubmitCommitment && ProductSubmitCommitment.map((value, index) => {
return <a
style={{ marginRight: 10 }}
target="_blank"
key={index}
href={value.DownloadUrl}>{index + 1}、{value.FileName}</a>
})
}
</Form.Item>
</Col>
</Form>
: <Form layout='inline' className="ShowInput">{/* 编辑 */}
<Col span={3}>
<Form.Item label="对外销售">
{getFieldDecorator('IsOutsideSale', { rules: [{ required: false }] })(
<Checkbox checked={CheckboxProductRecipientApply} onChange={(e) => this.CheckboxChangeTwo(e)} />
)}
</Form.Item>
</Col>
<Col span={9}>
<Form.Item label="销售合同编号">
{getFieldDecorator('SaleContractNo', { rules: [{ required: isSell ? true : false }] })(
<Input placeholder="请输入" onChange={(e) => this.SaleContractNo(e)} />
)}
</Form.Item>
</Col>
<Col span={6}>
<Form.Item label="出库时间">
{getFieldDecorator('AppEndTime', { rules: [{ required: false }] })(
<Input disabled />
)}
</Form.Item>
</Col>
<Col span={6}>
<Form.Item label="需要正版授权书">
{getFieldDecorator('IsLetterAuthorization', { rules: [{ required: false }] })(
<Select style={{ color: '#333' }} allowClear placeholder="请选择">
{
!BoolArr ? '' : BoolArr.map((item, index) =>
(<Option key={index} value={item.DictCode}>{item.DictName}</Option>)
)
}
</Select>
)}
</Form.Item>
</Col>
<Col span={3}>
<Form.Item label="内部结算">
{getFieldDecorator('IsInnerSettle', { rules: [{ required: false }] })(
<Checkbox checked={IsInnerSettleCheckbox} onChange={(e) => this.CheckboxChangeOne(e)} />
)}
</Form.Item>
</Col>
<Col span={9}>
<Form.Item label="内部订单编号">
{getFieldDecorator('InnerOrderNo', {
rules: [{ required: isSettle ? true : false }],
})(
<Input placeholder="请输入" onChange={(e) => this.InnerOrderNo(e)} />
)}
</Form.Item>
</Col>
<Col span={24}>
<Form.Item label="相关附件">
{ProductSubmitCommitment ?
(getFieldDecorator('ProductSubmitCommitment', { rules: [{ required: false }] })(
<UploadFile
action={allUrl.common.uploadFile}
cb={this.props.getProductSubmitCommitment}
data={{ BusinessType: 'DPM_ProductSubmitCommitment' }}
fileList={ProductSubmitCommitment}
multiple={true}
disabled={false}
></UploadFile>
)) : ''
}
</Form.Item>
</Col>
</Form>
}
</Row>
)
}
上述代码可知 当Type等于 LookAt时 我们并没有使用到setFieldsValue设置的数据 所有当页面为查看状态时 我们不使用setFieldsValue 设置数据 代码加判断即可
if (this.props.ProductRecipientApply !== next.ProductRecipientApply) {
if (this.props.Type !== "LookAt") { // 设置setFieldsValue 需要使用getFieldDecorator接收
this.props.form.setFieldsValue({
SaleContractNo: next.ProductRecipientApply.SaleContractNo,
IsLetterAuthorization: next.ProductRecipientApply.IsLetterAuthorization,
AppEndTime: next.ProductRecipientApply.AppEndTime,
InnerOrderNo: next.ProductRecipientApply.InnerOrderNo,
})
}
}