import { useState, useEffect } from 'react'
import { useRequest } from 'ahooks'
import { getUserInfoService } from '../services/user'
import useGetUserInfo from './useGetUserInfo'
import { loginReducer } from '../store/userReducer'
import { useDispatch } from 'react-redux'
const useLoadUserData = () => {
const [waitingUserData, setWaitngUserData] = useState(true)
const dispatch = useDispatch()
const { run } = useRequest(
async () => {
const data = await getUserInfoService()
return data
},
{
manual: true,
onSuccess(result) {
const { username, nickname } = result
dispatch(loginReducer({ username, nickname }))
},
onFinally() {
setWaitngUserData(false)
},
}
)
const { username } = useGetUserInfo()
useEffect(() => {
if (username) {
setWaitngUserData(false)
return
}
run()
}, [username])
return { waitingUserData }
}
export default useLoadUserData
useEffect
内的这段逻辑判断username非真的时候会去调用请求获取userinfo, 刷新页面
1.username非真,执行EffectCallback
,触发run
,获取到userinfo后,派发loginReducer,将userinfo存入store中,username转为真
2. 此时点退出登录,派发logoutReducer,设置userinfo的state为initialState,修改了username,产生了副作用,执行EffectCallback
,此时username非真,重复步骤1,自动回到了 manage/list
页面了呀
React18+TS4+Antd5+Next.js13 ,B端+C 端,完整业务
了解课程