动态可编辑表单项

本文讨论了在业务场景中,为实现用户向指定对象发送私信的功能,比较了三种方式:直接输入、下拉选择和结合datalist的输入选择。方案2和3提供了动态选项,但各有局限性:方案2限制用户只能选择,方案3允许自定义但依赖于后端数据。

遇到的问题:业务需要用户输入对应的username以发送私信给指定对象

方案1-input

输入就完事了

缺陷:要输入,麻烦

<form>
  <label for="recipient-name">发给:</label>
  <input type="text" id="recipient-name">
</form>
方案2-select

thymeleaf模板动态获取后端usernames列表供用户选择

缺陷:只能选择,无法自定义对象

<form>
  <label for="recipient-name">发给:</label>
  <select type="text" id="recipient-name">
    <option th:each="list:${usernames}"
    th:value="${list.username}" th:utext="${list.username}"></option>
    </select>
</form>
方案3-datalist

通过datalist获取和thymeleaf动态获取后端的usernames列表

用户既可以通过input输入username,也可以选择name

<form>
  <label for="recipient-name">发给:</label>
  <input type="text" id="recipient-name" list="usernames"/>
  <datalist id="usernames">
    <option th:each="list:${usernames}"
    th:value="${list.username}" th:utext="${list.username}"></option>
  </datalist>
</form>
  

### 回答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 动态增减单项时,我们可以很容易地实现单项的设置和回显。 首先,我们可以使用 Antd 的 Form 组件来创建单项。在单项的设置方面,我们可以通过调用 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动态增减单项并设置单回显的需求。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

twfplayer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值