10-redux-thunk使用

作者: 钢笔先生 | 来源:发表于2020-01-29 17:11 被阅读0次

    Time: 20200129

    截屏2020-01-29下午4.54.36.png

    异步Action Creator需要用到同步Action Creator.

    完整代码如下:

    const redux = require('redux')
    const createStore = redux.createStore
    const applyMiddleware = redux.applyMiddleware
    const thunkMiddleware = require('redux-thunk').default
    const axios = require('axios')
    
    // state
    const initialState = {
        loading: false,
        users: [],
        error: ''
    }
    // action
    const FETCH_USERS_REQUEST = 'FETCH_USERS_REQUEST'
    const FETCH_USERS_SUCCESS = 'FETCH_USERS_SUCCESS'
    const FETCH_USERS_FAILURE = 'FETCH_USERS_FAILURE'
    
    // action creator
    const fetchUsersRequest = () => {
        return {
            type: FETCH_USERS_REQUEST,   
        }
    }
    
    const fetchUsersSuccess = users => {
        return {
            type: FETCH_USERS_SUCCESS,
            payload: users
        }
    }
    const fetchUsersFailure = error => {
        return {
            type: FETCH_USERS_FAILURE,
            payload: error
        }
    }
    
    // reducers
    const reducer = (state=initialState, action) => {
        switch (action.type) {
            case FETCH_USERS_REQUEST:
                return {
                    ...state, 
                    loading: true,
                }
            case FETCH_USERS_SUCCESS:
                return {
                    ...state,
                    loading: false,
                    users: action.payload,
                }
            case FETCH_USERS_FAILURE:
                return {
                    ...state, 
                    loading: false,
                    error: action.payload,
                }
            default:
                return state
        }
    }
    // const fetchUsersAsync = () => {
    //     return function(dispatch) {
    //         dispatch({type: FETCH_USERS_REQUEST})
    //         axios.get('https://jsonplaceholder.typicode.com/users')
    //             .then(response => {
    //                 // response.data is the list of users
    //                 dispatch({type: FETCH_USERS_SUCCESS, payload: response.data})
    //             })
    //             .catch(error => {
    //                 dispatch({type: FETCH_USERS_FAILURE, payload: error.message})
    //             })
    //     }
    // }
    
    const fetchUsersAsync = () => {
        return function (dispatch) {
            dispatch(fetchUsersRequest())
            axios.get('https://jsonplaceholder.typicode.com/users')
                .then(response => {
                    // response.data is the list of users
                    const users = response.data.map(user => user.id)
                    dispatch(fetchUsersSuccess(users))
                })
                .catch(error => {
                    const message = error.message
                    dispatch(fetchUsersFailure(message))
                })
        }
    }
    
    const store = createStore(reducer, applyMiddleware(thunkMiddleware))
    store.subscribe(() => console.log(store.getState()))
    
    store.dispatch(fetchUsersAsync())
    

    执行结果:

    { loading: true, users: [], error: '' }
    {
      loading: false,
      users: [
        1, 2, 3, 4,  5,
        6, 7, 8, 9, 10
      ],
      error: ''
    }
    

    用上redux-thunk后,我们就可以构建异步Action Creator,上面的fetchUserAsync就是这样一个函数,它需要返回一个新的函数,并接收dispatch作为参数,并在适当的时机dispatch同步行为。

    END.

    相关文章

      网友评论

        本文标题:10-redux-thunk使用

        本文链接:https://www.haomeiwen.com/subject/mmxbthtx.html