Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
432 views
in Technique[技术] by (71.8m points)

reactjs - React state not updating after function call

I'm trying to update my react state before making changes but it is not updating. Changing state is async but I cannot figure out how to make update the state inside my context in the code example below:

const initialState =?{
    user: null
}

const [state, dispatch] = useReducer(reducer, initialState);

const updateUser = async () => {
    const res = await axios.get('currentUser')
    //res.data.user is the user stored in the database
    dispatch({ type: SET_USER, payload: res.data.user })
}

const getUser = async () => {
    try {
        await updateUser()
        if(state.user)?{
            console.log('User is not null')
        } else {
            console.log('User is null')
        }
    } catch (err) {
        //Handle error
    }

}

Here is the reducer:

export default (state, action) => {
    { ... }
    case SET_USER: return { ...state, user: action.payload }
    { ... }
}

I am calling the getUser function inside my component with the useEffect hook:

useEffect(() =>?{
    getUser()
}, [])

This code example always returns User is null because the state is not updated when calling the updateUser function.

Note: This is a simple version of the context and the reducer

question from:https://stackoverflow.com/questions/65922724/react-state-not-updating-after-function-call

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You are waiting for the fetch but not for the state to be updated.

useEffect(() => {
  getUser()
}, [])

useEffect(() => {
  if(state.user) {
        console.log('User is not null')
    } else {
        console.log('User is null')
    }
}, [state.user])

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...