React使用context進(jìn)行跨級組件數(shù)據(jù)傳遞
應(yīng)用:無需為每層組件手動添加 props,能狗在組件樹間進(jìn)行數(shù)據(jù)傳遞的方法。
1、創(chuàng)建context
ContextProvider.tsx:
import React, { useMemo, useState } from 'react'; export interface ContextState { viewRef?: React.MutableRefObject<null>; activeIndex: number; setActiveIndex: (data: number) => void; } // 創(chuàng)建一個(gè)context export const Context = React.createContext<ContextState>({ activeIndex: 0, setActiveIndex: () => {}, }); const ContextProvider: React.FC< { children: React.ReactNode } & { viewRef: React.MutableRefObject<null>; } > = ({ children, viewRef }) => { // 使用useState監(jiān)聽狀態(tài)變更 const [activeIndex, setActiveIndex] = useState(0); const value = useMemo(() => { return { viewRef, activeIndex, setActiveIndex, // 通過context來更新對象和數(shù)據(jù),則可以使用state的方式將其傳遞下去 }; }, [showQuizsAnswer, shotViewRef, viewRef]); // Context提供一個(gè)Provider組件,并將自組件包裹起來,這里的props名稱必須是value return <Context.Provider value={value}>{children}</Context.Provider>; }; export default ContextProvider;
要更新 context,請將其與 state 結(jié)合。在父組件中聲明一個(gè)狀態(tài)變量,并將當(dāng)前狀態(tài)作為 context value 傳遞給 provider。
上述寫法可以參考 useContext。
2、提供context
App.tsx:
import ContextProvider from './ContextProvider'; function App() { // 下面這種寫法是無效的,不能在父組件中使用 // const { setActiveIndex, activeIndex } = React.useContext(context); return ( // 使用provider包裹,之后所有的子組件都可以獲取得到距離他最近的provider的數(shù)據(jù) <ContextProvider viewRef={viewRef}> <ChildComponent onChange={handleChange} /> </ContextProvider> ); }
注意:在這里App.tsx里面不能消費(fèi)context,因?yàn)锳pp.tsx屬于父組件。
useContext() 總是在調(diào)用它的組件 上面 尋找最近的 provider。它向上搜索, 不考慮 調(diào)用 useContext() 的組件中的 provider。 所以上面注釋掉的寫法是錯(cuò)誤的。
3、使用context
ChildComponent.txs:
function ChildComponent() { // 使用useContext鉤子訪問Context的值 const { setActiveIndex, activeIndex } = React.useContext(MyContext); // 在子組件中調(diào)用setActiveIndex函數(shù)來更改value值 const handleInputChange = (newValue) => { setActiveIndex(newValue); }; return ( <TextInput value={activeIndex} onChangeText={handleInputChange} /> ); }
到此這篇關(guān)于React使用context進(jìn)行跨級組件數(shù)據(jù)傳遞的文章就介紹到這了,更多相關(guān)React context組件數(shù)據(jù)傳遞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React?中hooks之?React.memo?和?useMemo用法示例總結(jié)
React.memo是一個(gè)高階組件,用于優(yōu)化函數(shù)組件的性能,通過記憶組件渲染結(jié)果來避免不必要的重新渲染,合理使用React.memo和useMemo可以顯著提升React應(yīng)用的性能,本文介紹React?中hooks之?React.memo?和?useMemo用法總結(jié),感興趣的朋友一起看看吧2025-01-01簡談創(chuàng)建React Component的幾種方式
這篇文章主要介紹了創(chuàng)建React Component的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2019-06-06從零搭建Webpack5-react腳手架的實(shí)現(xiàn)步驟(附源碼)
本文主要介紹了從零搭建Webpack5-react腳手架的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08關(guān)于React Native 無法鏈接模擬器的問題
許多朋友遇到React Native 無法鏈接模擬器的問題,怎么解決呢,本文給大家分享完整簡便解決方法及配置例題,對React Native 鏈接模擬器相關(guān)知識感興趣的朋友一起看看吧2021-06-06解讀useState第二個(gè)參數(shù)的"第二個(gè)參數(shù)"
這篇文章主要介紹了useState第二個(gè)參數(shù)的"第二個(gè)參數(shù)",具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03React實(shí)現(xiàn)點(diǎn)擊切換組件效果
這篇文章主要為大家詳細(xì)介紹了如何基于React實(shí)現(xiàn)點(diǎn)擊切換組件效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以學(xué)習(xí)一下2023-08-08React路由規(guī)則定義與聲明式導(dǎo)航及編程式導(dǎo)航分別介紹
這篇文章主要介紹了React路由規(guī)則的定義、聲明式導(dǎo)航、編程式導(dǎo)航,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-09-09