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

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

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

場景

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

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

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

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

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

毫無疑問,選擇使用:useContext

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

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

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

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

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

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

注意:

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

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

分析

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

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

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

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

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

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

form.getFieldsValue() / form.setFieldsValue() 

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

換句話說:

form.getFieldValue('xxx'); 

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

不過,可能有人會問:我之前也使用過 useEffect 來監(jiān)聽 form.getFieldValue(‘xxx’),UI也能正常渲染啊,你這里是不是說錯了?

答: 沒有說錯,我自己之前也有這樣的疑問,也遇到過這類問題。

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

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

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

如下所示:

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

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

解決方案

方案1

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

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

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

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

方案2

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

不過對于我的項目代碼來說,改動量太大,不劃算。

方案3

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

方案4

使用 useReducer

useReduceruseState 都是用來存儲和更新 state,相當(dāng)于 useState 的升級版。

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

方案5

Ant Plus 5 的 Watch 組件

專門用于監(jiān)聽表單字段變化,并更新局部UI。(沒嘗試過)

總結(jié)

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

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

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

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

相關(guān)文章

  • React中嵌套組件與被嵌套組件的通信過程

    React中嵌套組件與被嵌套組件的通信過程

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

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

    在前端開發(fā)中,PDF 預(yù)覽是個常見需求,本文主要來帶大家認(rèn)識一個基于 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í)用價值,需要的朋友可以參考下
    2017-05-05
  • React PureComponent中引用類型修改導(dǎo)致頁面不更新的解決方案

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

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

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

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

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

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

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

    這篇文章主要介紹了redux工作原理講解及使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    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是一種輕量級的JavaScript對象,用于描述真實(shí)網(wǎng)頁的DOM結(jié)構(gòu)和屬性,存在于內(nèi)存中,本文就來詳細(xì)的介紹React虛擬Dom的實(shí)現(xiàn),感興趣的可以了解一下
    2026-01-01

最新評論

云梦县| 南平市| 新乡市| 惠安县| 邵阳市| 曲沃县| 宁都县| 古田县| 罗城| 岳池县| 志丹县| 石嘴山市| 炎陵县| 秦皇岛市| 高阳县| 疏附县| 辽阳市| 读书| 武威市| 淮南市| 上饶县| 六枝特区| 方城县| 田阳县| 璧山县| 慈利县| 乐山市| 绩溪县| 台湾省| 陕西省| 盐池县| 东丽区| 广宁县| 高要市| 伊金霍洛旗| 徐汇区| 荥经县| 和平区| 泰和县| 屏山县| 故城县|