使用antd form开发支持动态增减表单项,可选有初始值组件的一种实现方式(二)

注:该篇为上一篇《使用antd form开发支持动态增减表单项,可选有初始值组件的一种实现方式(一)》的 解释及使用说明。

地址:https://blog.csdn.net/smk108/article/details/84554186

该组件实现了从初始状态添加、有初始值的编辑、并一直支持动态增减表单项的功能,组件解释如下:

  • render时有没有初始值之keys的赋值:
const {getFieldDecorator, getFieldValue} = this.props.form;
const initKeys = getFieldValue('keys');
const InitialKeys = initKeys || this.getInitialKeys();
getFieldDecorator('keys', {'initialValue': InitialKeys});
getInitialKeys(){
    const {tag} = this.props;
    let nextKeys = [];
    for(let i = 0; i < tag.length; i ++){
        nextKeys = nextKeys.concat([this.uuid, this.uuid + 1]);
        this.uuid = this.uuid + 2;
    }
    return nextKeys;
}

组件首次render时,获取到的initKeys为null,此时调用getInitialKeys方法从props的tag中解析应该有的初始keys;如果组件已经render过,则获取到的initKeys不为null,不需要重新赋值;若获取到的initKeys为null,且props传入的tag为空,getInitialKeys获取到[],即赋初值为[]。

  • 编辑时,从props传入了tag,在componentDidMount赋values的初值
componentDidMount(){ // DidMount赋初值
    const {tag, form} = this.props;
    let formTag = [];
    for(let i = 0; i < tag.length; i ++){
        formTag = formTag.concat([tag[i].tagLabel, tag[i].tagValue]);
    }
    form.setFieldsValue({
        'formTag': formTag
    });
}
  • add和remove时重新给keys赋值,见addTag及removeTag方法。
  • 为实现布局,使用了Row, Col及constructor里声明的各种布局方式。
  • 因为antd官网关于form表单有如下声明:

所以在该组件中没有使用componentWillReceiveProps周期更新不同的props,在props更新时需要重新加载该组件,即应该有如下处理:

{showTagComponent ?
    <TagComponent
        tag={tag}
 	ref={ref => (this.tagRef = ref)}
	label='tag'
    /> : ''
}

或者可以尝试Form的mapPropsToFields处理props数据(待验证)。

  • 在使用该组件的组件中实现如下方法:
getTagValues(){
      // Form包裹的组件无法通过ref获取子组件的function,这里直接调用子组件Form获取数据的方法
      let tagValues;
      this.tagRef.validateFields((err, values) => {
          if (!err) {
             tagValues = values;
         }
      });
        return tagValues;
    }

获取该组件的值,值的格式为:

{formTag: ["label1", "value1", "label2", "value2"],keys:  [0, 1, 2, 3]}

然后可以按照需要处理formTag,类似于:

if(tagValues.formTag){
    const {formTag} = tagValues;
    const formTagLength = formTag.length;
    for(let i = 0; i < formTagLength; i += 2){
        if(formTag[i]){
            tag[formTag[i]] = formTag[i + 1];
        }
    }
}

到这里,这个组件的封装及使用就已经实现了。当然,这是按照我在项目中的需求实现的组件,已经证明这种方式可以实现支持动态增减表单项,可选有初始值的功能,使用时需要按照不同的需求进行组件的封装及使用。

随时欢迎找我沟通与交流相关技术。

