📅  最后修改于: 2023-12-03 14:57:25.007000             🧑  作者: Mango
React 16 中引入了新的 Context API,它是一种新的跨组件层级共享数据的方式。在之前的版本中,Context API 虽然存在,但很少被使用,因为它的使用方式很难理解和使用。但是在新的 API 中,使用 Context 变得更加自然和直观。
Context 可以让数据在组件树中传递,而不需要通过 props 一级一级地手动传递。通过 Context,可以实现跨组件层级的数据传递。
举个例子,在多语言应用中,我们需要把语言选择的状态传递给每个子组件,如果使用 props 传递的话,代码会变得非常冗余。使用 Context 就可以轻松解决这个问题。
创建 Context 有两种方式,一种是使用 React.createContext() 方法,另一种是使用类组件中的静态属性 contextType 。
React.createContext() 方法会返回一个对象,该对象包含了 Provider 和 Consumer 两个属性。Provider 用于传递数据,而 Consumer 用于获取数据。
下面是一个例子:
import React from 'react'
const MyContext = React.createContext()
export default MyContext
在上面的例子中,我们创建了一个名为 MyContext 的 Context 对象。
类组件中可以添加一个静态属性 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 组件需要接收一个 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 是用来获取数据的组件,它的作用是从最近的 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,我们可以轻松实现跨组件层级的数据传递。