首页 > 其他分享 >React Hook :context上下文

React Hook :context上下文

时间:2022-10-13 10:35:35浏览次数:55  
标签:context ThemeContext React Hook Context 组件 import

context

1.Context被翻译为上下文,在编程领域,这是一个经常会接触到的概念,React中也有:

In Some Cases, you want to pass data through the component tree without having to pass the props down manuallys at every level. you can do this directly in React with the powerful "context" API

 

React文档官网并未对Context给出“是什么”的定义,更多是描述使用的Context的场景,以及如何使用Context,在React的官方文档中,Context被归类为高级部分,属于React的高级API,但官方并不建议在稳定版的App中使用Context。

不过,这并非意味着我们不需要关注Context。事实上,很多优秀的React组件都通过Context来完成自己的功能,比如react-redux的< Provider />,就是通过Context提供一个全局态的store,拖拽组件react-dnd,通过Context在组件中分发DOM的Drag和Drop事件,路由组件react-router通过Context管理路由状态等等。在React组件开发中,如果用好Context,可以让你的组件变得强大,而且灵活。

简单说就是,当你不想在组件树中通过逐层传递props或者state的方式来传递数据时,可以使用Context来实现跨层级的组件数据传递,来,我们学它吧.

 

使用props或者state传递数据,数据自顶下流:

 

 

使用Context,可以跨越组件进行数据传递:

 

 

2.如何使用Context

如果要Context发挥作用,需要用到两种组件,一个是Context生产者(Provider),通常是一个父节点,另外是一个Context的消费者,通常是一个或者多个子节点。所以Context的使用基于生产者消费者模式

对于父组件,也就是Context生产者,需要通过一个静态属性childContextTypes声明提供给子组件的Context对象的属性,并实现一个实例getChildContext方法,返回一个代表Context的纯对象 。

import React from 'react';
const ThemeContext = React.createContext({
  background: 'red',
  color: 'white'
});
export default ThemeContext;
//通过静态方法React.createContext()创建一个Context对象,这个Context对象包含两个组件,<Provider />和<Consumer />
 

import React from 'react';
import ThemeContext from './ThemeContext.js';
import Header from './Header.js';
class App extends React.Component {
  render () {
    return (
      <ThemeContext.Provider value={{background: 'green', color: 'white'}}>
        <Header />
      </ThemeContext.Provider>
    );
  }
}
import React from 'react';
import Title from './Title.js';
class Header extends React.Component {
  render () {
    return (
      <Title>Hello React Context API</Title>
    );
  }
}
export default Header;
 

​
import React from 'react';
import ThemeContext from './ThemeContext.js';
class Title extends React.Component {
  render () {
    return (
      <ThemeContext.Consumer>
        {context => (
          <h1 style={{background: context.background, color: context.color}}>
            {this.props.children}
          </h1>
        )}
      </ThemeContext.Consumer>
    );
  }
}
Title.contextType = ThemeContext
export default Title;
​
//<Consumer />的children必须是一个函数,通过函数的参数获取<Provider />提供的Context

 

 

 

3.可以直接获取Context的地方

注意:接受值的后代组件名.contextType = ThemeContext

 

在导出组件之前,给组件写一个contextType 属性=上下文对象Themectx;

 

实际上,除了实例的context属性(this.context),React组件还有很多个地方可以直接访问父组件提供的Context

类组件:

  • constructor(props, context)

  • componentWillReceiveProps(nextProps, nextContext)

  • shouldComponentUpdate(nextProps, nextState, nextContext)

  • componetWillUpdate(nextProps, nextState, nextContext)

  • 所有能访问this的地方都可以==>this.context

无状态的函数组件:

const StatelessComponent = (props, context) => (

)

   

标签:context,ThemeContext,React,Hook,Context,组件,import
From: https://www.cnblogs.com/LIXI-/p/16787256.html

相关文章

  • React Hook:无用渲染-PureComponent-shouldCompoent-函数组件
    过渡技术1.1无用的渲染组件是构成React视图的一个基本单元。有些组件会有自己本地的状态(state),当它们的值由于用户的操作而发生改变时,组件就会重新渲染。在一个React......
  • Umi 配置 @umijs/fabric(ESLint+Prettier+Stylelint) + gitHooks + VSCode
    Umi配置@umijs/fabric(ESLint+Prettier+Stylelint)+gitHooks+VSCode顶尖金字教程wywppkd2022年04月23日16:45 ·  阅读745@umijs/fabric 是Umi官......
  • React:独立文件
     可以将ReactJSX代码可以放在一个独立文件上,并在不同的js文件中引入即可AppTop.js文件中:​//定义导出的标签letAppTop=(<div><h1>我是公共标......
  • react基础
     1.jsx语法//1.定义虚拟dom,不要写引号//2.标签中混入js表达式要用{}constmyId="title"constmyData="HELLOREACT"//1.创建虚拟domconstVDOM=(......
  • React:环境安装
    环境安装可以使用node-v查看node.js版本号。$npmconfigsetregistryhttps://r.npm.taobao.org//配过镜像的可以不用再配,也可以不配置直接用npm$cnpminstall-......
  • React Cocurrent 并发性
    其根本原因就是JavaScript是单线程的,那么和react提出Cocurrent类似的概念就是Promise异步?我们并不能同时做两件事而是一件事开始后先onhold然后处理另外一件事最后返回......
  • React:简介
    1、简介React起源于Facebook的内部项目,因为该公司对市场上所有JavaScriptMVC框架,都不满意,就决定自己写一套,用来架设Instagram的网站。做出来以后,发现这套东西很好......
  • React memo & useMemo All In One All In One
    Reactmemo&useMemoAllInOneAllInOneReact.memo()vsuseMemo()https://blog.logrocket.com/react-memo-vs-usememo/https://blog.bitsrc.io/react-memo-vs-us......
  • React SPA 应用 hash 路由如何使用锚点
    1、scrollIntoViewscrollIntoView方法可以让当前的元素滚动到浏览器窗口的可视区域内。它的使用方法如下:varelement=document.getElementById("box");element.scro......
  • React循环DOM时为什么需要添加key
    一、React渲染流程和更新流程react渲染流程:jsx->虚拟dom->真实domreact更新流程:props/state改变->render函数重新执行->生成新的虚拟dom树->新旧虚拟dom树进......