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

React?數(shù)據(jù)共享useContext的實(shí)現(xiàn)

 更新時(shí)間:2022年04月24日 10:53:12   作者:www當(dāng)下  
本文主要介紹了React?數(shù)據(jù)共享useContext的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

因?yàn)橐咔椋?最近接手一個(gè)新項(xiàng)目。是React的。上次寫React已經(jīng)過去1年多了。

雖然撿起來也不是什么難事,不過技術(shù)這個(gè)東西,長時(shí)間不用就容易忘記。

為了保證這個(gè)項(xiàng)目根其他平行項(xiàng)目的技術(shù)棧統(tǒng)一。

采用的是 Nextjs 、styled-components、useContext 、react-query、ts

今天不做重點(diǎn)介紹項(xiàng)目,還是說說在項(xiàng)目中碰到的問題。

這個(gè)足足折騰了差不多2個(gè)小時(shí),我一直在排查其問題。

最后這個(gè)問題也是比較的詭異。

ReferenceError: Cannot access 'Context' before initialization This error happened while generating the page. Any console logs will be displayed in the terminal window.

引用錯(cuò)誤 , 不能在初始化之前訪問Context , 在生成頁面的時(shí)候就已經(jīng)發(fā)生。在Shell控制臺(tái)也有顯示輸出。

我嘗試過很多的辦法, 例如:換用引用的方式、多個(gè)Provider的位置調(diào)整,甚至只保留一個(gè) , 依然無法解決。

后來我試試可能組建聲明的類型問題。

我平時(shí)對(duì)于寫組建的方式比較隨意。

最喜歡的一種方式就是

import { useState  , createContext} from 'react'
import Me from './me'
export const MyContext =  createContext({});
export default function Demo(){
  const [say , setSay] = useState('');
  return (
    <MyContext.Provider value={{say , setSay}}>
      <div>father</div>誰在講話 {say}
      <Me />
    </FatherContext.Provider>
  )
}

React.FC是函數(shù)式組件寫法,是在TypeScript使用的一個(gè)泛型,F(xiàn)C就是FunctionComponent的縮寫,事實(shí)上React.FC可以寫成React.FunctionComponent ( 我對(duì)這種寫法感覺太過于冗余 )

import React, { createContext, FunctionComponent, useState } from 'react'
import Me from './me'
interface DemoProps {
  say: string;
  setSay: React.Dispatch<React.SetStateAction<boolean>>;
  demoString?:string;
}
const defaultDemoProps: DemoProps = {
	isDay: true,
	setIsDay: (day) => day
};
export const MyContext = createContext<DemoProps>({...defaultDemoProps});
const Demo: React.FC<DemoProps> = ({ children, ...props }) => {
  const { say : propIsSay } = props;
  const [ isSay, setSay ] = useState(propIsDay)
  return <MyContext.Provider value={{ say,setSay}}>
      <Me />
    </MyContext.Provider>
}
export default Demo;

還有很多習(xí)慣使用class components

import React, { createContext, PureComponent } from 'react'
import Me from './me'
export const MyContext = createContext({})
export default class Demo extends PureComponent {
  state = {
    say:true, 
  }
  setSay ()=>{
    let say = !this.state.say
    this.setState({
      say
    });
  }
  render() {
    return(
      <MyContext.Provider value={{ say,setSay}}>
      <Me />
      <MyContext.Provider>
    )
  }
}

這是三種的構(gòu)造方式

createContext 函數(shù)返回的有3個(gè)屬性分別是 Provider ( 提供者 )、Customer( 消費(fèi)者 )、displayName ( 貌似用不到 )

import React, { Context, PureComponent } from 'react';
import {MyContext} from '../components/data';
import Memo from '../components/classDemo';
export const MyContext = React.createContext()
export default class CurstomerDemo extends PureComponent {
  static contextType = MyContext  // 重點(diǎn)是這句 用來指定
	constructor(props) {
		super(props);
	}
  handleClick = () => {
    console.log (this.context) // 獲取上下文 Provider 屬性
  }
	render() {
		return (
      <div>
        <button>Provider</button>
        <button onClick={this.handleClick}>Customer</button>
      </div>
		)
	}
}



