📜  解释 React 16 中的新 Context API(1)

📅  最后修改于: 2023-12-03 14:57:25.007000             🧑  作者: Mango

解释 React 16 中的新 Context API

React 16 中引入了新的 Context API,它是一种新的跨组件层级共享数据的方式。在之前的版本中,Context API 虽然存在,但很少被使用,因为它的使用方式很难理解和使用。但是在新的 API 中,使用 Context 变得更加自然和直观。

Context 的作用

Context 可以让数据在组件树中传递,而不需要通过 props 一级一级地手动传递。通过 Context,可以实现跨组件层级的数据传递。

举个例子,在多语言应用中,我们需要把语言选择的状态传递给每个子组件,如果使用 props 传递的话,代码会变得非常冗余。使用 Context 就可以轻松解决这个问题。

创建 Context

创建 Context 有两种方式,一种是使用 React.createContext() 方法,另一种是使用类组件中的静态属性 contextType 。

使用 React.createContext()

React.createContext() 方法会返回一个对象,该对象包含了 Provider 和 Consumer 两个属性。Provider 用于传递数据,而 Consumer 用于获取数据。

下面是一个例子:

import React from 'react'

const MyContext = React.createContext()

export default MyContext

在上面的例子中,我们创建了一个名为 MyContext 的 Context 对象。

使用类组件中的静态属性 contextType

类组件中可以添加一个静态属性 contextType ,这个属性的值是一个 Context 对象。类组件中就可以使用 this.context 这个属性直接获得传递的数据。

下面是一个例子:

import React from 'react'
import MyContext from './MyContext'

class MyClassComponent extends React.Component {
  static contextType = MyContext

  render() {
    const { myData } = this.context

    return <div>{myData}</div>
  }
}

export default MyClassComponent

在上面的例子中,我们使用静态属性 contextType 来指定使用哪个 Context 对象,并且可以直接使用 this.context 来获取传递的数据。

Provider

Provider 是用来提供数据的组件,它的作用是把传递给它的数据传递给所有使用它的子组件。

Provider 组件需要接收一个 value 属性,这个属性的值将会传递给所有使用它的子组件。

下面是一个例子:

import React from 'react'
import MyContext from './MyContext'
import ChildComponent from './ChildComponent'

class MyComponent extends React.Component {
  render() {
    return (
      <MyContext.Provider value={{ myData: 'hello world' }}>
        <ChildComponent />
      </MyContext.Provider>
    )
  }
}

export default MyComponent

在上面的例子中,我们把 value 属性设置为 { myData: 'hello world' } ,这个数据将会传递给所有使用 MyContext.Consumer 的子组件。

Consumer

Consumer 是用来获取数据的组件,它的作用是从最近的 Provider 中获取数据并渲染。Consumer 的子组件必须是一个函数,这个函数的参数就是传递给 Provider 的 value 属性的值。

下面是一个例子:

import React from 'react'
import MyContext from './MyContext'

const MyComponent = () => {
  return (
    <MyContext.Consumer>
      {({ myData }) => <div>{myData}</div>}
    </MyContext.Consumer>
  )
}

export default MyComponent

在上面的例子中,我们使用 MyContext.Consumer 来获取数据,并且把数据渲染到页面上。

总结

在 React 16 中,Context 的使用变得更加自然和直观。Context 可以让数据在组件树中传递,而不需要通过 props 一级一级地手动传递。通过 Provider 和 Consumer,我们可以轻松实现跨组件层级的数据传递。