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

React高級(jí)概念之Context用法詳解

 更新時(shí)間:2023年06月16日 09:15:48   作者:何遇er  
在React應(yīng)用中,為了讓數(shù)據(jù)在組件間共享,常見(jiàn)的方式是讓它們以props的形式自頂向下傳遞,如果數(shù)據(jù)要在組件樹(shù)不同層級(jí)共享,那么這些數(shù)據(jù)必須逐層傳遞直到目的地,Context如同管道,它將數(shù)據(jù)從入口直接傳遞到出口,使用Context能避免“prop-drilling”

Context 的基本用法

總體而言,使用 Context 分為如下三步:

創(chuàng)建 Context 對(duì)象

Context 只能使用 React.createContext 方法創(chuàng)建,代碼如下:

// 注釋Context中數(shù)據(jù)的類型
interface IMyContext {
????lang: string;
????changeLang: (lang: string) => void
}
// React.createContext的參數(shù)是Context中數(shù)據(jù)的默認(rèn)值。
const MyContext = React.createContext<IMyContext >({
????lang: 'zh_CN',
????changeLang: () => { throw Error('你必須自己實(shí)現(xiàn)這個(gè)方法') }
})

用創(chuàng)建的 Context.Provider 包裹組件樹(shù)。

用 Context.Provider 圈選 Context 的作用域,只有作用域內(nèi)的組件才能消費(fèi) Context 中的數(shù)據(jù),此處是管道的入口,在這里放入想要傳遞的數(shù)據(jù)。代碼如下:

import { MyContext } from './myContext'
class ContextDemo extends React.Component<{}> {
????render() {
????????return (
????????????<MyContext.Provider
????????????????value={someValue} // 放入數(shù)據(jù),它的數(shù)據(jù)類型必須與IMyContext接口兼容
????????????>
????????????????// children
????????????</GlobalContext.Provider>
????????)
????}
}

訂閱 Context

此處是管道的出口,對(duì)于 Context 對(duì)象而言,管道入口只有一個(gè),但出口可以有多個(gè)。訂閱 Context 有多種方式,總體而言有如下三種:

類組件的靜態(tài)屬性 contextType

只能在類組件中使用,并且只能訂閱一個(gè) Context。用法如下:

class MyNestedClass extends React.Component<{}> {
    static contextType = MyContext // 訂閱第一步創(chuàng)建的Context 
    render() {/**todo*/}
}

在類組件中使用 contextType 訂閱 Context 之后,除了不能在構(gòu)造函數(shù)中使用 this.context 訪問(wèn)到數(shù)據(jù)之外,在類組件的其他位置都能使用 this.context 訪問(wèn)到數(shù)據(jù)。生命周期 shouldComponentUpdate 的第三個(gè)參數(shù)是組件即將接收的 context。

useContext

在函數(shù)組件中通過(guò) useContext 訂閱 Context,useContext 的使用次數(shù)不限。用法如下:

function MyNestedFunc() {
  const myContext = useContext(MyContext) // 訂閱第一步創(chuàng)建的Context
  return (/**todo*/)
}

Context.Consumer

它是組件,在 Context 作用域任何位置都能使用它,它只有一個(gè)名為 children 的 prop,children 必須是一個(gè)返回 React.ReactNode 的函數(shù),該函數(shù)接收當(dāng)前的 context 作為參數(shù),用法如下:

<MyContext.Consumer>
    {(context) => <MyNestedCom lang={context.lang}/>}
</MyContext.Consumer>

Context + useReducer

Context + useReducer 指的是用 useReducer 管理狀態(tài),用 Context 傳遞值。與 Context 基本用法相比需要變化的是第二步,示例代碼如下:

// context要傳遞的數(shù)據(jù)類型
interface IStyleContext {
    theme: 'light' | 'dark';
    size: 's' | 'm' | 'l';
    changeTheme: (theme: 'light' | 'dark') => void;
    changeSize: (size: 's' | 'm' | 'l') => void;
}
function ProviderCom() {
 // 用 useReducer 創(chuàng)建狀態(tài)
  const [style, dispatch] = useReducer(reducer, {theme: 'light', size: 'm'})
  // 避免 ContextVal 被頻繁新建
  const ContextVal = useMemo<IStyleContext>(() => {
    return {
      theme: style.theme,
      size: style.size,
      changeSize: (size: IStyleContext['size']) => dispatch({type: 'size', payload: size}),
      changeTheme: (theme: IStyleContext['theme']) => dispatch({type: 'theme', payload: theme})
    }
  }, [style.size, style.theme])
  return (
    <StyleContext.Provider value={ContextVal}> // 將要傳遞的數(shù)據(jù)放到 Context 中
      {/* todo */}
    </StyleContext.Provider>
  )
}

