溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2022-04-24 13:47:28 來(lái)源:億速云 閱讀:226 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇“React數(shù)據(jù)共享useContext怎么實(shí)現(xiàn)”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“React數(shù)據(jù)共享useContext怎么實(shí)現(xiàn)”文章吧。

問(wèn)題:

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

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

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

后來(lái)我試試可能組建聲明的類型問(wèn)題。

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

最喜歡的一種方式就是

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>誰(shuí)在講話 {say}
      <Me />
    </FatherContext.Provider>
  )
}

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

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)是這句 用來(lái)指定
	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)這句話,用來(lái)獲取指定的上線文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ù)方式來(lái)接受函數(shù)的Provider , 類組件來(lái)接受類組件的Provider。保證構(gòu)造的一致。

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

以上就是關(guān)于“React數(shù)據(jù)共享useContext怎么實(shí)現(xiàn)”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI