最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

useEffect如何通過(guò)form.getFieldValue(‘xxx‘)監(jiān)聽(tīng)Form表單變化

 更新時(shí)間:2024年03月13日 15:56:18   作者:小劉加油!  
這篇文章主要介紹了useEffect如何通過(guò)form.getFieldValue(‘xxx‘)監(jiān)聽(tīng)Form表單變化問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

場(chǎng)景

子組件中,某一個(gè)表格的數(shù)據(jù)需要依賴于上級(jí)組件的某一個(gè)表單元素值進(jìn)行計(jì)算。

毫無(wú)疑問(wèn),首先想到的肯定是監(jiān)聽(tīng) form 表單中元素的值,使用 useEffect 監(jiān)聽(tīng)表單的變化,當(dāng)值發(fā)生變化時(shí),重新計(jì)算渲染。

首先說(shuō)下我的代碼結(jié)構(gòu):

Form 表單是一個(gè)子組件,表格組件也是一個(gè)子組件,且是比較深的子組件(包含在tab標(biāo)簽頁(yè)下)。如果說(shuō) Form子組件是一級(jí)子組件,那么表格組件就是一個(gè)四級(jí)子組件。

在這種多層嵌套下,如何把 form 數(shù)據(jù)傳遞給對(duì)應(yīng)的表格子組件?

毫無(wú)疑問(wèn),選擇使用:useContext

在頂層組件中通過(guò) Form.useForm() 定義 Form 實(shí)例,管理數(shù)據(jù)狀態(tài),通過(guò) <context.Provider value={}></context.Provider>傳遞,表單子組件和表格子組件都可進(jìn)行接收。

不過(guò)在子組件監(jiān)聽(tīng)代碼寫好后,卻發(fā)現(xiàn)了一個(gè)比較尷尬的問(wèn)題:

表單元素的值發(fā)生了改變,但子組件的useEffect 卻沒(méi)能監(jiān)聽(tīng)到。

// 子組件
import React, { useContext } from 'react'
import context from 'xxx/xxx'

const { form } = useContext<any>(context)

useEffect(() => {
	console.log('監(jiān)聽(tīng)到了變化')
	// 下面是具體的邏輯
}, [form.getFiledValue('xx')])

注意:

當(dāng)時(shí)令我困惑的是:

當(dāng) Form 表單組件的某個(gè)表單元素值改變時(shí),雖然子組件 useEffect 沒(méi)有監(jiān)聽(tīng)到變化,但通過(guò)表格子組件的輸入框的 onBlur 事件,調(diào)用 form.getFiledValue('xx'),卻可以拿到最新的值。

分析

需求終歸還是要往下開(kāi)發(fā)的,監(jiān)聽(tīng)不了,那就想辦法監(jiān)聽(tīng)!

在項(xiàng)目中,我是使用了 const [form] = Form.useForm(); 來(lái)創(chuàng)建 Form 實(shí)例,管理表單數(shù)據(jù)狀態(tài),這也是函數(shù)式組件推薦的一種方式。

通過(guò)使用 useForm ,會(huì)讓表單成為 非受控組件,不用通過(guò) useState 創(chuàng)建state 來(lái)維護(hù)數(shù)據(jù)。

而且 ant 官網(wǎng) 里面也說(shuō)了:使用這種方式與其他獲取數(shù)據(jù)的方式的區(qū)別:

Form 僅會(huì)對(duì)變更的 Field 進(jìn)行刷新,從而避免完整的組件刷新可能引發(fā)的性能問(wèn)題,因而無(wú)法在 render 階段通過(guò) form.getFieldsValue 來(lái)實(shí)時(shí)獲取字段值。

看到這里,其實(shí)已經(jīng)很清楚了,因?yàn)?使用了 useForm,導(dǎo)致表單變成了 非受控組件,不能通過(guò) useState 來(lái)創(chuàng)建 state 維護(hù)數(shù)據(jù),只能通過(guò)

form.getFieldsValue() / form.setFieldsValue() 

