react+antd動(dòng)態(tài)增刪表單方式
最近開發(fā)的一個(gè)功能,和之前寫過(guò)的很像,但畢竟我也快兩年經(jīng)驗(yàn)了,當(dāng)然不能再使用原來(lái)實(shí)現(xiàn)的方法,于是,又搞起來(lái)。
功能
需要對(duì)多個(gè)Input組成的list可以新增和刪除
在之前的文章 react 涉及的增加,刪除list ,我說(shuō)不可以使用 index
來(lái)做刪除,就使用了 給每個(gè) list 添加 selfId
的方式來(lái)實(shí)現(xiàn)刪除。
然而事實(shí)是可以使用 index 來(lái)進(jìn)行刪除操作的。
當(dāng)年我才疏學(xué)淺,沒有g(shù)et到高級(jí)玩法,使用selfId
這樣的實(shí)現(xiàn),無(wú)疑就是對(duì)數(shù)據(jù)過(guò)度操作了,所以學(xué)習(xí)了新的使用方法,實(shí)現(xiàn)如下:
技術(shù)棧: react hooks + antd Form
實(shí)現(xiàn)原理
其實(shí)新增還是不變的,在list后新增一個(gè)空對(duì)象,讓其多一條數(shù)據(jù),再重新渲染。
刪除有所改變,首先,form 表單的 key, 學(xué)習(xí)官方的demo,經(jīng)過(guò)一番改良,
使用 data.0.name1 這樣的格式作為 某個(gè)表單的 key, 那么根據(jù)form的機(jī)制,會(huì)自動(dòng)產(chǎn)生
data: [{name1: 'xx'}]
這樣的數(shù)據(jù)格式,所以剛好也不用我們?cè)俅翁幚砹恕?/p>
然后說(shuō)回刪除
// 獲取當(dāng)前的所有表單值 const lists = getFieldValue(formTitle); // 刪除后替換 for (let index in lists) { const nIndex = Number(index); if (nIndex >= i && lists[nIndex + 1]) { formData.map(item => setFieldsValue({[`${formTitle}.${nIndex}.${item}`]: lists[nIndex + 1][item]})); } } // 刪除數(shù)組數(shù)據(jù) setDetail([...detail.slice(0, i), ...detail.slice(i, detail.length - 1)]);
再來(lái)詳細(xì)說(shuō)一下:
1、獲取當(dāng)前的所有表單值,是為了等會(huì)執(zhí)行表單替換
2、循環(huán)這個(gè)表單list值,再找出刪除的這個(gè)index,然后把后面的表單重新賦值,往前移動(dòng)一個(gè)
3、刪除一個(gè)數(shù)組的長(zhǎng)度
整體實(shí)現(xiàn)
import React, { Fragment } from 'react'; import { Form, Input, Radio, Icon, message, Button } from 'antd'; const { TextArea } = Input; const formItemLayout = { labelCol: { span: 5 }, wrapperCol: { span: 16 }, }; const FormItemList = (props) => { const { form } = props; const { getFieldDecorator, getFieldValue, setFieldsValue } = form; const [detail, setDetail] = React.useState([]); const formData = ['name1', 'name2', 'name3', 'name4']; const formTitle = 'data'; React.useEffect(() => { setDetail(data) }, []); const deleteOne = (i) => { const lists = getFieldValue(formTitle); for (let index in lists) { const nIndex = Number(index); if (nIndex >= i && lists[nIndex + 1]) { formData.map(item => setFieldsValue({[`${formTitle}.${nIndex}.${item}`]: lists[nIndex + 1][item]})); } } setDetail([...detail.slice(0, i), ...detail.slice(i, detail.length - 1)]); } const newItem = () => { setDetail([...detail, {}]); }; return ( <Fragment> {detail.map((item, index) => ( <div style={{ background: '#eee', position: 'relative', marginBottom: 10 }}> <div key={item.key}> <Form.Item label="字段名稱1" {...formItemLayout}> {getFieldDecorator(`${formTitle}.${index}.${formData[0]}`, { rules: [{ required: true, message: '請(qǐng)?zhí)顚?}], initialValue: item[formData[0]], })(<Input maxLength={8} placeholder="請(qǐng)?zhí)顚? />)} </Form.Item> <Form.Item label="字段名稱2" {...formItemLayout}> {getFieldDecorator(`${formTitle}.${index}.${formData[1]}`, { rules: [{ required: true, message: '請(qǐng)?zhí)顚?}], initialValue: item[formData[1]], })(<Input maxLength={8} placeholder="請(qǐng)?zhí)顚? />)} </Form.Item> <Form.Item label="字段名稱3" {...formItemLayout}> {getFieldDecorator(`${formTitle}.${index}.${formData[2]}`, { rules: [{ required: true, message: '請(qǐng)選擇'}], initialValue: item[formData[2]], })(<Input maxLength={8} placeholder="請(qǐng)?zhí)顚? />)} </Form.Item> <Form.Item label="字段名稱4" {...formItemLayout}> {getFieldDecorator(`${formTitle}.${index}.${formData[3]}`, { initialValue: item[formData[3]], })(<Input maxLength={8} placeholder="請(qǐng)?zhí)顚? />)} </Form.Item> </div> {detail && detail.length > 1 && <div style={{ position: 'absolute', top: 5, right: 5, fontSize: 20, }}> <Icon type="close" onClick={() => deleteOne(index)}/> </div> } </div> ))} {detail && detail.length < 5 && <Button style={{ width: '100%', marginTop: 8 }} type="dashed" icon="plus" onClick={newItem} >添加</Button>} </Fragment> ); }; export default Form.create()(FormItemList);
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
react 兄弟組件如何調(diào)用對(duì)方的方法示例
這篇文章主要介紹了react 兄弟組件如何調(diào)用對(duì)方的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-10-10React創(chuàng)建組件的三種方式及其區(qū)別是什么
在React中,創(chuàng)建組件的三種主要方式是函數(shù)式組件、類組件和使用React Hooks的函數(shù)式組件,本文就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下2023-08-08React ant 點(diǎn)擊導(dǎo)航條閃爍問(wèn)題解決
很多小伙伴反饋React ant 點(diǎn)擊導(dǎo)航條閃爍,沒有傳遞具體的參數(shù)給點(diǎn)擊事件 , 導(dǎo)致在函數(shù)內(nèi)部無(wú)法準(zhǔn)確判斷要展示哪個(gè)子菜單,可能導(dǎo)致頁(yè)面狀態(tài)的短暫變化,出現(xiàn)閃爍效果,下面給大家分享解決方法,感興趣的的朋友跟隨小編一起看看吧2024-04-04