欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于React Context實(shí)現(xiàn)一個(gè)簡(jiǎn)單的狀態(tài)管理的示例代碼

 更新時(shí)間:2022年07月13日 10:54:50   作者:BEFE團(tuán)隊(duì)  
本文主要介紹了基于React Context實(shí)現(xiàn)一個(gè)簡(jiǎn)單的狀態(tài)管理的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

在大多數(shù)情況下,我們開(kāi)發(fā)項(xiàng)目都需要一個(gè)狀態(tài)管理,方便我們?cè)谌止蚕頎顟B(tài)庫(kù),在React生態(tài)里比較流行的幾個(gè)庫(kù)

redux、mobx、recoil

但是對(duì)于小項(xiàng)目,我們完全可以自己封裝一個(gè)狀態(tài)管理,減少一個(gè)包的安裝就可以減小打包以后的項(xiàng)目體積。 主要分兩步:

  • 封裝一個(gè)頂層組件提供數(shù)據(jù)
  • 子組件獲取數(shù)據(jù)和更新數(shù)據(jù)

封裝一個(gè)父組件用來(lái)包裹其他子組件

stores/index.js 文件中首先需要調(diào)用 createContext

export const MyContext = React.createContext({list: [], data: null, time: Date.now()});

createContext 中的參數(shù)是默認(rèn)值,只有當(dāng)組件所處的樹(shù)中沒(méi)有匹配到 Provider 時(shí),其參數(shù)才會(huì)生效。

每個(gè) Context 對(duì)象都會(huì)返回一個(gè) Provider React 組件,它允許消費(fèi)組件訂閱 context 的變化。

創(chuàng)建一個(gè) Context 對(duì)象。當(dāng) React 渲染一個(gè)訂閱了這個(gè) Context 對(duì)象的組件,這個(gè)組件會(huì)從組件樹(shù)中匹配離自身最近的Provider,并從中讀取到當(dāng)前的 context 值。

context 可以設(shè)置一個(gè)displayName 的屬性, 可以方便在React DevTool 對(duì)該context調(diào)試。

MyContext.displayName = 'MyManagementDisplayName';

Provider 接收一個(gè) value 屬性,傳遞給消費(fèi)組件。 Context 能讓你將這些數(shù)據(jù)向組件樹(shù)下所有的組件進(jìn)行“廣播”,所有的組件都能訪問(wèn)到這些數(shù)據(jù),也能訪問(wèn)到后續(xù)的數(shù)據(jù)更新。

這里我們封裝一個(gè)父組件用來(lái)包裹其他子組件。

import { createContext, useReducer } from 'react';

// 純函數(shù)reducer
function reducer(state, action) {
    // action包括 具體的類(lèi)型type,
    // 除了 `type` 之外,action 對(duì)象的結(jié)構(gòu)其實(shí)完全取決于你自己。
    // 這里使用了payload代表dipatch傳過(guò)來(lái)的數(shù)據(jù)
    switch(action.type) {
        case 'list':
            return ({...state, list: action.payload});
        case 'data':
            return ({...state, data: action.payload});
        case 'time':
            return ({...state, time: action.payload});
        default:
            return state;
    }
}
const list = [{num: 0, key: 0}, {num: 1, key: 1}, {num: 2, key: 2}];
export const MyContext = createContext({list: [], data: null, time: Date.now()});

function ContextProvider({children}) {
    const [state, dispatch] = useReducer(
        reducer,
        {list: list, data: null, time: Date.now()}
    );

    const value = {
        state,
        dispatch
    }
    return <MyContext.Provider value={value}>
        {children}
    </MyContext.Provider>
}

export default ContextProvider;

這里用到了useReducer, 用過(guò)redux的同學(xué)一定非常熟悉,這是因?yàn)閞edux的作者 dan abramov 加入了react開(kāi)發(fā)團(tuán)隊(duì), 是react的主要開(kāi)發(fā)者。 第一個(gè)參數(shù)是一個(gè)處理數(shù)據(jù)的純函數(shù),第二個(gè)參數(shù)是 initialValue。 useReducer還有另一種用法可以接受函數(shù)作為第三個(gè)參數(shù),可以惰性地創(chuàng)建初始 state,這不是本文的重點(diǎn),感興趣的同學(xué)可以自行查詢(xún)文檔學(xué)習(xí)。

