【发布时间】:2021-07-26 21:23:04
【问题描述】:
我已经使用 useContext 设置了一个 useReducer 挂钩来接收电子邮件和密码以用于登录目的,我已经创建了一个组件来从服务器获取身份验证令牌。我目前无法弄清楚如何使用返回的 accessToken 更新减速器。
减速器
export const loginInitialState = {
isLogin: false,
accessToken: '',
} as LoginInitialState
//this is the part that is not working
export const loginReducer = async (
state: LoginInitialState,
{ actionType, email, password }: LoginPayload
) => {
switch (actionType) {
case 'login':
const data = await loginRequest(email, password)
console.log(data)
return {
...data,
}
case 'logout':
return {
...loginInitialState,
}
}
}
使用上下文
export const LoginStateContext = createContext<LoginStateContextProps>(false)
export const LoginDispatchContext = createContext<LoginDispatchContextProps>(
() => {}
)
export const AccessTokenContext = createContext<AccessTokenProps>('')
export const LoginProvider = ({
children,
}: React.PropsWithChildren<unknown>) => {
//@ts-ignore
const [isLogin, dispatchLogin] = useReducer(loginReducer, loginInitialState)
return (
<AccessTokenContext.Provider value={isLogin.accessToken}>
<LoginDispatchContext.Provider value={dispatchLogin}>
<LoginStateContext.Provider value={isLogin.isLogin}>
{children}
</LoginStateContext.Provider>
</LoginDispatchContext.Provider>
</AccessTokenContext.Provider>
)
}
获取请求
export const loginRequest = async (email?: string, password?: string) => {
let data: any
await axios
.post(`blah blah blah`, {
emailAddress: email,
password: password,
})
.then((res) => {
data = res.data
})
if (data) {
return {
isLogin: true,
accessToken: data.accessToken,
}
} else {
return { ...loginInitialState }
}
}
调度点
const onLoginClick = () => {
dispatchLogin({ actionType: 'login', email: email, password: password })
}
我可以通过控制台记录返回的身份验证密钥,但我无法让 reducer 更新到返回的状态。
【问题讨论】:
-
我假设您的意思是标题中的“异步”而不是“同步”?
-
啊,是我的错,谢谢
标签: javascript reactjs react-hooks use-context use-reducer