在上述示例中,狀態(tài)由 useReducer 創(chuàng)建,被 reducer 函數(shù)更新,StyleContext 只負(fù)責(zé)傳遞數(shù)據(jù),被 StyleContext.Provider 包裹的組件能訂閱 StyleContext。

總結(jié)

只要 context value 被更新,那么訂閱該 context 的組件一定會(huì)重新渲染,而不管 context value中更新的那部分值是否被它使用,也不管它的祖先組件是否跳過(guò)重新渲染,所以推薦將不同職責(zé)的數(shù)據(jù)保存到不同的 context 中,以減少不必要的重新渲染。

如果 Context.Provider 的 value 屬性傳遞了一個(gè)對(duì)象字面量,那么 Context.Provider 的父組件每一次重新渲染都會(huì)使 context value 更新,進(jìn)而導(dǎo)致訂閱該 context 的組件重新渲染,所有應(yīng)該避免給 Context.Provider 的 value 傳對(duì)象字面量。

以上就是React高級(jí)概念之Context用法詳解的詳細(xì)內(nèi)容,更多關(guān)于React Context用法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 簡(jiǎn)易的redux?createStore手寫實(shí)現(xiàn)示例

    簡(jiǎn)易的redux?createStore手寫實(shí)現(xiàn)示例

    這篇文章主要介紹了簡(jiǎn)易的redux?createStore手寫實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • React Native之prop-types進(jìn)行屬性確認(rèn)詳解

    React Native之prop-types進(jìn)行屬性確認(rèn)詳解

    本篇文章主要介紹了React Native之prop-types進(jìn)行屬性確認(rèn)詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • React創(chuàng)建組件的的方式匯總

    React創(chuàng)建組件的的方式匯總

    React 是一個(gè)用于構(gòu)建用戶界面的 JAVASCRIPT 庫(kù)。這篇文章主要介紹了React組件的兩種創(chuàng)建方式,一種是使用函數(shù)創(chuàng)建組件另一種是使用類創(chuàng)建組件,需要的朋友可以參考下
    2021-11-11
  • React表單容器的通用解決方案

    React表單容器的通用解決方案

    本文主要介紹了React表單容器的通用解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 詳解對(duì)于React結(jié)合Antd的Form組件實(shí)現(xiàn)登錄功能

    詳解對(duì)于React結(jié)合Antd的Form組件實(shí)現(xiàn)登錄功能

    這篇文章主要介紹了詳解對(duì)于React結(jié)合Antd的Form組件實(shí)現(xiàn)登錄功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 手把手教你從零開(kāi)始react+antd搭建項(xiàng)目

    手把手教你從零開(kāi)始react+antd搭建項(xiàng)目

    本文將從最基礎(chǔ)的項(xiàng)目搭建開(kāi)始講起,做一個(gè)基于react和antd的后臺(tái)管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • React?Native系列之Recyclerlistview使用詳解

    React?Native系列之Recyclerlistview使用詳解

    這篇文章主要為大家介紹了React?Native系列之Recyclerlistview使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • react中antd Upload手動(dòng)上傳的示例

    react中antd Upload手動(dòng)上傳的示例

    本文主要介紹了react中antd Upload手動(dòng)上傳的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 淺談React中組件邏輯復(fù)用的那些事兒

    淺談React中組件邏輯復(fù)用的那些事兒

    這篇文章主要介紹了淺談React中組件邏輯復(fù)用的那些事兒,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • React中refs的一些常見(jiàn)用法匯總

    React中refs的一些常見(jiàn)用法匯總

    Refs是一個(gè) 獲取 DOM節(jié)點(diǎn)或React元素實(shí)例的工具,在React中Refs 提供了一種方式,允許用戶訪問(wèn)DOM 節(jié)點(diǎn)或者在render方法中創(chuàng)建的React元素,這篇文章主要給大家介紹了關(guān)于React中refs的一些常見(jiàn)用法,需要的朋友可以參考下
    2021-07-07

最新評(píng)論

福安市| 罗定市| 义乌市| 竹山县| 遂川县| 张家川| 津南区| 道孚县| 滁州市| 石泉县| 天长市| 临桂县| 太谷县| 揭西县| 连云港市| 鄂托克前旗| 锡林郭勒盟| 特克斯县| 黄山市| 邛崃市| 娱乐| 马公市| 西畴县| 马公市| 酒泉市| 泸水县| 云阳县| 河源市| 伊吾县| 西乌珠穆沁旗| 咸丰县| 亚东县| 岳阳县| 金川县| 烟台市| 尉氏县| 南阳市| 聂荣县| 义乌市| 冀州市| 阳西县|