下面的代码演示了我如何尝试使用反应钩子实现反应的上下文,这里的想法是我将能够轻松地从任何子组件访问上下文
const {authState, authActions} = useContext(AuthCtx);
首先,我创建了一个导出上下文和提供程序的文件。
import * as React from 'react';
const { createContext, useState } = React;
const initialState = {
email: '',
password: ''
};
const AuthCtx = createContext(initialState);
export function AuthProvider({ children }) {
function setEmail(email: string) {
setState({...state, email});
}
function setPassword(password: string) {
setState({...state, password});
}
const [state, setState] = useState(initialState);
const actions = {
setEmail,
setPassword
};
return (
<AuthCtx.Provider value={{ authState: state, authActions: actions }}>
{children}
</AuthCtx.Provider>
);
}
export default AuthCtx;
这可行,但我在value
提供者下方出现错误,可能是因为我在其中添加了操作,因此问题是,有没有办法让我保留所有类型的内容并仍然能够导出上下文和提供者?
我相信我也不能createContext
放入我的主要功能,因为它会一直重新创建它?
[ts] 类型 '{ authState: { email: string; 密码:字符串;}; authActions: { setEmail: (email: string) => void; 设置密码:(密码:字符串)=> 无效;}; }' 不可分配给类型 '{ email: string; 密码:字符串;}'。对象字面量只能指定已知属性,并且 'authState' 不存在于类型 '{ email: string; 密码:字符串;}'。[2322] index.d.ts(266, 9):预期类型来自属性“值”,该属性在此处声明类型为“IntrinsicAttributes & ProviderProps<{ email: string; 密码:字符串;}>' (property) authState: { email: string; 密码:字符串;}