來(lái)獲取及設(shè)置表單數(shù)據(jù),ant design 官方文檔也有介紹。所以在這種情況下, 使用 useEffect 監(jiān)聽(tīng)不到 form 表單的變化。

換句話說(shuō):

form.getFieldValue('xxx'); 

并不是響應(yīng)式的,由其取到的值,并不會(huì)觸發(fā) UI 更新,即:它不是一個(gè) state。 

不過(guò),可能有人會(huì)問(wèn):我之前也使用過(guò) useEffect 來(lái)監(jiān)聽(tīng) form.getFieldValue(‘xxx’),UI也能正常渲染啊,你這里是不是說(shuō)錯(cuò)了?

答: 沒(méi)有說(shuō)錯(cuò),我自己之前也有這樣的疑問(wèn),也遇到過(guò)這類問(wèn)題。

在實(shí)際項(xiàng)目中,一個(gè) react 組件的 re-render 次數(shù)是不可控的, 特別是代碼寫的不那么規(guī)范的時(shí)候,

所以,當(dāng)看到 UI 更新的時(shí)候,或許是在新的 re-render 中被連帶著更新了;

又或許是項(xiàng)目代碼中 Form組件既使用了 form = {form} 屬性,又使用了 initialValues 屬性。

如下所示:

//
const [form] = Form.useForm();

<Form initialValues={formData} form={form} ref={formRef}> </Form>

解決方案

方案1

ant design @4.20 版本推出了一個(gè)新特性:Form.useWatch,可以直接獲取 form 中字段對(duì)應(yīng)的值,應(yīng)該是可以監(jiān)聽(tīng)到的,具體用法可以參考官網(wǎng),這里不多做贅述。

可是 4.2 版本后才支持,我的項(xiàng)目版本是 4.12.3,暫不支持這個(gè)hooks,部門領(lǐng)導(dǎo)也不讓進(jìn)行 ant 升級(jí),所以就沒(méi)有嘗試這種寫法。

而且使用這種方法,固然可以監(jiān)聽(tīng)到,不過(guò)性能不是太好,不建議使用。

因?yàn)樗鼤?huì)觸發(fā)整個(gè)組件的 re-render,當(dāng)組件比較大且監(jiān)聽(tīng) input 實(shí)時(shí)輸入時(shí),性能消耗就很恐怖。

方案2

拒絕使用 Form.useForm(),使用 initialValues 屬性,是表單變成一個(gè)可控組件,擁有 state,就可以正常監(jiān)聽(tīng)。

不過(guò)對(duì)于我的項(xiàng)目代碼來(lái)說(shuō),改動(dòng)量太大,不劃算。

方案3

使用 useState 額外定義個(gè) state ,當(dāng)表單元素值發(fā)生變化時(shí),使用 setState(),然后將其值通過(guò) context.Provider傳遞,在子組件監(jiān)聽(tīng)。

方案4

使用 useReducer

useReduceruseState 都是用來(lái)存儲(chǔ)和更新 state,相當(dāng)于 useState 的升級(jí)版。

當(dāng) type 數(shù)量較多時(shí),建議使用 useReducer

方案5

Ant Plus 5 的 Watch 組件

專門用于監(jiān)聽(tīng)表單字段變化,并更新局部UI。(沒(méi)嘗試過(guò))

總結(jié)

其實(shí)核心要點(diǎn)就一句話:

Form 內(nèi)置方法,不是響應(yīng)式的(即不是一個(gè)state),由其設(shè)置或者獲取的值,不會(huì)觸發(fā)UI更新,只能對(duì)變更的field進(jìn)行刷新。

