Ant-design: 将值设置为动态表单项时,您不能在注册之前设置字段

创建于 2018-01-09  ·  48评论  ·  资料来源: ant-design/ant-design

版本

3.1.1

环境

MAC 、chrome 63.0.3239.84 (64)、antd 3.1.1

转载链接

https://ant.design/components/form-cn/#components -form-demo-dynamic-form-item

重现步骤

动态表单项设置值,
` const formItems = keys.map((k, index) => {
返回 (
{...formItemLayoutWithOutLabel}
必需={真}
键={k}
>
{getFieldDecorator( minAmount-${k} , {
规则:[{
要求:真实,
message: "请输入大于0的值",
}],
})(

)}

      { (keys.length > 1) ? (
        <Button
        type="danger"
        disabled={keys.length === 1}
        onClick={() => this.remove(k)}
        >删除</Button>
      ) : null}
    </FormItem>
  );
});

Example this.props.form.setFields( { "minAmount-1" : {value : 111} } );

什么是预期?

将值设置为公共字段。

实际发生了什么?

您不能在注册之前设置字段。


编辑行数据并将数据设置为动态表单项时。

Usage

最有用的评论

如果您的表单没有您设置的这些字段,则会出现此错误!

所有48条评论

你好@kerrzhao。 请通过分叉此链接https://u.ant.design/codesandbox-repro 来提供在线复制Need Reproduce将被关闭。

@yesmeck https://codesandbox.io/s/3rxj27q281 这里是代码演示。 预想效果是往动态框里设置默认值。

就像警告说的,你不能在 field 注册前去设置它的值,你在 componentDidMount 里设置 names_2 的值的时候,它还没有被注册。

你好@kerrzhao ,我们使用 GitHub 问题来跟踪错误或讨论 Ant Design 的计划。 所以,请不要在这里Stack OverflowSegment Fault上提问,然后将标签antdreact应用于您的问题。

setFieldsValue这个方法调用的时候,form没有注册,使用setFields试试看 @kerrzhao

同样的问题。 请用英语。

@naefl正如警告所述,您不能在注册字段之前调用setFieldsValue

@naefl尝试使用“setFields”代替

@naefl我们可以改用initialValue并将字段值设置为状态示例: https :

有同样的问题:

偶尔发生,但绝不会是第一次在 React Native 上挂载组件。

奇怪的是, setFieldValues应该只在表单呈现后才能被很好地调用。

class Login extends React.Component {
  componentDidMount() {
    this.getStoredSettings()
  }
  getStoredSettings = async () => {
    const canLogin = await getItem('token')
    if (!canLogin) {
      const creds = await getItem('credentials')
      if (creds) {
        // update values with creds
        const { email, password } = JSON.parse(creds)
        try {
          this.props.form.setFieldsValue({
            email,
            password,
          })
        } catch (error) {
          console.log(error)
        }
      }
    }
  }

  render() {
    const { form, initialValues } = this.props
    const { email, password } = initialValues
    const { getFieldProps } = form
    return (
            <Form>
              <InputItem
                {...getFieldProps('email', {
               initialValue: email,
             })}
              />

              <InputItem
                {...getFieldProps('password', {
               initialValue: password,
             })}
                type='password'
              />
            </Form>          
    )
  }
}

const LoginForm = createForm()(Login)

const mapState = (state) => {
  return {
    initialValues: {
      email: __DEV__ ? DEFAULT_EMAIL : '',
      password: __DEV__ ? DEFAULT_PASSWORD : '',
    },
 }
}

export default connect(mapState)(LoginForm)

@gitdust有效吗?

@fenghuizhang这对我

为什么不这样?
const formData = { name: data.name, title: data.title, desc: data.desc, link: data.link, }; this.props.form.setFieldsValue(formData);
也许是你的领域有一个不在 from

如果您的表单没有您设置的这些字段,则会出现此错误!

我有同样的问题:
您不能在注册之前设置字段。
但是终于找到原因了
谢谢@yanzishang ,你的回答给了我解决问题的很大帮助。

多数是写错label了

如果未设置字段,也会发出警告。
所以,首先设置字段,例如: form.getFieldDecorator('fieldName', { initialValue: {} }) in render(),
然后在你的方法中 setFieldValue 。

对我有用~

我有同样的问题。

我认为这与字段值是像@kerrzhao所说的对象

Example this.props.form.setFields( { "minAmount-1" : {value : 111} } ); .

该字段已设置。 如果我做 fields.hasOwnProperty(myField) 它返回真。

我有同样的问题,原因是,为表单不存在的字段设置一个值

@guixuefeng101跟我一样

错误应该说:
“在呈现与值关联的字段之前,您不能设置字段。”

“注册”听起来像是 Ant 框架内部的问题,对新开发人员没有意义。

@joeheyming您可以发送 PR 来改进该指令。

@afc163任何指向此消息位置的指针? 我找不到

使用 getFieldDecorator 的 initialValue 代替 setFields 或 setFieldsValue

我有类似的问题,但多亏了@gitdust ,您的解决方案完美地解决了我的问题。
我需要动态设置初始值,因为有许多不同初始值的条件。
我放弃了默认的初始值 prop,在渲染方法之前使用 form.setFields 代替。 谢谢!

你可以先设置表格,像这样

{ _.isEmpty(gatherDetail) && this.props.location.state.type === 'edit' ? : 空值 }

表单组件里只有A和B,而你set的对象里多了一个C

如果您的表单没有您设置的这些字段,则会出现此错误!

对我有用,太棒了!

如何忽略此警告?

@kerrzhao我试图将setFieldsValue放入setState之后,警告消失,问题解决;

代码如下:

this.setState({ addOptionsList: newAddOptionsList }, () => { setFieldsValue({ [ modifiedContent${value} ]: '' }); });

如果您的表单没有您设置的这些字段,则会出现此错误!

六六六

试试form.getFieldDecorator('fieldName', { initialValue: your_value })

您应该以v-decorator的形式定义您的字段,例如:

<a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="description" hasFeedback>
    <a-textarea v-decorator="['description']"/>
</a-form-item>

在这种重要的信息中,文档可以更清晰。

如果您的表单没有您设置的这些字段,则会出现此错误!

惊人的

我遇到了同样的问题,因为我的字段名称设置为随机值“astermihagauvlent”,我通过将字段名称更改为“keys”来修复它

initialValue 在第一次渲染后不会改变,就像 defaultValue 一样。 在这种情况下尝试 setFieldValue 或 mapPropsToFields。

例子:
if(this.props.form.getFieldValue('version')){
this.props.form.setFieldsValue({
版本:info.version,
});
}

您设置了一个您没有的字段。 :)

多数是写错label了

真相了

@ShMcK对我

getFieldsValue 即可。

确保字段在setFieldsValue之前注册
```javascript
const { form } = this.props;
if (undefined !== form.getFieldValue('foo')) {
form.setFieldsValue({
foo: '你好世界',
});
}
````

