一区二区日本_久久久久久久国产精品_无码国模国产在线观看_久久99深爱久久99精品_亚洲一区二区三区四区五区午夜_日本在线观看一区二区

初探React Context API

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

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

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

/src/components/目錄下分別創建了GrandChildChild、ParentComponentThemeToggle幾個組件:

示例代碼如下:

// /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一級一級往下傳,傳給組件樹下的所有組件。愛掏網 - it200.com即,將theme傳遞到需要它的地方,在本例中會傳到GrandChild組件。愛掏網 - it200.comChild組件和themeprops)沒有任何關系,它只是作為一個媒體而以。愛掏網 - it200.com

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

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

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

對應到上面的示例中,那就是:

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

React的官網是這樣描述Context的:

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

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

假設我們有這樣的一個使用場景,在一個React應用中,我們有App、Container、FormButton四個組件,它們之間是依次被嵌套:

App ? Container ? Form ? Buttton

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

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

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

創建上下文對象

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

const DataContext = React.createContext()

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

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

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

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

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

使用Provider提供數據

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

const App = () => 

Child Component

;

Providervalue屬性的值可以是字符串、數字或對象。愛掏網 - it200.com

消費Provider提供的數據

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

使用Consumer組件消費數據

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

const ParagraphChildComponent = () => 
    { value => 

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

包月會員查看

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

返回頂部

主站蜘蛛池模板: 欧美精品一区二区三区四区 在线 | 欧美成人一区二区三区 | 欧美男人的天堂 | 午夜免费福利影院 | 高清久久久| 日韩有码一区 | 国产精品国产三级国产aⅴ中文 | 国产精品视屏 | 男人天堂网av | 欧美大片久久久 | 国产乱码一区 | 毛片在线免费播放 | 精品久久久久久久久久久久久 | 国产高清区 | 久久久久亚洲国产| 亚洲3p | hsck成人网 | 九色一区 | 欧美日韩高清一区二区三区 | www.99精品| 无码一区二区三区视频 | 在线小视频 | 91综合网 | 欧美黑人激情 | 国产福利一区二区 | 一区二区三区四区在线 | 2019天天操| 亚洲欧美日韩系列 | 中文字幕在线电影观看 | 狠狠干狠狠操 | 日韩精品免费视频 | 久久另类 | 一区二区三区四区在线视频 | 亚洲美女在线视频 | 欧美亚洲视频在线观看 | 日韩av高清在线 | 日韩中文字幕在线播放 | 国产视频导航 | 久久一区精品 | 一区二区免费视频 | 国产精品久久久久久久午夜 |