React16.8定义上下文的3种方式

栏目: 服务器 · 发布时间: 4年前

  • 1、在某些场景下,你想在整个组件树中传递数据,但却不想手动地在每一层传递属性。你可以直接在 React 中使用强大的 contextAPI 解决上述问题
  • 2、在一个典型的 React 应用中,数据是通过 props 属性自上而下(由父及子)进行传递的,但这种做法对于某些类型的属性而言是极其繁琐的(例如:地区偏好, UI 主题),这些属性是应用程序中许多组件都需要的。 Context 提供了一种在组件之间共享此类值的方式,而不必显式地通过组件树的逐层传递 props
  • 3、使用过 express 或者 koa 框架的就会经常使用到上下文来在整个项目中传递数据的。
  • 本文中介绍 react 中几种常见的定义与使用上下文的方式,在 react 的生态圈中 redux , react-router-dom 等库中都使用到上下文来传递数据,理解好 react 上下文对今后看源码都有好处的。

二、在类组件中使用上下文的步骤

  • 1、创建一个上下文(多文件的情况下单独使用一个文件)

    import React, { Component } from 'react'
    
    // 创建一个上下文
    const ColorContext = React.createContext();
    复制代码
  • 2、在根组件中使用上下文的. Provider 注入,需要传递的一个 vaule 的属性(需要传递到下面子组件的数据,子组件只获得到传递的数据)

    export default class ContextComponents1 extends Component {
      constructor(props) {
        super(props);
        this.state = {
          color: '#333',
        }
      }
      changeColor = (color) => {
        this.setState({ color });
      }
      render() {
        const { color } = this.state;
        return (
          <ColorContext.Provider value={{ color, changeColor: this.changeColor }}>
            {/* 只传递一个color和一个changeColor方法,子组件只能从上下文中获得到这两个属性/方法 */}
            <Header />
            <button onClick={() => this.changeColor('yellow')}>黄色</button>
            <button onClick={() => this.changeColor('green')}>绿色</button>
          </ColorContext.Provider>
        )
      }
    }
    复制代码
  • 3、在子组件中使用上下文

    class Header extends Component {
      // 如果子组件中需要使用上下文就定义该行
      static contextType = ColorContext;
      render() {
        console.log(this.context); // 可以获取到根组件中value中传递过来的color和changeColor方法
        return (
          <>
            <h1 style={{ color: this.context.color }}>我是header组件</h1>
            <Title />
          </>
        )
      }
    }
    复制代码

三、函数组件中使用上下文的方式

  • 1、定义上下文

    import React, { Component } from 'react';
    
    const ColorContext = React.createContext();
    复制代码
  • 2、定义根组件

    export default class ContextComponent2 extends Component {
      state = {
        color: '#333',
      }
      changeColor = (color) => {
        this.setState({ color })
      }
      render() {
        const { color } = this.state;
        return (
          <ColorContext.Provider value={{ color }}>
            <Header name={'header'} type={1} />
            <button onClick={() => this.changeColor('yellow')}>黄色</button>
            <button onClick={() => this.changeColor('green')}>绿色</button>
          </ColorContext.Provider>
        )
      }
    }
    复制代码
  • 3、在函数组件中使用

    function Header(props) {
      console.log(props, 'props属性')
      return (
        <ColorContext.Consumer>
          {
            value => {
              console.log(value, '上下文数据')
              return (<h1 style={{ color: value.color }}>我是header组件</h1>)
            }
          }
        </ColorContext.Consumer>
      )
    }
    复制代码

四、使用 hooks 新属性创建上下文

  • 1、创建一个上下文

    import React, { Component, useContext, useState } from 'react';
    const ColorContext = React.createContext();
    复制代码
  • 2、根组件

    export default () => {
      let [color, setColoer] = useState('#333');
    
      return (
        <ColorContext.Provider value={{ color }}>
          <Header />
          <button onClick={() => setColoer('yellow')}>黄色</button>
          <button onClick={() => setColoer('green')}>绿色</button>
        </ColorContext.Provider>
      )
    }
    复制代码
  • 3、在子组件中使用

    function Header(props) {
      let { color } = useContext(ColorContext);
      console.log(color, '上下文');
      return (
        <>
          <h1 style={{ color: color }}>我是header组件</h1>
        </>
      )
    }
    复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

SRE

SRE

贝特西 拜尔 (Betsy Beyer)、等 / 孙宇聪 / 电子工业出版社 / 2016-10-1 / CNY 108.00

大型软件系统生命周期的绝大部分都处于“使用”阶段,而非“设计”或“实现”阶段。那么为什么我们却总是认为软件工程应该首要关注设计和实现呢?在《SRE:Google运维解密》中,Google SRE的关键成员解释了他们是如何对软件进行生命周期的整体性关注的,以及为什么这样做能够帮助Google成功地构建、部署、监控和运维世界上现存最大的软件系统。通过阅读《SRE:Google运维解密》,读者可以学习到......一起来看看 《SRE》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

html转js在线工具
html转js在线工具

html转js在线工具