欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

react+antd動(dòng)態(tài)增刪表單方式

 更新時(shí)間:2024年01月03日 09:58:31   作者:趙乘風(fēng)_i  
這篇文章主要介紹了react+antd動(dòng)態(tài)增刪表單方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

最近開發(fā)的一個(gè)功能,和之前寫過(guò)的很像,但畢竟我也快兩年經(jīng)驗(yàn)了,當(dāng)然不能再使用原來(lái)實(shí)現(xiàn)的方法,于是,又搞起來(lái)。

功能

需要對(duì)多個(gè)Input組成的list可以新增和刪除

image

在之前的文章 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入門級(jí)詳細(xì)筆記

    react入門級(jí)詳細(xì)筆記

    這篇文章講述了React的基本介紹,基本使用和React相關(guān)js庫(kù).通過(guò)這篇文章可以入門React的使用,可以快速上手使用React進(jìn)行代碼的編寫
    2021-06-06
  • react 兄弟組件如何調(diào)用對(duì)方的方法示例

    react 兄弟組件如何調(diào)用對(duì)方的方法示例

    這篇文章主要介紹了react 兄弟組件如何調(diào)用對(duì)方的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • React更新渲染原理深入分析

    React更新渲染原理深入分析

    什么是re-render(重新渲染)?哪些是必要的re-render?哪些是非必要的re-render?如果你對(duì)這些問(wèn)題還不是很明白,那么可以在這篇文章中找到答案
    2022-12-12
  • react中的ajax封裝實(shí)例詳解

    react中的ajax封裝實(shí)例詳解

    這篇文章主要介紹了react中的ajax封裝實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • React創(chuàng)建組件的三種方式及其區(qū)別是什么

    React創(chuàng)建組件的三種方式及其區(qū)別是什么

    在React中,創(chuàng)建組件的三種主要方式是函數(shù)式組件、類組件和使用React Hooks的函數(shù)式組件,本文就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下
    2023-08-08
  • react?context優(yōu)化四重奏教程示例

    react?context優(yōu)化四重奏教程示例

    這篇文章主要為大家介紹了react?context優(yōu)化四重奏教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • React ant 點(diǎn)擊導(dǎo)航條閃爍問(wèn)題解決

    React 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
  • React18之狀態(tài)批處理的使用

    React18之狀態(tài)批處理的使用

    本文主要介紹了React18之狀態(tài)批處理的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • React?Context詳解使用方法

    React?Context詳解使用方法

    Context提供了一個(gè)無(wú)需為每層組件手動(dòng)添加props,就能在組件樹間進(jìn)行數(shù)據(jù)傳遞的方法。在一個(gè)典型的?React?應(yīng)用中,數(shù)據(jù)是通過(guò)props屬性自上而下(由父及子)進(jìn)行傳遞的,但這種做法對(duì)于某些類型的屬性而言是極其繁瑣的
    2022-12-12
  • React Hook之使用Effect Hook的方法

    React Hook之使用Effect Hook的方法

    這篇文章主要為大家詳細(xì)介紹了React 使用Effect Hook的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03

最新評(píng)論