在入口文件index.js中 用 ContextProvider 包裹 App 組件

import ReactDOM from 'react-dom';
import App from './App';
import './styles/index.less';

import ContextProvider from './stores';
ReactDOM.render(
    <ContextProvider><App /></ContextProvider>,
    document.getElementById('root')
);

子組件如何獲取數(shù)據(jù)呢

有3種方式

  • Class Component 內(nèi)獲取(本方法僅能訂閱 1 個(gè) context)
  • context.Consumer
  • useContext

class Component 方式

import {MyContext} from '@/store';

class MyClass extends React.Component {
  static contextType = MyContext;
  // 引入的MyContext 賦值給靜態(tài)屬性 contextType后,
  // React可以讓你使用 `this.context` 來(lái)獲取最近 Context 上的值。
  componentDidMount() {
    let value = this.context;
    /* 在組件掛載完成后,使用 MyContext 組件的值來(lái)執(zhí)行一些有副作用的操作 */
  }
  componentDidUpdate() {
    let value = this.context;
    /* ... */
  }
  componentWillUnmount() {
    let value = this.context;
    /* ... */
  }
  render() {
    let value = this.context;
    /* 基于 MyContext 組件的值進(jìn)行渲染 */
  }
}

context.Consumer

<context.Consumer>
  {value => /* 基于 context 值進(jìn)行渲染* /}
</context.Consumer>

useContext

這是使用 hook 方式, 也是目前最流行的用法,后面的例子主要使用這個(gè)方式來(lái)演示。 因?yàn)槲覀円诤芏嘈枰譅顟B(tài)的子組件使用,所以我們可以封裝一下。

在 hooks/useStores.js

import {MyContext} from '@/stores';
import React from 'react';

// 封裝代碼以復(fù)用
const useStores = () => React.useContext(MyContext);

export default useStores;

下面我們通過(guò)兩個(gè)組件,分別演示 獲取數(shù)據(jù)并展示更新全局?jǐn)?shù)據(jù)

views/footer/index.js
在此組件里獲取全局?jǐn)?shù)據(jù)并展示

import { useEffect } from 'react';
import useStores from '../../hooks/useStores';

function Footer() {
  const { state } = useStores();
  const { time, list } = state;
  useEffect(() => {
    console.log('Footer page rendered!!!')
  })
  return (
    <div style={{ height: 200 }}>
      <div>time now is {time}</div>
      <div>
        list is
        {list.map((item) => (
          <span 
              style={{
                  background: 'pink',
                  padding: '0 10px',
                  border: '1px solid',
                  marginRight: '10px'
              }}
              key={item.key}
          >
              {item.num}
          </span>
        ))}
      </div>
    </div>
  );
}

export default Footer;

views/header/index.js

我們?cè)诖私M件里更新全局?jǐn)?shù)據(jù)

import useStores from '../../hooks/useStores';
import { Link } from 'react-router-dom';
import { useEffect } from 'react';

function Header() {
  // 解構(gòu)獲取 dispatch 方法
  const { dispatch } = useStores();
  const handleList = () => {
    const payload = [...new Array(3)].map(() => {
      const key = Math.random();
      const num = Math.floor(key * 100);
      return ({
        key, num
      });
    })
    // 更新數(shù)據(jù),訂閱狀態(tài)的組件都會(huì)獲取更新通知并取到最新數(shù)據(jù)
    dispatch({ type: "list", payload });
  };
  return (
    <div style={{ height: 100 }}>
      <button onClick={() => dispatch({ type: 'time', payload: Date.now() })}>
        time
      </button>
      <button onClick={handleList}>list</button>
    </div>
  );
}

export default Header;

點(diǎn)擊 header 中的按鈕,footer 里的 time list 都會(huì)響應(yīng)改變,獲取到最新的值并渲染展示。

總結(jié)

我們通過(guò)封裝頂層組件提供全局?jǐn)?shù)據(jù),子組件獲取和更新數(shù)據(jù), 完全基于 React 實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的狀態(tài)管理。

當(dāng)然 Context 是可以嵌套多層的,同學(xué)們可以自行嘗試

參考

 到此這篇關(guān)于基于React Context實(shí)現(xiàn)一個(gè)簡(jiǎn)單的狀態(tài)管理的示例代碼的文章就介紹到這了,更多相關(guān)React Context狀態(tài)管理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解如何在Remix 中使用 tailwindcss

    詳解如何在Remix 中使用 tailwindcss

    這篇文章主要為大家介紹了如何在Remix中使用tailwindcss方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • React?SSR?中的限流案例詳解

    React?SSR?中的限流案例詳解

    這篇文章主要介紹了React?SSR?之限流,React SSR 畢竟涉及到了服務(wù)端,有很多服務(wù)端特有的問(wèn)題需要考慮,而限流就是其中之一,本文會(huì)通過(guò)一個(gè)簡(jiǎn)單的案例來(lái)說(shuō)明,為什么服務(wù)端需要進(jìn)行限流,需要的朋友可以參考下
    2022-07-07
  • React項(xiàng)目仿小紅書(shū)首頁(yè)保姆級(jí)實(shí)戰(zhàn)教程

    React項(xiàng)目仿小紅書(shū)首頁(yè)保姆級(jí)實(shí)戰(zhàn)教程

    React 是一個(gè)用于構(gòu)建用戶(hù)界面的 Javascript庫(kù),接下來(lái)將通過(guò)實(shí)戰(zhàn)小紅書(shū)首頁(yè)的詳細(xì)介紹其設(shè)計(jì)思路和方法,將讀者帶入到react的開(kāi)源世界,需要的朋友可以參考下
    2022-07-07
  • React UI組件庫(kù)ant-design的介紹與使用

    React UI組件庫(kù)ant-design的介紹與使用

    Ant Design是阿里螞蟻金服團(tuán)隊(duì)基于React開(kāi)發(fā)的ui組件,主要用于中后臺(tái)系統(tǒng)的使用,這篇文章主要介紹了React UI組件庫(kù)ant-design的介紹與使用,需要的朋友可以參考下
    2023-12-12
  • 手把手教你從零開(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?Server?Component混合式渲染問(wèn)題詳解

    React?Server?Component混合式渲染問(wèn)題詳解

    React?官方對(duì)?Server?Comopnent?是這樣介紹的:?zero-bundle-size?React?Server?Components,這篇文章主要介紹了React?Server?Component:?混合式渲染,需要的朋友可以參考下
    2022-12-12
  • 如何在React項(xiàng)目中優(yōu)雅的使用對(duì)話框

    如何在React項(xiàng)目中優(yōu)雅的使用對(duì)話框

    在項(xiàng)目中,對(duì)話框和確認(rèn)框是使用頻率很高的組件,下面這篇文章主要給大家介紹了關(guān)于如何在React項(xiàng)目中優(yōu)雅的使用對(duì)話框的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • React 實(shí)現(xiàn)表單組件的示例代碼

    React 實(shí)現(xiàn)表單組件的示例代碼

    本文主要介紹了React 實(shí)現(xiàn)表單組件的示例代碼,支持包括輸入狀態(tài)管理,表單驗(yàn)證,錯(cuò)誤信息展示,表單提交,動(dòng)態(tài)表單元素等功能,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • React Hook 監(jiān)聽(tīng)localStorage更新問(wèn)題

    React Hook 監(jiān)聽(tīng)localStorage更新問(wèn)題

    這篇文章主要介紹了React Hook 監(jiān)聽(tīng)localStorage更新問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • React 源碼調(diào)試方式

    React 源碼調(diào)試方式

    這篇文章主要為大家介紹了React源碼調(diào)試方式實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評(píng)論