IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> React的Context到底怎么用 -> 正文阅读

[JavaScript知识库]React的Context到底怎么用


Context 提供了一个无需为每层组件手动添加 props,就能在组件树间进行数据传递的方法。

Class组件

1. 创建全局共享的数据源

这里定义了需要共享的数据 appState,同时创建了 Context 对象,并提供了一个包装组件(包装组件是为了方便渲染)。
当然,也可以将 appState 定义在单独的文件中

this.props.children 指的是当前组件的子组件,这样就能保证把呗当前组件包裹的组件作为消费者,实现数据共享。

📄 store.js

import React, { Component, createContext } from 'react';
// 创建Context
const AppContext = createContext({})
const { Provider } = AppContext
// 需要共享的数据
let appState = {
  data: 'default'
}
// 包装组件
class AppStore extends Component {
  render () {
    return (
    	// 把需要共享的值传到 value,不要忽略 this.props,避免造成数据 props 数据丢失
      <Provider value={appState} {...this.props}>
        {this.props.children}
      </Provider>
    );
  }
}

2. 创建消费者组件及其子组件

Class.contextType

消费者组件中,一种方式引入创建的 AppContext 对象,并把对象绑定到类组件中。绑定有两种方式:

  • 在类组件内部 static contextType = AppContext;
  • 在类组件外部 ClassComponent.contextType = AppContext

这里为了更明显的体现效果,创建了消费者组件和它的子组件。

📄 ChildClassComponent.js

import React, { Component } from 'react';
import { AppContext } from './store'

class ChildClassComponent extends Component {
  static contextType = AppContext;
  render () {
    console.log(this.context)
    return (
      <div>
        {this.context.data}
      </div>
    );
  }
}

export default ChildClassComponent;

📄 ClassComponent.js

import React, { Component } from 'react';
import { AppContext } from './store';
import ChildClassComponent from './ChildClassComponent';

class ClassComponent extends Component {
	// 将 Context 挂载到 contextType 上,就能直接通过 this.context 访问
  static contextType = AppContext;
  render () {
    console.log(this.context)
    return (
      <div>
        {this.context.data}
        <ChildClassComponent />
      </div>
    );
  }
}
// or write like this
// ClassComponent.contextType = AppContext;
export default ClassComponent;

Context.Consumer

还有一种方式时使用 Consumer 包裹子组件,Consumer 需要接受一个函数作为子元素。
这里仅对消费者的子组件进行了改写演示
📄 ChildClassComponent.js

import React, { Component } from 'react';

import { Consumer } from './store'
class ChildClassComponent extends Component {
  render () {
    return (
      <Consumer>
        {({ data }) => <div>消费者子组件:{data}</div>}
      </Consumer>
    );
  }
}

export default ChildClassComponent;

3. 将消费者作为包装组件的子组件

📄 index.js

import React, { Component } from 'react';
import ClassComponent from "./ClassComponent";
import { AppStore } from './store'

class MyApp extends Component {
  render () {
    return (
      <AppStore {...this.props}>
        <ClassComponent />
      </AppStore>
    );
  }
}

export default MyApp;

在外部直接引用 MyApp 就可以了,效果如下图:
在这里插入图片描述
不知道看到这里会不会有疑问,既然引入Context 再绑定到组件上,是不是不用包装组件包裹也能用?
肯定不行呢!只有在 Context.Provider 的任意子(孙)节点中才能获取到。
在这里插入图片描述

Function组件

函数组件与类组件最大的区别就是在 消费者组件 中 使用 useContext() 来绑定 Context。将上述 Class 组件改为 Function 组件即可。

1. 创建全局共享的数据源

📄 store.js

/*
 * @Description:
 * @Author: leewentao
 * @Date: 2021-08-10 20:00:38
 * @LastEditors: leewentao
 * @LastEditTime: 2021-08-10 20:45:26
 */
import React, { createContext } from 'react';
// 创建Context
const AppContext = createContext({})
const { Provider } = AppContext
// 需要共享的数据
let appState = {
  data: 'default'
}
// 包装组件
const AppStore = props =>
  <Provider value={appState} {...props}>
    {props.children}
  </Provider>
  
export { AppStore, AppContext }

2. 创建消费者组件及其子组件

useContext

📄 ChildFunctionComponent.js

import React, { useContext } from 'react';
import { AppContext } from './store'
const ChildFunctionComponent = props => {
  const appContext = useContext(AppContext);
  return (
    <div>
      消费者子组件:{appContext.data}
    </div>
  )
}

📄 ChildFunctionComponent.js

import React, { useContext } from 'react';
import ChildFunctionComponent from './ChildFunctionComponent';
import { AppContext } from './store';

const FunctionComponent = props => {
  const appContext = useContext(AppContext);
  return (<div>
    消费者组件:{appContext.data}
    <ChildFunctionComponent />
  </div>)
}

Context.Consumer

这里仅对消费者的子组件进行了改写演示
📄 ChildFunctionComponent.js

import React from 'react';
import { Consumer } from './store'
const ChildFunctionComponent = () => {
  return (
    <Consumer>{
      ({ data }) => <div>消费者子组件:{data}</div>}
    </Consumer>
  )
}

export default ChildFunctionComponent;

3. 将消费者作为包装组件的子组件

📄 index.js

import React from 'react';
import FunctionComponent from "./FunctionComponent";
import { AppStore } from './store'

const MyApp = props =>
  <AppStore {...props}>
    <FunctionComponent />
  </AppStore>

export default MyApp;
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 12:13:37  更:2021-08-11 12:18:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 9:36:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码