初探React Context API

    最近在整理CSS自定義屬性在React中的使用時了解到“可以使用React Context API相關(guān)的知識更好的在React組件中使用CSS自定義屬性”,但是自己對這方面的知識了解的并不多,因此想借此機會來學(xué)習(xí)React Context API相關(guān)的知識。愛掏網(wǎng) - it200.com也基于這個原因有了這篇文章。愛掏網(wǎng) - it200.com

    我們從一個React的實例開始。愛掏網(wǎng) - it200.com假設(shè)你要構(gòu)建一個React的應(yīng)用,該應(yīng)用有一個最簡單的功能,就是Dark Mode的切換。愛掏網(wǎng) - it200.com簡單地說,在Web應(yīng)用上一個切換組件(比如ThemeToggle),用戶點擊該切換按鈕可以讓頁面在暗色系(dark)和亮色系(light)之間切換。愛掏網(wǎng) - it200.com

    通常我們會通過props為所有組件提供當(dāng)前主題的模式,并使用state來更新當(dāng)前的主題。愛掏網(wǎng) - it200.com

    /src/components/目錄下分別創(chuàng)建了GrandChildChildParentComponentThemeToggle幾個組件:

    示例代碼如下:

    // /src/components/GrandChild
    import React from 'react'
    
    const GrandChild = (props) => {
        const styled = {
            color: `${props.theme.color}`,
            background: `${props.theme.background}`
        }
        return 

    Theme Toggle

    } export default GrandChild; // /src/components/Child import React from 'react' import GrandChild from '../GrandChild' const Child = (props) => { const styled = { border: `5px solid ${props.theme.color}`, padding: `10vmin 20vmin`, borderRadius: '8px' } return } export default Child // /src/components/ParentComponent import React from 'react' import Child from '../Child' const ParentComponent = (props) => export default ParentComponent // /src/components/ThemeToggle import React from 'react' const ThemeToggle = (props) => { const styled = { background: `${props.theme.background}`, color: `${props.theme.color}`, border: `4px solid currentColor`, borderRadius: `6px`, padding: `2vmin 4vmin`, margin: `4vmin`, cursor: `pointer` } return } export default ThemeToggle // /src/App.js import React, {Fragment} from 'react'; import ParentComponent from './components/ParentComponent' import ThemeToggle from './components/ThemeToggle' const dark = { background: '#121212', color: '#fff' } const light = { background: '#fff', color: '#444' } const App = () => { const [theme, setTheme] = React.useState('light') const onClickHander = () => { theme === 'light' ? setTheme('dark') : setTheme('light') } return } export default App;

    效果如下:

    在這個示例中,在ParentComponent組件中指定了theme這個props,并且將這個props一級一級往下傳,傳給組件樹下的所有組件。愛掏網(wǎng) - it200.com即,將theme傳遞到需要它的地方,在本例中會傳到GrandChild組件。愛掏網(wǎng) - it200.comChild組件和themeprops)沒有任何關(guān)系,它只是作為一個媒體而以。愛掏網(wǎng) - it200.com

    試想一下,在React中組件樹就有點類似于我們熟悉的DOM樹:

    正如上圖所示,我們可以在最底層組件中添加state,但如果要將數(shù)據(jù)傳遞給兄弟組件的話,在React Context API之前,我們只能將state放到他們的父組件中(組件樹中更高的組件位置),然后通過props將其傳遞回同級組件:

    就像上面的示例,我們需要將state從組件樹的最頂層一級一級往下傳,哪怕是所有中間層組件不需要使用這些數(shù)據(jù),但它必須為了后面的組件做為媒介,將state傳遞到最底層組件。愛掏網(wǎng) - it200.com

    對應(yīng)到上面的示例中,那就是:

    React Context API正是用來解決Prop Drilling的問題。愛掏網(wǎng) - it200.comReact Context API提供了一種通過ProviderConsumer用來提供數(shù)據(jù)和消費數(shù)據(jù),它們可以在組件件中傳遞數(shù)據(jù),最主要的是不必要一級一級的通過props向組件樹傳遞state愛掏網(wǎng) - it200.com簡單地說,在組件樹最頂層的組件中通過Provider提供數(shù)據(jù),在后面的任何一個子組件樹可以通過Consumer來消費Provider提供的數(shù)據(jù):

    React的官網(wǎng)是這樣描述Context的:

    在這個特性還沒出現(xiàn)之前,在React應(yīng)用中數(shù)據(jù)的通訊是通過props屬性自上而下(由父及子)進行傳遞的,換句話說,必須通過props傳遞到每個組件中,然后在組件中重復(fù)相同的過程。愛掏網(wǎng) - it200.com但這種做法對于某些類型的屬性而言是極其繁鎖的,也會變得非常的糟糕,最終可能會導(dǎo)致props在我們的組件中要不斷的一層一層嵌套。愛掏網(wǎng) - it200.com

    React Context API的出現(xiàn)主要是為了幫助我們解決這方面的問題,它提供了一種在組件之間共享此類值的方式,而不必顯式地通過組件樹的逐層傳遞props愛掏網(wǎng) - it200.com也就是說,它允許父組件隱式地將數(shù)據(jù)傳遞給子組件(不管組件樹有多深)。愛掏網(wǎng) - it200.com換句話說,可以將數(shù)據(jù)添加到父組件中,然后任何子組件都可以訪問它愛掏網(wǎng) - it200.com

    假設(shè)我們有這樣的一個使用場景,在一個React應(yīng)用中,我們有AppContainerFormButton四個組件,它們之間是依次被嵌套:

    App ? Container ? Form ? Buttton
    

    假如我們使用props傳遞就需要一層一層往里傳:

    換成Context,就可以直接獲取最頂層App組件綁定的值:

    對于像我這樣的初級使用者而言,要想徹底的了解React Context API,只能從最簡單的應(yīng)用開始。愛掏網(wǎng) - it200.com為了更好的理解它的使用,我們從最簡單的示例開始。愛掏網(wǎng) - it200.com

    創(chuàng)建上下文對象

    在React中使用Context的話,我們首要做的就是創(chuàng)建上下文對象(Context Object)。愛掏網(wǎng) - it200.com可以使用React上的.createContext()創(chuàng)建一個Context對象:

    const DataContext = React.createContext()
    

    嘗試著把這個Context對象DataContext在控制臺上打印出來:

    這個時候可以從組件樹中離自身最近的那個匹配的Prrovider中讀取到當(dāng)前的context值。愛掏網(wǎng) - it200.com

    只有當(dāng)組件所處的樹中沒有匹配到Provider時,其defaultValue參數(shù)才會生效。愛掏網(wǎng) - it200.com這有助于在不使用Provider包裝組件的情況下對組件進地測試。愛掏網(wǎng) - it200.com

    另外,createContext()方法提供了ProviderConsumer能力,其中一個是提供者,另一個是消費者,而且這兩個屬性都是成對出現(xiàn)的,即每一個Provider都會有對應(yīng)的一個Consumer愛掏網(wǎng) - it200.com

    Provider將作為父組件使用,它持有所有Consumer都可以共享的值。愛掏網(wǎng) - it200.com注意,Consumer只能用于Provider的子組件愛掏網(wǎng) - it200.com

    使用Provider提供數(shù)據(jù)

    上一步,使用React.createContext()創(chuàng)建了一個名為DataContext的上下文對象,在其中,我們用一些值(value)初始化一個狀態(tài)(state),可以使用DataContextProvider接受一個value屬性,傳遞給子組件消費(Consumer

    const App = () => 

    Child Component

    ;

    Providervalue屬性的值可以是字符串、數(shù)字或?qū)ο蟆?b class="xhide">愛掏網(wǎng) - it200.com

    消費Provider提供的數(shù)據(jù)

    Provider創(chuàng)建了數(shù)據(jù),其創(chuàng)建的數(shù)據(jù)可以通過context對象的Consumer屬性給子組件消費。愛掏網(wǎng) - it200.com主要有三種方法來消費Provider屬性創(chuàng)建的數(shù)據(jù)。愛掏網(wǎng) - it200.com

    使用Consumer組件消費數(shù)據(jù)

    創(chuàng)建一個新組件,并且在該組件中使用DataContextConsumer來消費數(shù)據(jù)。愛掏網(wǎng) - it200.com這將返回一個函數(shù),該函數(shù)允許組件消費Provider中設(shè)置的值。愛掏網(wǎng) - it200.com比如:

    const ParagraphChildComponent = () => 
        { value => 

    I'm {value.userName}, {value.age}

    包月會員查看

    聲明:所有內(nèi)容來自互聯(lián)網(wǎng)搜索結(jié)果,不保證100%準(zhǔn)確性,僅供參考。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進行處理。
    發(fā)表評論
    更多 網(wǎng)友評論0 條評論)
    暫無評論

    返回頂部

    主站蜘蛛池模板: av在线亚洲欧洲日产一区二区| 国产精品久久久久久一区二区三区| 国产午夜精品一区二区三区| 亚洲日本va午夜中文字幕一区| 相泽南亚洲一区二区在线播放| 无码视频一区二区三区在线观看 | 美女视频在线一区二区三区| 国产第一区二区三区在线观看| 亚洲福利秒拍一区二区| 成人免费av一区二区三区| 精品国产区一区二区三区在线观看| 亚洲一区动漫卡通在线播放| 一区二区三区精品| 中文字幕AV一区中文字幕天堂| 国产成人精品一区二三区在线观看| 日韩一区二区三区在线| 天堂一区人妻无码| 亚洲国产情侣一区二区三区| 久久se精品一区精品二区| 99精品高清视频一区二区| 无码人妻精品一区二区蜜桃AV| 国产成人综合亚洲一区| 波多野结衣电影区一区二区三区| 韩国精品一区二区三区无码视频| 国精产品一区一区三区有限公司 | 精品国产一区二区三区AV性色 | 在线观看日韩一区| 色噜噜一区二区三区| 精品福利一区3d动漫| 亚洲国产av一区二区三区| 国产成人精品一区在线| 人妻少妇精品一区二区三区| 久久精品一区二区三区不卡| 亚洲av日韩综合一区在线观看| 无码人妻精品一区二区三区在线| 亚洲丰满熟女一区二区v| 亚洲综合一区国产精品| 国产亚洲综合一区二区三区| 国产精品亚洲高清一区二区 | 免费萌白酱国产一区二区三区| 中文字幕一区二区人妻性色|