国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

React 使用 useRef() 獲取循環(huán)中所有子組件實例

這篇具有很好參考價值的文章主要介紹了React 使用 useRef() 獲取循環(huán)中所有子組件實例。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

背景

之前項目中使用了antd pro 中的 可編輯表格 (EditableProTable),在頁面中表格要經(jīng)過多層遍歷后組成的新頁面,所以我將之抽成了一個公用的組件,另外在遍歷的最外層需要通過一個按鈕統(tǒng)一提交表格數(shù)據(jù),但是提交數(shù)據(jù)之前需要對每一個表格進(jìn)行非空校驗。

思考

遍歷中引入組件這個沒啥好說的,根據(jù)以往的經(jīng)驗來說,一般要獲取某個 JSX 節(jié)點都是采用的 useRef() 這個Hook,大多寫法如下:

const ref = useRef(null);

<div ref={ref}>...</div>

這里主要說的是怎么一次性獲取多個子組件實例,用到這個場景的也有,可能也不大多,我剛開始也在網(wǎng)上找了一大堆,基本沒有相關(guān)的答案,這整的我 cv大法 自然也用不了,可是項目又趕得急,總的想辦法解決吧,最后我盯上了ChtGPT,通過智能答案在這里獲取到了一定的參考,如下:

React 使用 useRef() 獲取循環(huán)中所有子組件實例,React + Antd,react.js,javascript,前端
既然已經(jīng)有了靈感(參考),那就依樣畫葫蘆唄,開整。

下面是我經(jīng)過項目實踐后,再次做的一個案例,希望能夠?qū)τ行枰呐笥岩恍椭?,可能寫的不夠?yōu)雅,還請大家多多包涵。如有更好的方式,請大家多多留言扶正,多謝。

實現(xiàn)

完整代碼:

import { Button, message } from "antd";
import { useImperativeHandle, useRef } from "react";


interface paramsType {
    id: number,
    title: string,
}

interface validateFieldsObjType {
    [key: number]: boolean;
}

// 子組件
const ChildComponentPage:React.FC = (props: any) => {

    const { id, title, onRef } = props;

    const divStyleObj = {
        width: '100%',
        height: '100px',
        background: 'red',
        marginTop: '20px',
        fontSize: '20px',
        color: '#fff'
    }


    useImperativeHandle(onRef, () => {
        return {
            func
        }
    })

    const func = ():boolean => {
        console.log(`${title}(${id})被觸發(fā)了`)
        if (id ===2) return false;
        else return true;
    }


    return (
        <div style={divStyleObj}>【子組件】=={title}--{id}</div>
    )
}


// 父組件
const TestRef:React.FC = () => {

    const childRefs: any = useRef({});

    // mock源數(shù)據(jù)
    const datasource:paramsType[] = [
        { id: 1, title: '組件-天天', },
        { id: 2, title: '組件-小灰', },
        { id: 3, title: '組件-阿奇', },
        { id: 4, title: '組件-駑馬', },
        { id: 5, title: '組件-小栗', },
    ]


    // 異步獲取所有子組件校驗狀態(tài)
    const getChildRefReturnStateFn = (childRefIdsArry:any) => {
        const validateFieldsObj: validateFieldsObjType = {};
        childRefIdsArry.forEach((id: number, index: number) => {
            const childRef = childRefs.current[id];
            const childReturnState = childRef.func();
            console.log('子組件實例返回狀態(tài):', id, childReturnState)
            validateFieldsObj[id] = childReturnState;
        })

        return validateFieldsObj;
    }


    // 點擊事件
    const clickThisFn = async () => {
        const childRefIdsArry:any[] = Object.keys(childRefs.current);
        const validateFieldsObj: any = await getChildRefReturnStateFn(childRefIdsArry);
        console.log('子組件檢查結(jié)果:', validateFieldsObj)
        const validateFieldsLen = Object.values(validateFieldsObj).filter((type)=>!type);
        if (childRefIdsArry.length !== validateFieldsLen.length) console.log('校驗不通過,請再次檢查數(shù)據(jù)。')
        else console.log('校驗已通過')
    };

    return (
        <>
            <div style={{ width: '100%', background: 'orange', padding: '20px' }}>
                {
                    datasource.map(({ id, title }: paramsType, index: number) => {
                        return <ChildComponentPage key={id} id={id} title={title} onRef={(_ref: React.RefObject<HTMLInputElement>) => childRefs.current[id] = _ref} />
                    })
                }
            </div>

            <Button type="primary" onClick={clickThisFn}>檢驗全部子組件</Button>

        </>
    )
};

export default TestRef;

成功運行后的界面如下:

React 使用 useRef() 獲取循環(huán)中所有子組件實例,React + Antd,react.js,javascript,前端

點擊左側(cè)按鈕后,通過控制臺可以看到相關(guān)的運行信息。

知識點總結(jié)

uesRef() 作對象處理

useImperativeHandle() 父組件操作引入子組件的內(nèi)部方法

最后

關(guān)于這個問題的解決方法,就在上面的代碼里面了,如果對上面的Hook使用還不清楚的,這里就不再贅述,請自行網(wǎng)上查看。

