React Context 总结

130 阅读1分钟

Context 是什么

  • 一种状态管理,跟 redux、mobx 差不多。
  • 在React的单向数据流中,复杂的嵌套组合中,底层使用数据,需要使用props层层传递,context 可以避免深层传递,直接使用状态管理。
  • 当外层 Provider 的值发生变更了,内层的 Consumer 会触发渲染

Context 怎么使用

Provider Consumer 模式(生产消费者)

  1. 通过引入 react 暴露的 createContext 创建实例。
import { createContext } from 'react';

const DataContext = createContext();
  1. 使用 Provider 产生传递的数据。
class App extends React.Component {
  render () {
    return (
      <DataContext.Provider value={'testData'}>
        {this.props.children}
      </DataContext.Provider>
    );
  }
}
  1. 使用 Consumer 使用上层对应数据,注意需要使用对应实例获取 Consumer。
class SubApp extends React.Component {
  render () {
    return (
      <DataContext.Consumer>
        {data => <p>{data}</p>}
      </DataContext.Consumer>
    );
  }
}

ContextType 使用数据时更简单

  1. 通过引入 react 暴露的 createContext 创建实例。
import { createContext } from 'react';

const DataContext = createContext();
  1. 使用 Provider 产生传递的数据。
class App extends React.Component {
  render () {
    return (
      <DataContext.Provider value={'testData'}>
        {this.props.children}
      </DataContext.Provider>
    );
  }
}
  1. 将 Context 传递给 classComponent 的 contextType 属性,React.Component 会将其数据引用传递给组件内部 context 属性。
class SubApp extends React.Component {
  static contextType = DateContext;
  
  render () {
    return (
      <DataContext.Consumer>
        <p>{this.context}</p>
      </DataContext.Consumer>
    );
  }
}
  1. 所以你会发现,React.component 内部做的引用变更,变更到 context,所以我们能得出一些 ContextType 的使用限制。
    • 只能在 ClassCompoent 中使用 ContextType,因为ClassComponent 内部会做 context 得引用变更。
    • 单个组件无法使用多个 Context 数据实例,因为内部使用单一 context 属性做引用。

拓展

怎么将含有 ContextType 的 ClassComponnts 改成FunctionComponents。

方法一

使用 Provider Consumer 模式去使用 Context,这样就不依赖 ClassComponent 内部对 context 得引用处理。

方法二

使用官方提供 useContext 的 hooks 进行替换使用