【发布时间】:2022-01-24 01:40:27
【问题描述】:
我最近进入一个项目,在 react 中的 useContext 时看到了一些我以前没有见过的东西。
项目中的全局状态使用它发送到上下文的钩子,然后在稍后调用该钩子时全局状态是可访问的。我看到的问题是在一个地方没有定义全局状态,您可以创建一个带有状态和更新功能的钩子,将其发送给提供者并在项目中的任何地方访问它..
代码:
const initialState = {
id: "MyId",
currency: 'currency',
};
function useCurrencyState() {
initialState.currency = 'newCurrency'
const [currency, setCurrency] = React.useState(initialState);
return {
currency
};
}
export const [useCurrency, CurrencyStoreProvider] = createStoreProvider(useUserState);
提供者:
export function createStoreProvider(useHook) {
const [useContextConsumer, ContextProvider] = generateContext();
const StoreProvider = ({ children }) => {
const state = useHook();
return <ContextProvider value={state}>{children}</ContextProvider>;
};
return [useContextConsumer, StoreProvider];
}
生成上下文函数:
export function generateContext() {
const context = React.createContext(undefined);
const useContextConsumer = () => {
const c = React.useContext(context);
if (!c) {
throw new Error('Component must be wrapped with <Container.Provider>');
}
return c;
};
return [useContextConsumer, context.Provider];
}
商店:
const StoreProvider = ({ children }) => (
<CurrencyStoreProvider>
{children}
</CurrencyStoreProvider>
);
export default StoreProvider;
当你想使用 useCurrency 时
import { useCurrency } from 'store/currency';
const { currency} = useCurrency ();
上面的例子是针对一个钩子的。该项目有 4 个遵循相同的模式,并且该项目有 4 个嵌套的提供程序/上下文。
我最初的想法是它是匿名地改变状态,因为它没有全局定义的状态,也没有捕捉动作以更新全局状态的 reducer。
我说的对吗?这是处理状态的不那么推荐的方式吗?如果我穿了这个图案,如果它有名字,它叫什么?
我正要建议更改为使用 context + useReducer 与 action 和 dispatch 但我需要更好地理解上述内容。
编辑:
为了清楚起见:提供者嵌套如下:
const StoreProvider = ({ children }) => (
<CurrencyProvider>
<UserStoreProvider>
<CartStoreProvider>
<NotificationsStoreProvider>
{children}
</NotificationsStoreProvider>
</CartStoreProvider>
</UserStoreProvider>
</CurrencyProvider>
);
我对这种方法持怀疑态度,拥有 ONE 上下文并使用 useReducer/Redux 来管理状态更新会更有效吗?
我猜上面的例子(编辑部分)是为了防止在状态更新时重新渲染,如果你不使用减速器,这可能是有意义的。
【问题讨论】:
-
我没有看到
setCurrency的用法。所以提供的代码不会改变货币状态。所有其他代码只是使用上下文为较低级别的组件提供状态。通常,上下文可用于简单状态。对于复杂的状态更喜欢 Redux。否则,您将自己编写 redux 逻辑。 -
@Fyodor 这是一个基本示例。还有其他使用 setfunction 的钩子。这里的重点是了解这种架构,并询问这种方法是否有特定的名称,我可以阅读更多内容,以及在多语言站点中处理状态时这是否“正确”。就我个人而言,我更喜欢与减速器相关的全局状态,但我不想在完全理解这一点并权衡利弊之前提出建议
标签: javascript reactjs state provider use-context