【发布时间】:2021-05-19 18:36:43
【问题描述】:
我正在尝试在 react 中创建一个上下文,该上下文将包含接口定义的一些值(以下示例中的Client)。我的问题是它要求我在状态接口 (ClientState) 中使该字段为空,这意味着我必须在使用上下文的任何地方检查空值。我想避免这种情况。
示例代码:
interface Client {
value1: string,
value2: number
}
interface ClientState {
client?: Client
}
const initialState: ClientState = {
client: undefined
}
const ClientContext = React.createContext<ClientState>(initialState);
export const useClient = (): ClientState => useContext(ClientContext);
export const EmployeeContextProvider = ({ children }: PropsWithChildren<{}>) => {
const [state, setState] = useState({});
// abstracted, not relevant to this problem
const loadFiles = () => {
setState(
{
value1: "test",
value2: 1
}
)
}
useEffect(() => loadFiles(), []);
return (
<ClientContext.Provider value={state}>
{children}
</ClientContext.Provider>
)
}
到目前为止,我已经尝试并认为不满意:
- 为
initialState中的client字段提供一个虚拟对象。这样做的问题在于,它的真实版本有大量这些字段,这意味着大量的伪代码。 - 为
Client接口的成员在useClient()添加检查,与1 相同的问题。
还有一个半相关性,我不需要在初始化之外修改这个上下文,它是只读的就很好。
【问题讨论】:
-
我只想指出,只有在 DOM 中没有可用的匹配上下文时,您才会真正看到
initialState的值。换句话说,只要有合适的 Context 提供者,你实际上永远不会遇到这个值。当您调用useContext(ClientContext)时,您将获得的默认值将是您在EmployeeContextProvider中传递给useState的值。提供给createContext的初始值基本上仅用于调试,从不相关。您可能已经意识到这一点,只是想确定一下。 -
我知道,但这并不能解决字段可以为空的问题,这意味着我每次使用上下文时都必须检查。
-
state的初始值不为空,并且您从未将state的值设置为空,因此它永远不会为空。这意味着,您不需要检查state是否为空,即使它可以为空。我错过了什么吗? -
@HenrikErstad 这个答案有帮助吗? stackoverflow.com/questions/61333188/…
标签: javascript reactjs typescript react-context