在 React 应用中,上下文(context)是一种方便的方式来共享数据。React 官方提供了 createContext
API 来帮助我们创建和使用上下文,但有时候需要更细粒度的控制和更简单的 API。这时候就可以用第三方包 create-react-context
。
安装
使用 npm 进行安装:
npm install create-react-context
或者使用 Yarn:
yarn add create-react-context
创建上下文
首先,我们需要使用 create-react-context
导入 createContext
函数:
import createContext from 'create-react-context';
接着,我们可以使用 createContext
函数来创建一个上下文对象:
const MyContext = createContext();
这个 MyContext
对象包含了两个属性:Provider
和 Consumer
。Provider
是用来提供数据的组件,而 Consumer
则是用来消费数据的组件。
使用上下文
提供数据
要提供数据,我们需要在组件树中包裹 Provider
组件:
<MyContext.Provider value={{name: 'John', age: 30}}> {/* 子组件 */} </MyContext.Provider>
在这个例子中,我们提供了一个包含 name
和 age
属性的对象作为值传递给了 Provider
组件。注意,只要 Provider
的值发生变化,所有使用了这个上下文的组件都会重新渲染。
消费数据
要消费数据,我们可以使用 Consumer
组件:
<MyContext.Consumer> {value => <div>{value.name}, {value.age}</div>} </MyContext.Consumer>
在这个例子中,Consumer
接收一个函数作为子节点,这个函数接收上下文的值作为参数,并返回一个 React 元素。这个元素可以是任何需要上下文数据的组件。
高级用法
默认值
在创建上下文时,我们可以传递一个默认值:
const MyContext = createContext({name: 'Unknown', age: 0});
如果没有在组件树中包裹 Provider
组件提供数据,那么这个默认值就会被使用。
多个上下文
在一个应用中,可能会有多个需要共享数据的地方。这时候,我们可以创建多个上下文对象:
const MyContext1 = createContext(); const MyContext2 = createContext();
然后,在组件中使用对应的上下文对象:
<MyContext1.Provider value={/* 数据 */}> <MyContext2.Provider value={/* 数据 */}> {/* 子组件 */} </MyContext2.Provider> </MyContext1.Provider>
使用 contextType
从 React v16.6 开始,可以使用 static contextType
属性来订阅单一上下文:
class MyClass extends React.Component { static contextType = MyContext; render() { const {name, age} = this.context; return <div>{name}, {age}</div>; } }
在这个例子中,我们将 MyClass
组件订阅到了 MyContext
上下文。这使得我们可以在组件内部通过 this.context
访问到上下文数据。
总结
create-react-context
是一个方便的工具,可以帮助我们更轻松地使用上下文。通过提供一个简单的 API,它让我们更容易地共享数据,并且可以控制数据的更新和渲染的粒度。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/46286