如果您的表单没有您设置的这些字段,则会出现此错误!

谢谢

对我来说,问题是由于我使用一个具有多个字段的对象调用 setFieldsValue 而我的表单只有一个字段。

这是您可以使用的功能

const  dataIWantToFillFormWith = { "test1": "dummy data", "test2": "more dummy data" }

Object.keys(form.getFieldsValue()).forEach(key => {
      const obj = {};
      obj[key] = dataIWantToFillFormWith[key] || null;
       setFieldsValue(obj)

使用该函数,它将忽略表单中不存在的任何字段。

使用 getFieldDecorator 的 initialValue 代替 setFields 或 setFieldsValue

使用 getFieldDecorator 的 initialValue 时,您不能使用 resetFields 重置它

对我来说,问题是由于我使用一个具有多个字段的对象调用 setFieldsValue 而我的表单只有一个字段。

这是您可以使用的功能

const  dataIWantToFillFormWith = { "test1": "dummy data", "test2": "more dummy data" }

Object.keys(form.getFieldsValue()).forEach(key => {
      const obj = {};
      obj[key] = dataIWantToFillFormWith[key] || null;
       setFieldsValue(obj)

使用该函数,它将忽略表单中不存在的任何字段。

这是在宇宙中找到的唯一可以使用 useEffect 钩子的解决方案

如果您的表单没有您设置的这些字段,则会出现此错误!

爱你

对我来说,我有多种形式。 我发现的错误只是由错误的表单实例引起的,这就是为什么我非常确定该字段已被注册,但无法通过setFieldsValue设置值。 真为我难过|_|

此页面是否有帮助?
0 / 5 - 0 等级