如果對你有所幫助,麻煩咚咚你的黃金手指,請點贊,搜藏。文章來源地址http://www.zghlxwxcb.cn/news/detail-674401.html

到了這里,關(guān)于React 使用 useRef() 獲取循環(huán)中所有子組件實例的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • React修改Antd組件的樣式

    React修改Antd組件的樣式

    修改默認(rèn)的antd組件,需要使用 global 修改后Steps樣式 為什么需要這樣寫呢? 因為我們啟動了 CSS Modules ,它是一種技術(shù)流的組織css代碼的策略,它將為css提供默認(rèn)的局部作用域。因為構(gòu)建工具會在編譯的時候自動把我們的類名加上一個哈希字符串,例如上面我們寫的類名為t

    2024年02月11日
    瀏覽(25)
  • 3.react useRef使用與常見問題

    https://zh-hans.legacy.reactjs.org/docs/hooks-faq.html#why-am-i-seeing-stale-props-or-state-inside-my-function

    2024年02月12日
    瀏覽(19)
  • React鉤子函數(shù)之useRef的基本使用

    React鉤子函數(shù)中的useRef是一個非常有用的工具,它可以用來獲取DOM元素或者保存一些變量。在這篇文章中,我們將會討論useRef的基本使用。 首先,我們需要知道useRef是如何工作的。它返回一個可變的ref對象,這個對象可以在組件的整個生命周期中被訪問。當(dāng)我們需要獲取DOM元

    2024年02月10日
    瀏覽(19)
  • React Hooks的useState、useRef使用

    React Hooks 是 React 16.8 版本引入的新特性,它允許你在不編寫 class 的情況下使用 state 和其他 React 特性。其中, useState ?和? useRef ?是兩個常用的 Hooks。 1. useState useState ?是一個允許你在函數(shù)組件中添加 state 的 Hook。 使用說明: useState ?返回一個狀態(tài)變量和一個設(shè)置該變量的函

    2024年02月02日
    瀏覽(22)
  • 【react框架】結(jié)合antd做表單組件的一些心得記錄

    【react框架】結(jié)合antd做表單組件的一些心得記錄

    作為一個前端最常遇見的需求場景就是寫表單、寫表格。寫多了會逐漸的積累一些開發(fā)心得,此文章根據(jù)我使用vue和react的經(jīng)驗記錄了一些東西,拋磚引玉的給大家看看。 舉例react項目,在做表單的很多時候,我都是從antd上把其中一個form組件例子復(fù)制下來,然后再看看提供了

    2024年02月07日
    瀏覽(49)
  • React + Typescript + Antd:封裝通用的字典組件DXSelect

    在開發(fā)中,我們經(jīng)常遇到這樣的場景,在表單中,有個下拉框,選擇對應(yīng)的數(shù)據(jù)。 那么這個下拉框的選項,就是字典。一搬的做法是,通過antd的Select來實現(xiàn),代碼如下:

    2024年02月15日
    瀏覽(41)
  • React antd upload組件上傳視頻并實現(xiàn)視頻預(yù)覽

    記錄問題:antd的upload組件文檔中對于視頻的上傳預(yù)覽沒有明確的文檔demo,在這里記錄一下 項目需求:支持圖片及視頻的上傳并實現(xiàn)預(yù)覽,點擊上傳后不會立即請求接口上傳資源,后續(xù)點擊確定再上傳 上代碼

    2024年02月04日
    瀏覽(30)
  • react Hook+antd封裝一個優(yōu)雅的彈窗組件

    前言 在之前學(xué)vue2的時候封裝過一個全局的彈窗組件,可以全局任意地方通過this調(diào)用,這次大創(chuàng)項目是用react技術(shù)棧,看了一下項目需求,突然發(fā)現(xiàn)彈窗還是比較多的,主要分為基礎(chǔ)的彈窗以及form表單式的彈窗,如果只是無腦的去寫代碼,那些項目也沒啥必要了。正好react和

    2024年02月13日
    瀏覽(23)
  • react結(jié)合antd的Table組件實現(xiàn)動態(tài)單元格合并

    react結(jié)合antd的Table組件實現(xiàn)動態(tài)單元格合并

    首先看一下antd的Table表單組件,合并單元格,用到了rowSpan(合并行)和colSpan(合并列) ?后臺返回的數(shù)據(jù) 我們希望把category的值相同的,行合并成一個單元格 類似于這種 ?rowSpan這個屬性可以指定合并行。例如說第一行,指定rowSpan為3,意思就是合并三行,則后面緊挨的兩行的ro

    2024年02月12日
    瀏覽(23)
  • Pagination分頁(antd-design組件庫)展示所有配置選項和onChange的作用

    Pagination分頁(antd-design組件庫)展示所有配置選項和onChange的作用

    采用分頁的形式分隔長列表,每次只加載一個頁面。 ·當(dāng)加載/渲染所有數(shù)據(jù)將花費很多時間時; ·可切換頁碼瀏覽數(shù)據(jù)。 組件代碼來自: 分頁 Pagination - Ant Design 參考文章【react項目+antd組件-demo:hello-world react項目+antd組件-demo:hello-world_西晉的no1的博客-CSDN博客】,將 分頁 Pa

    2024年02月08日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包