想要對(duì)其進(jìn)行監(jiān)聽(tīng)也很簡(jiǎn)單,將其變成一個(gè)state即可。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • React中嵌套組件與被嵌套組件的通信過(guò)程

    React中嵌套組件與被嵌套組件的通信過(guò)程

    這篇文章主要介紹了React中嵌套組件與被嵌套組件的通信過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07
  • React實(shí)現(xiàn)PDF預(yù)覽功能與終極優(yōu)化

    React實(shí)現(xiàn)PDF預(yù)覽功能與終極優(yōu)化

    在前端開(kāi)發(fā)中,PDF 預(yù)覽是個(gè)常見(jiàn)需求,本文主要來(lái)帶大家認(rèn)識(shí)一個(gè)基于 react-pdf 的自定義 PDF 預(yù)覽組件 PDFView,感興趣的小伙伴可以了解下
    2025-05-05
  • 基于Node的React圖片上傳組件實(shí)現(xiàn)實(shí)例代碼

    基于Node的React圖片上傳組件實(shí)現(xiàn)實(shí)例代碼

    本篇文章主要介紹了基于Node的React圖片上傳組件實(shí)現(xiàn)實(shí)例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-05-05
  • React PureComponent中引用類型修改導(dǎo)致頁(yè)面不更新的解決方案

    React PureComponent中引用類型修改導(dǎo)致頁(yè)面不更新的解決方案

    React的PureComponent是React.Component的一個(gè)變體,它通過(guò)淺比較props和state來(lái)自動(dòng)實(shí)現(xiàn)shouldComponentUpdate()方法,從而優(yōu)化性能,本文詳細(xì)解析React PureComponent中引用類型數(shù)據(jù)修改導(dǎo)致頁(yè)面不更新的問(wèn)題,并提供多種解決方案和最佳實(shí)踐,需要的朋友可以參考下
    2025-09-09
  • React?狀態(tài)管理工具優(yōu)劣勢(shì)示例分析

    React?狀態(tài)管理工具優(yōu)劣勢(shì)示例分析

    這篇文章主要為大家介紹了React?狀態(tài)管理工具優(yōu)劣勢(shì)示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 實(shí)現(xiàn)React單頁(yè)應(yīng)用的方法詳解

    實(shí)現(xiàn)React單頁(yè)應(yīng)用的方法詳解

    今天我們來(lái)學(xué)習(xí)React是如何構(gòu)建起一個(gè)單頁(yè)應(yīng)用的,React作為目前最流行的前端框架之一,其受歡迎程度不容小覷,從這門框架上我們可以學(xué)到許多其他前端框架所缺失的東西,也是其創(chuàng)新性所在的地方,比如虛擬DOM、JSX等。下面一起來(lái)看看。
    2016-08-08
  • redux工作原理講解及使用方法

    redux工作原理講解及使用方法

    這篇文章主要介紹了redux工作原理講解及使用方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-11-11
  • react-router-dom?降低版本的兩種方法詳解

    react-router-dom?降低版本的兩種方法詳解

    這篇文章主要介紹了react-router-dom?降低版本的兩種方法,本篇文章就記錄下如何降低 react-router-dom 為 v5 版本的兩種方法,需要的朋友可以參考下
    2022-12-12
  • 實(shí)例講解React 組件生命周期

    實(shí)例講解React 組件生命周期

    這篇文章主要介紹了React 組件生命周期的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 深入理解React虛擬Dom

    深入理解React虛擬Dom

    虛擬DOM是一種輕量級(jí)的JavaScript對(duì)象,用于描述真實(shí)網(wǎng)頁(yè)的DOM結(jié)構(gòu)和屬性,存在于內(nèi)存中,本文就來(lái)詳細(xì)的介紹React虛擬Dom的實(shí)現(xiàn),感興趣的可以了解一下
    2026-01-01

最新評(píng)論

麦盖提县| 龙门县| 珠海市| 固始县| 石嘴山市| 汝城县| 澳门| 皋兰县| 巢湖市| 库尔勒市| 罗城| 黎平县| 甘泉县| 申扎县| 得荣县| 鹤峰县| 禹州市| 江华| 惠水县| 湖北省| 锦屏县| 湄潭县| 茶陵县| 玉屏| 富锦市| 岳池县| 永清县| 潢川县| 日土县| 图片| 唐山市| 博野县| 松潘县| 榆社县| 祁阳县| 永顺县| 星子县| 江永县| 宜章县| 安远县| 旬阳县|