# Context

用处:提供一种能力,在组件树内传递数据,不需要在每个层级中通过 props 向下传递数据。

# Legacy Context

即将废弃的 Context api,在16.x版本依旧可以使用,之后会被移除。

推荐使用 16.3 版本后提供的新 Context api.

如何更新 context ? 在 props 或 value 发生变化的时候,将会调用 getChildContext 返回一个新的 context.

  getChildContext() {
    return { type: this.state.type}
  }

注意,这种更新 context 的方式将会完全移除,不要这样做。

这种方式带来的问题是,假设context被更新,在多个层级之下,有个节点使用到了 context,这时候。本来这个节点应该更新,但如果该节点父组件的 shouldComponentUpdate 返回了 false 。这时候该节点就不会更新。这是不可控的。

# 基本用法

# React.createContext

  const MyContext = React.createContext(defaultValue)

创建 Context 对象,defaultValue 只在组件没有匹配的 provider 时生效。

# Context.Provider

  <MyContext.Provider value={/* some value */>}

传递数据给子组件,一个 Provider 可以传递给多个 Consumer, 子 Provider 的数据会覆盖父 Provider 的数据。

Provider 的值发生变化时,子 Consumer 都会 re-render, 不受 shouldComponentUpdate 的影响,即使 Consumer 的父组件没有更新。

# Class.Context

在组件内声明 context ,声明完后,组件可以获得最近的组件提供的 context 值,通过 this.context 拿到。

  class MyClass extends React.Componnt {
    // 1. static contextType = MyContext
    ...
    console.log(this.context)
    ...
  }

  // 2. MyClass.contextType = MyContext

# Context.Consumer

  <MyContext.Consumer>
    {value => /* render something based on the context value */}
  </MyContext.Consumer>

利用 context 的值 value 返回一个 react 节点,该节点订阅 context 的变化。

Last Updated: 2/24/2020, 9:11:55 PM