React有上下文的原因是允许多个兄弟组件共享一块状态数据。这是允许两个不相关的组件读写共享变量的首选方法。它之所以必要是因为React没有办法轻松地将数据值提供给多个屏幕,而不实际在屏幕之间传递该数据。相反,它允许每个屏幕在需要时访问数据。
因此... 实现需要创建一个组件,称为Context.Provider
组件,然后您必须将需要访问共享数据的组件包装在Context.Provider
内部。但为什么?为什么要求这样做呢?Context
旨在共享数据,使得不属于同一层级的组件能够进行通信,但却需要将组件置于层次结构中才能实现这一目的?
如果能够简单地放弃使用Context.Provider的要求,则使用useContext
函数默认提供对一组变量的访问将更加直接且同样有效:
// In ctx.js
import React from 'react';
export default CTX = React.createContext({val: "value"});
// In compA.js
import CTX from './ctx.js';
import {useContext} from 'react';
function A(props) {
var [context, setContext] = useContext(CTX);
console.log(context); //Logs {val: 'value'};
setContext({val: "newValue"});
}
然后稍后,假设组件B在组件A之后渲染:
import CTX from './ctx.js';
import {useContext} from 'react';
function B(props) {
var [context, setContext] = useContext(CTX);
console.log(context); //Logs {val: 'newValue'};
}
如果上述用法实际可行,则解决了“在不相关组件之间共享数据”的任务,比要求在上下文文件中定义整个新组件要简单得多。此解决方案更好,因为:
1. 不需要重构应用程序。您不需要在提供程序中包装组件。
2. 任何组件都可以轻松地请求任何共享状态,并且可以轻松设置共享状态。
3. 更易于理解,涉及的代码更少(导入一行代码和启动上下文一行代码)。
4. 不会有任何牺牲。该方法允许在组件之间轻松共享状态,这正是上下文存在的全部原因。我疯了吗?我们是否有绝对需要将组件包装在特殊组件中以共享数据的合法原因?..为什么共享状态不能独立存在?就像他们选择了一个糟糕的解决方案一样...为什么要求每个开发人员在使用共享状态之前将其组件包装在另一个组件中,为什么不让开发人员在需要使用它时直接使用该共享状态而不是跳过一个环节?请有人教育我。
编辑:一个答案说,根据我的描述,我们将无法使用单个组件访问多个上下文。那是假的。使用我的描述方法实际上更容易。
// In context.js
export const CTX = React.createContext({val: "val"});
export const CTX2 = React.createContext({val2: "val2"});
// In app.js
function App(props) {
const [state, setState] = useContext(CTX);
const [state2, setState2] = userContext(CTX2);
return (<></>);
}
简单易懂。不需要使用Context.Provider
。这是在一个组件中使用多个上下文,只需要使用两个调用useContext
,而不是将整个应用程序包装在两个嵌套的上下文中,这就是当前Context.Provider
方法所必须要做的...