demo地址:https://blog.csdn.net/smk108/article/details/101784236

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 在ant Design中,我们可以使用Form组件Form.Item组件来创建表单动态增减表单可以通过state来控制表单的数量,然后根据state中的值来渲染对应数量的表单。 首先,我们需要设置一个state来保存表单的数量,可以使用数组来保存每个表单的值,例如: ```javascript state = { formItems: [{ id: 1, value: '' }] }; ``` 然后,我们可以通过map函数来遍历表单的数组,动态生成对应数量的表单: ```javascript const { formItems } = this.state; {formItems.map(item => ( <Form.Item key={item.id}> {getFieldDecorator(`item-${item.id}`, { initialValue: item.value })(<Input />)} </Form.Item> ))} ``` 当需要增加或减少表单的数量时,我们可以通过点击按钮来触发对应的函数,例如增加表单的函数可以这样实现: ```javascript addFormItem = () => { const { formItems } = this.state; const newFormItem = { id: formItems.length + 1, value: '' }; this.setState({ formItems: [...formItems, newFormItem] }); } ``` 删除表单的函数可以这样实现: ```javascript removeFormItem = (id) => { const { formItems } = this.state; const newFormItems = formItems.filter(item => item.id !== id); this.setState({ formItems: newFormItems }); } ``` 在表单提交时,我们可以通过getFieldsValue函数获取到表单的值并进行提交操作: ```javascript handleSubmit = (e) => { e.preventDefault(); const { form, formItems } = this.props; form.validateFields((err, values) => { if (!err) { const formValues = Object.keys(values).reduce((result, key) => { const id = parseInt(key.split('-')[1]); const value = values[key]; const formItem = formItems.find(item => item.id === id); result.push({ id, value }); return result; }, []); console.log(formValues); // 进行提交操作 } }); } ``` 以上就是使用antd实现动态增减表单设置表单回显的方法,通过动态管理state中的表单数组来动态渲染、增减表单,通过getFieldsValue函数获取表单的值并进行提交操作。 ### 回答2: Antd 是一款基于 React 的 UI 组件库,它提供了一系列易于使用和美观的表单组件。在使用 Antd 动态增减表单时,我们可以很容易地实现表单设置和回显。 首先,我们可以使用 AntdForm 组件来创建表单。在表单设置方面,我们可以通过调用 Form 的 getFieldDecorator 方法来设置表单初始值、校验规则和事件处理函数等。 接着,当需要动态增减表单时,我们可以利用 Antd 的 Button 组件来触发增减操作。通过在点击事件中操作表单数据(如数组的 push、splice 等方法),我们可以动态地添加或删除表单。 对于表单的回显,我们可以在表单初始化时将表单设置为从后端获取的数据。这样,当我们动态增减表单后,原有的表单会自动填充之前的值。这个过程可以通过在 Form 组件的 initialValue 属性中设置从后端获取的数据来实现。 当用户提交表单时,我们可以通过调用 Antd 提供的 Form 的方法(如 validateFieldsAndScroll)来验证并获取表单数据。然后,我们可以将表单数据提交到后端进行处理。 总结起来,通过使用 Antd 提供的 Form 组件结合动态增减表单的操作,我们可以很方便地设置和回显表单。同时,借助 Antd 的其他组件和方法,我们还能够实现表单的校验、事件处理和提交等功能。Antd 提供了一整套完善的表单解决方案,可供我们在各种场景中灵活使用。 ### 回答3: antd是一个非常流行的React UI组件库,提供了丰富的表单组件和功能。实现动态增减表单设置表单回显有以下几个步骤: 1. 设置表单初始值:在使用antd表单组件时,可以通过`initialValues`属性设置表单初始值。假设有一个列表数据`list`,每个元素包含字段`name`和`value`,可以将其转化为初始值对象`initialValues`,其中每个字段的值对应表单初始值。 2. 动态增减表单:通过antd提供的`Form.List`组件,可以实现多个表单动态增减。在表单中需要编辑和显示列表数据时,可以使用`map()`方法循环渲染表单,并使用`remove()`方法删除不需要的表单。 3. 表单的读写绑定:在使用`Form.List`组件循环渲染表单时,可以使用`name`属性将每个表单与列表数据的对应字段关联起来,实现读写绑定。这样,当表单的值发生变化时,列表数据的对应字段值也会随之更新。 4. 表单回显:在设置表单初始值的基础上,antd表单组件会自动将初始值回显到表单中,用户可以看到之前已经填写的内容。当删除或添加表单时,表单组件会自动处理表单的重新渲染和回显。 总结:通过设置表单初始值使用`Form.List`组件实现动态增减表单表单的读写绑定以及antd的自动回显功能,可以实现antd动态增减表单设置表单回显的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值