react hooks--useContext

devtools/2024/9/24 3:02:30/

概述

在之前的开发中,我们要在组件中使用共享的Context有两种方式:

  •  类组件可以通过 类名.contextType = MyContext方式,在类中获取context;
  •  多个Context或者在函数式组件中通过 MyContext.Consumer 方式共享context;

context基础语法

使用场景:跨组件共享数据。

Context 作用:实现跨组件传递数据,而不必在每个级别手动传递 props,简化组件之间的数据传递过程

 

Context 对象包含了两个组件

  • <Context.Provider value>:通过 value 属性提供数据。
  • <Context.Consumer>:通过 render-props 模式,在 JSX 中获取 Context 中提供的数据。

注意:

  1. 如果提供了 Provider 组件,Consumer 获取到的是 Provider 中 value 属性的值。
  2. 如果没有提供 Provider 组件,Consumer 获取到的是 createContext(defaultValue) 的 defaultValue 值。

useContext使用

基本语法

作用:在函数组件中,获取 Context 中的值。要配合 Context 一起使用。

useContext Hook 与 <Context.Consumer> 的区别:获取数据的位置不同,

  • <Context.Consumer>:在 JSX 中获取 Context 共享的数据。
  • useContext:在 JS 代码中获取 Context 的数据。

解释:

  • useContext 的参数:Context 对象,即:通过 createContext 函数创建的对象。
  • useContext 的返回值:Context 中提供的 value 数据。

多个 context 的用法

以前的方式:

context/them-context.js

import React from 'react';
// 创建一个上下文
const ThemContext = React.createContext()export default ThemContext

context/user-context.js

import React from 'react';
// 创建一个上下文
const UserContext = React.createContext()export default UserContext

祖先组件:

import React, { Component } from 'react';
import Home from './Home';
import ThemContext from './context/them-context'
import UserContext from './context/user-context'
class classHello extends Component {render() {return (<div><UserContext.Provider value={{nickName: 'zs'}}><ThemContext.Provider value={{color: 'red', size: '30'}}><Home /></ThemContext.Provider></UserContext.Provider></div>);}
}export default classHello;

父组件:

import React, { Component } from 'react'
import HomeInfo from './HomeInfo'
import HomeBanner from './HomeBanner'
export class Home extends Component {render() {return (<div>Home<hr /><HomeInfo /><HomeBanner /></div>)}
}export default Home

孙组件:使用(获取context)

import React, { Component } from 'react'
import ThemContext from './context/them-context'
import UserContext from './context/user-context'
export class HomeInfo extends Component {render() {console.log(this.context);return (<div><p>HomeInfo(类组件):{this.context.color}</p><UserContext.Consumer>{value => {return <h2>Info User:{value.nickName}</h2>}}</UserContext.Consumer></div>)}
}
HomeInfo.contextType = ThemContext
export default HomeInfo

孙组件:使用(获取context)

import React from 'react'
import ThemContext from './context/them-context'
export default function HomeBanner() {return (<div>HomeBanner(函数组件):{<ThemContext.Consumer>{value => {return <span>{value.color}</span>}}</ThemContext.Consumer>}</div>)
}

现在的方式:

context/user-context.js

import {createContext} from 'react'const UserContext =  createContext()export default UserContext

context/theme-context.js

import {createContext} from 'react'const ThemeContext =  createContext()export default ThemeContext

context/index.js

import UserContext from "./user-context";
import ThemeContext from "./theme-context";export {UserContext,ThemeContext
}

index.js

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { ThemeContext, UserContext } from './context';const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<UserContext.Provider value={{name: 'zs',age: 20}}><ThemeContext.Provider value={{color:'red', size: 20}}><App /></ThemeContext.Provider></UserContext.Provider>
);reportWebVitals();

App.js:使用(获取context)

