【发布时间】:2019-04-19 12:38:54
【问题描述】:
下面的代码演示了我如何尝试使用 react 钩子实现 react 的上下文,这里的想法是我将能够轻松地从像这样的任何子组件访问上下文
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: 细绳;密码:字符串; }'。对象字面量只能指定已知 属性,并且 'authState' 不存在于类型 '{ email: string; 密码:字符串; }'。 [2322] index.d.ts(266, 9):预期类型 来自此处在类型上声明的属性“值” 'IntrinsicAttributes & ProviderProps' (属性) authState: { 电子邮件:字符串; 密码:字符串; }
【问题讨论】:
-
你在哪里输入你的上下文
-
@ShubhamKhatri 默认情况下它从
createContext(initialState)继承它,问题是创建超出了功能,因此我无法输入我认为的操作。当它们更新状态时,我需要在我的功能组件中执行这些操作。如果我在函数内移动上下文,我可以轻松地输入动作,但不再导出上下文,我认为会有复杂性,因为反应函数组件在每次渲染时都会重新运行
标签: reactjs typescript react-context react-hooks