我的代码看起来像这样:
SomeContext.ts:
export interface SomeContext {
someValue: string;
someFunction: () => void;
}
export const defaultValue: SomeContext = {
someValue: "",
someFunction: () => {},
};
export const SomeContext = React.createContext<SomeContext>(defaultValue);
SomeComponent.tsx:
function SomeComponent() {
const [someValue, setSomeValue] = useState(defaultValue.someValue);
return (
<SomeContext.Provider value={{ someValue, setSomeValue }}>
{/*...*/}
</SomeContext.Provider>
);
}
让我感到困扰的是,我必须使用defaultValue
来初始化上下文和控制该上下文的状态。
难道没有更直接的方法来创建一个由状态控制的上下文吗?我的意思是,难道没有一种方法可以单独初始化状态和上下文吗?这里的最佳做法是什么?
我尽量不给给予someContext
一个默认值,但是Typescript(也许这样做是正确的)给出了一个警告。
4条答案
按热度按时间qjp7pelc1#
下面是我用来创建标准化上下文的抽象
然后就这样使用了。您可以导入
useProvider
以访问所需位置的数据和setter这个函数是一个抽象出状态管理的工厂(通过
useReducer
+Context
)。将makeUseProvider
转换为初始状态。这将是初始值,不需要在其他任何地方重新定义。Provider
是高阶分量。这与在上下文中 Package 一组组件是一样的。您可以用它 Package 最顶层的组件,并且状态管理将在组件层次结构中的所有子组件中可用updateState
接受已定义数据结构的子集(makeUseProvider
的初始状态),并将以前的状态与新数据合并。s3fp2yjn2#
我同意,必须定义(和维护)默认状态是令人讨厌的(特别是当有几个状态值时)。我通常采取以下方法:
注意:这个样板文件的大部分可以抽象成一个helper/factory函数(很像@Andrew的
makeUseProvider
),但我们发现这使得开发人员更难调试。事实上,当你自己在6个月后重新审视代码时,很难弄清楚发生了什么。所以我更喜欢这种明确的方法。pw9qyyiw3#
SomeContext.ts无需使用defaultValue
在您的SomeComponent.tsx
这种方法可以使您的代码更具可读性和可维护性。
baubqpgj4#
你可以这样写typeScript:
SomeContext.tsx:
定义你的上下文,不需要在这里定义默认值。
SomeComponent.tsx:
定义使用上下文的组件。
App.tsx
使用SomeContext.Provider Package 应用程序。
我认为这种方法通常被认为是在TypeScript中使用React Context的最佳方法。