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

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

  • 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>
        </>
      )
    }
    复制代码

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

查看所有标签

猜你喜欢:

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

正则表达式必知必会(修订版)

正则表达式必知必会(修订版)

福达 (Ben Forta) / 杨涛 / 人民邮电出版社 / 2015-1-1 / 29.00元

《正则表达式必知必会》从简单的文本匹配开始,循序渐进地介绍了很多复杂内容,其中包括回溯引用、条件性求值和前后查找,等等。每章都为读者准备了许多简明又实用的示例,有助于全面、系统、快速掌握正则表达式,并运用它们去解决实际问题。正则表达式是一种威力无比强大的武器,几乎在所有的程序设计语言里和计算机平台上都可以用它来完成各种复杂的文本处理工作。而且书中的内容在保持语言和平台中立的同时,还兼顾了各种平台之......一起来看看 《正则表达式必知必会(修订版)》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具