import React, { memo, useContext } from 'react'
import { ThemeContext, UserContext } from './context'const App = memo(() => {// useContext hook获取const user = useContext(UserContext)const theme = useContext(ThemeContext)return (<div><p>user: {user.name}--{user.age}</p><p>theme:{theme.color}--{theme.size}</p></div>)
})export default App

注意事项:

 当组件上层最近的 <MyContext.Provider> 更新时,该 Hook 会触发重新渲染,并使用最新传递给 MyContext provider 的 context value 值

总结


http://www.ppmy.cn/devtools/116289.html

相关文章

Vue 自定义指令实战

引言 Vue自定义指令是Vue.js框架中强大而灵活的功能之一&#xff0c;它允许开发者根据具体需求创建自定义的指令&#xff0c;以实现更加精细化的交互和数据绑定效果。本文将带你深入探索Vue自定义指令的使用方法、原理和实战&#xff0c;为你打开前端开发的新视野。 我们前面…

全国职业院校技能大赛(大数据赛项)-平台搭建Spark、Scala笔记

Spark作为一个开源的分布式计算框架拥有高效的数据处理能力、丰富的生态系统、多语言支持以及广泛的行业应用。Scala是一种静态类型的编程语言&#xff0c;它结合了面向对象编程和函数式编程的特性&#xff0c;被誉为通用的“大数据语言”。而二者的结合更能迸发出新奇的化学反…

【运维】微软官方包管理器winget的使用, 对比scoop/choco(含常用软件清单,本地镜像源自建,静默安装教程)

【运维】微软官方包管理器winget的使用, 对比scoop/choco&#xff08;含常用软件清单&#xff0c;本地镜像源自建&#xff0c;静默安装教程&#xff09; 文章目录 一、winget安装使用1、winget介绍(对比scoop&#xff0c;choco)2、winget安装&#xff08;win11自带&#xff0c;…

使用Docker Compose一键部署

文章目录 使用Docker Compose一键部署一、引言二、环境准备1、安装Docker和Docker Compose1.1、安装Docker1.2、安装Docker Compose 2、验证安装 三、编写Docker Compose文件1、创建目录结构2、编写Dockerfile3、编写docker-compose.yml 四、部署项目1、构建镜像2、启动服务3、…

2016年国赛高教杯数学建模D题风电场运行状况分析及优化解题全过程文档及程序

2016年国赛高教杯数学建模 D题风电场运行状况分析及优化 风能是一种最具活力的可再生能源&#xff0c;风力发电是风能最主要的应用形式。我国某风电场已先后进行了一、二期建设&#xff0c;现有风机124台&#xff0c;总装机容量约20万千瓦。请建立数学模型&#xff0c;解决以下…

使用HTML和CSS制作网页的全面指南

目录 引言 一、理解HTML 1. 什么是HTML&#xff1f; 2. HTML文档的基本结构 3. 常用的HTML标签 4. 示例&#xff1a;创建一个简单的HTML页面 二、理解CSS 1. 什么是CSS&#xff1f; 2. CSS的使用方式 3. CSS选择器和属性 4. 常用的CSS属性 三、创建网页的步骤 1. 规…

硬件工程师笔试面试——电机

目录 18、电机 18.1 基础 电机原理图 电机实物图 18.1.1 概念 18.1.2 电机的一些基本分类和特点 18.2 相关问题 18.2.1 不同类型的电机在实际应用中有哪些具体的优势和劣势 18.2.2 在设计一个电机系统时,我应该如何考虑电机的选型和配置? 18.2.3 对于需要频繁启停的…

拒绝延迟,C++工程师都是怎么做的

声明&#xff1a;此篇为 ai123.cn 原创文章&#xff0c;转载请标明出处链接&#xff1a;https://ai123.cn/#1 唉&#xff0c;说实在的&#xff0c;在这个双十一、黑五、双十二轮番轰炸的电商战场上&#xff0c;我们这些做后端开发的&#xff0c;简直就像是天天在战场上拼刺刀的…