React 数据共享useContext的实现

 更新时间:2022年04月24日 10:53:12   作者:www当下  
本文主要介绍了React 数据共享useContext的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

因为疫情, 最近接手一个新项目。是React的。上次写React已经过去1年多了。

虽然捡起来也不是什么难事,不过技术这个东西,长时间不用就容易忘记。

为了保证这个项目根其他平行项目的技术栈统一。

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

今天不做重点介绍项目,还是说说在项目中碰到的问题。

这个足足折腾了差不多2个小时,我一直在排查其问题。

最后这个问题也是比较的诡异。

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

引用错误 , 不能在初始化之前访问Context , 在生成页面的时候就已经发生。在Shell控制台也有显示输出。

我尝试过很多的办法, 例如:换用引用的方式、多个Provider的位置调整,甚至只保留一个 , 依然无法解决。

后来我试试可能组建声明的类型问题。

我平时对于写组建的方式比较随意。

最喜欢的一种方式就是

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是函数式组件写法,是在TypeScript使用的一个泛型,FC就是FunctionComponent的缩写,事实上React.FC可以写成React.FunctionComponent ( 我对这种写法感觉太过于冗余 )

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;

还有很多习惯使用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>
    )
  }
}

这是三种的构造方式

createContext 函数返回的有3个属性分别是 Provider ( 提供者 )、Customer( 消费者 )、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  // 重点是这句 用来指定
	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) //重点这句话,用来获取指定的上线文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>
  )
}

其实关键的还是用函数方式来接受函数的Provider , 类组件来接受类组件的Provider。保证构造的一致。

PS:useContext 我个人觉得对于小型项目还是非常的不错,但是对于复杂的数据,他的分层意识还是不够清晰。thunksagamobx 都在一定程度上在分层上更适合context。当然你也可以对context更进一步封装。适合自己的才是最好!

到此这篇关于React 数据共享useContext的实现的文章就介绍到这了,更多相关React 数据共享useContext内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • React教程之Props验证的具体用法(Props Validation)

    React教程之Props验证的具体用法(Props Validation)

    这篇文章主要介绍了React教程之Props验证的具体用法(Props Validation),非常具有实用价值,需要的朋友可以参考下
    2017-09-09
  • react中的watch监视属性-useEffect介绍

    react中的watch监视属性-useEffect介绍

    这篇文章主要介绍了react中的watch监视属性-useEffect使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 修复Next.js中window is not defined方法详解

    修复Next.js中window is not defined方法详解

    这篇文章主要为大家介绍了修复Next.js中window is not defined方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • React hook超详细教程

    React hook超详细教程

    Hook是React16.8的新增特性。它可以让你在不编写class的情况下使用state以及其他的React特性,这篇文章主要介绍了React hook的使用
    2022-10-10
  • React类组件更新的底层逻辑案例详解

    React类组件更新的底层逻辑案例详解

    这篇文章主要介绍了React类组件的更新过程,包括组件初始化、更新和卸载的生命周期方法,以及如何使用setState和forceUpdate来控制视图的更新,感兴趣的朋友一起看看吧
    2025-01-01
  • react基于react-slick实现多图轮播效果

    react基于react-slick实现多图轮播效果

    React slick是一个使用React构建的轮播组件,下面这篇文章主要给大家介绍了关于react基于react-slick实现多图轮播效果的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • useEvent显著降低Hooks负担的原生Hook

    useEvent显著降低Hooks负担的原生Hook

    这篇文章主要为大家介绍了useEvent显著降低Hooks负担的原生Hook示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • react 应用多入口配置及实践总结

    react 应用多入口配置及实践总结

    这篇文章主要介绍了react 应用多入口配置及实践总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • react 实现表格列表拖拽排序的示例

    react 实现表格列表拖拽排序的示例

    本文主要介绍了react 实现表格列表拖拽排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • React Native实现Toast轻提示和loading效果

    React Native实现Toast轻提示和loading效果

    这篇文章主要介绍了React Native实现Toast轻提示和loading效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09

最新评论