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

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

查看所有标签

猜你喜欢:

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

Inside Larry's and Sergey's Brain

Inside Larry's and Sergey's Brain

Richard Brandt / Portfolio / 17 Sep 2009 / USD 24.95

You’ve used their products. You’ve heard about their skyrocketing wealth and “don’t be evil” business motto. But how much do you really know about Google’s founders, Larry Page and Sergey Brin? Inside......一起来看看 《Inside Larry's and Sergey's Brain》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器