9-异步行为

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

    Time: 20200129

    既然要讲到异步Action,那就需要明确一个概念,什么是同步Action.

    同步Action

    动作分发后,就马上触发store的更新,这种Action就是同步Action.

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

    异步Action

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

    像这种需要获取数据的动作,就是经典的异步Action,因为数据不会立马就拿到,而是有一定的时间差。

    案例

    在本案例中,我们使用API端点获取一组用户列表,然后将其存储到store中。

    使用Redux时,要想清楚三个要点:

    • State ?
    • Action ?
    • Reducers ?

    State

    state = {
      loading: true,
      data: [],
      error: ''
    }
    
    • loading: 用于展示加载状态
    • data: 用户列表
    • error: 展示错误信息

    Actions

    • FETCH_USERS_REQUEST
    • FETCH_USERS_SUCCESS
    • FETCH_USERS_FAILURE

    Reducers

    • case: FETCH_USERS_REQUEST

      • ​loading: true
    • case: FETCH_USERS_SUCCESS

      • loading: false

      • users: data(from API)

    • case: FETCH_USERS_FAILURE

      • loading: fasle
      • error: error(from API)

    代码如下

    上面展示的是思考步骤,现在我们把它们转化为代码:

    const redux = require('redux')
    const createStore = redux.createStore
    
    // 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 store = createStore(reducer)
    

    可以看到,我们先定义好的动作,并假定要传入到action.payload中的数据是从外部加载。

    这些数据以参数的方式进入到action,而数据如何获取则需要中间件来完成。

    END.

    相关文章

      网友评论

        本文标题:9-异步行为

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