import React, { useState  ,useContext, createContext} from 'react'
import {MyContext} from './Demo'
function useCountContext(CounterContext) {
  const context = useContext(MyContext) //重點(diǎn)這句話,用來獲取指定的上線文Context
  if (!context) {
    throw new Error('useCountContext must used within Context.Provider')
  }
  return context
}
export default function Me(props){
  let context = useCountContext(MyContext)
  let {say , setSay} = context
  return (
    <div>
      me
      <button onClick={()=>{
        setSay(say + ',同志們好')
      }}>come from grandpa Provier {say}</button>
    </div>
  )
}

其實(shí)關(guān)鍵的還是用函數(shù)方式來接受函數(shù)的Provider , 類組件來接受類組件的Provider。保證構(gòu)造的一致。

PS:useContext 我個(gè)人覺得對(duì)于小型項(xiàng)目還是非常的不錯(cuò),但是對(duì)于復(fù)雜的數(shù)據(jù),他的分層意識(shí)還是不夠清晰。thunk、saga、mobx 都在一定程度上在分層上更適合context。當(dāng)然你也可以對(duì)context更進(jìn)一步封裝。適合自己的才是最好!

到此這篇關(guān)于React 數(shù)據(jù)共享useContext的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)React 數(shù)據(jù)共享useContext內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React組件中監(jiān)聽函數(shù)獲取不到最新的state問題

    React組件中監(jiān)聽函數(shù)獲取不到最新的state問題

    這篇文章主要介紹了React組件中監(jiān)聽函數(shù)獲取不到最新的state問題問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • React中props使用教程

    React中props使用教程

    props是組件(包括函數(shù)組件和class組件)間的內(nèi)置屬性,用其可以傳遞數(shù)據(jù)給子節(jié)點(diǎn),props用來傳遞參數(shù)。組件實(shí)例化過程中,你可以向其中傳遞一個(gè)參數(shù),這個(gè)參數(shù)會(huì)在實(shí)例化過程中被引用
    2022-09-09
  • React html中使用react的兩種方式

    React html中使用react的兩種方式

    這篇文章主要介紹了React html中使用react的兩種方式,本文給大家提到了React pwa的配置代碼,給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • react自定義實(shí)現(xiàn)狀態(tài)管理詳解

    react自定義實(shí)現(xiàn)狀態(tài)管理詳解

    這篇文章主要為大家詳細(xì)介紹了react如何自定義實(shí)現(xiàn)狀態(tài)管理,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • React-router 4 按需加載的實(shí)現(xiàn)方式及原理詳解

    React-router 4 按需加載的實(shí)現(xiàn)方式及原理詳解

    本篇文章主要介紹了React-router 4 按需加載的實(shí)現(xiàn)方式及原理詳解,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-05-05
  • react電商商品列表的實(shí)現(xiàn)流程詳解

    react電商商品列表的實(shí)現(xiàn)流程詳解

    這篇文章主要介紹了react實(shí)現(xiàn)電商商品列表的流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • react用Redux中央倉庫實(shí)現(xiàn)一個(gè)todolist

    react用Redux中央倉庫實(shí)現(xiàn)一個(gè)todolist

    這篇文章主要為大家詳細(xì)介紹了react用Redux中央倉庫實(shí)現(xiàn)一個(gè)todolist,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • React路由攔截模式及withRouter示例詳解

    React路由攔截模式及withRouter示例詳解

    這篇文章主要為大家介紹了React路由攔截模式及withRouter示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 解析react?函數(shù)組件輸入卡頓問題?usecallback?react.memo

    解析react?函數(shù)組件輸入卡頓問題?usecallback?react.memo

    useMemo是一個(gè)react hook,我們可以使用它在組件中包裝函數(shù)。可以使用它來確保該函數(shù)中的值僅在依賴項(xiàng)之一發(fā)生變化時(shí)才重新計(jì)算,這篇文章主要介紹了react?函數(shù)組件輸入卡頓問題?usecallback?react.memo,需要的朋友可以參考下
    2022-07-07
  • React+Ts實(shí)現(xiàn)二次封裝組件

    React+Ts實(shí)現(xiàn)二次封裝組件

    本文主要介紹了React+Ts實(shí)現(xiàn)二次封裝組件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評(píng)論