美文网首页深入浅出Redux系列
21-在组件中使用异步动作(redux-thunk)

21-在组件中使用异步动作(redux-thunk)

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

Time: 20200130

安装必要的包

yarn add axios
yarn add redux-thunk

配置中间件: redux-thunk

store.js

import { createStore, applyMiddleware } from 'redux'
import { rootReducer } from './rootReducer'
import thunk from 'redux-thunk'
import logger from 'redux-logger'
import { composeWithDevTools } from 'redux-devtools-extension'

const store = createStore(rootReducer, 
    composeWithDevTools( applyMiddleware(logger, thunk)
    )
 )

export default store

redux-thunk也是一个中间件,需要通过applyMiddleware使用。

异步Action Creator

修改userActions.js

import 
{ FETCH_USER_REQUEST, 
  FETCH_USER_SUCCESS, 
  FETCH_USER_FAILURE
} 
from './userTypes'
import axios from 'axios'
/**
 * Action Creator接收数据,通过参数的方式接收,然后存到action对象中
 * reducer不用操心数据的问题,只要定义好逻辑即可
 * 即,reducer是纯函数
 */

// 三个Action Creator函数,均为同步Action
export const fetchUserRequest = () => {
    return {
        type: FETCH_USER_REQUEST
    }
}
// 这些参数需要通过外部传入
export const fetchUserSuccess = users => {
    return {
        type: FETCH_USER_SUCCESS,
        payload: users
    }
}
export const fetchUserFailure = error => {
    return {
        type: FETCH_USER_FAILURE,
        payload: error
    }
}

// 异步Action Creator
// 被thunk接管,所以返回一个函数
// 返回的函数不要求是纯函数
export const fetchUserAsync = () => {
    return (dispatch) => {
        // 在真正读取数据前先告知要开始获取数据了
        dispatch(fetchUserRequest)
        axios.get('https://jsonplaceholder.typicode.com/users')
            .then(response => {
                // 分发到同步Action 
                const users = response.data
                dispatch(fetchUserSuccess(users))
            })
            .catch(error => {
                const errorMessage = error.message
                dispatch(fetchUserFailure(errorMessage))
            })
    }
}
// 只要dispatch就可以把数据存储到action.payload

同步异步Action Creator都写在一起,同步Action Creator是为异步服务,最后只需要暴露异步Action Creator即可。

UserContainer.js

import React, { useEffect } from 'react'
import { connect } from 'react-redux'
import { fetchUserAsync } from '../redux'

// 解构props
function UserContainer({userData, fetchUsers}) {
    // dispatch only once
    useEffect(() => {
        fetchUsers()
    }, [])

    return userData.loading 
        ? <h2>Loading</h2> 
        : (userData.error 
            ? <h2>{userData.error}</h2>
            : (<div>
                <h2>Users List</h2>
                <div>
                    {userData && userData.users && userData.users.map(user => <p>{user.name}</p>)}
                </div>
                
               </div>))
                   
}

const mapStateToProps = (state, ownProps) => {
    return {
        userData: state.user
    }
}

const mapDispatchToProps = (dispatch, ownProps) => {
    return {
        fetchUsers: () => dispatch(fetchUserAsync())
    }
}

export default connect(mapStateToProps, 
    mapDispatchToProps)
(UserContainer)

END.

相关文章

  • 21-在组件中使用异步动作(redux-thunk)

    Time: 20200130 安装必要的包 配置中间件: redux-thunk store.js redux-t...

  • redux-thunk

    redux-thunk 是一款redux中间件 工作流程 目前是先处理异步在派发动作 使用 redux-thunk...

  • 高级

    异步 Action 通过 redux-thunk ,在 action 中 dispatch action ,可以是...

  • vue3 + vite实现异步组件和路由懒加载

    在 Vue2 中,异步组件处理使用 import 就可以很轻松实现。但是在Vue 3.x 中,对异步组件的使用跟 ...

  • nuxt入门教程(九)异步获取数据

    如何使用异步数据? 官方:不能在组件中使用异步。但是你可以在父级使用异步,在通过组件传值的方法传给你的组件。 所以...

  • Vue的异步组件

    异步组件,顾名思义,按需加载组件。 在vue的文档中,除了异步组件的高级使用方法外,介绍了三个异步组件的解决方案 ...

  • React 之 Redux 异步处理——redux-thunk

    什么是 redux-thunk redux-thunk 是一个中间件,专门用来解决 action 中的异步处理。 ...

  • redux之applyMiddleware源码解析

    在使用redux开发时,使用中间件能够让我们更灵活地解锁更多“姿势”,比如使用redux-thunk就可以进行异步...

  • redux-thunk

    一、redux-thunk介绍redux-thunk用于处理异步action,同类型的有redux-saga 二、...

  • 2020-05-28 react hooks useState

    class 组件 使用class组件时,setState 方法是异步的,你可以在steState的第二个参数中设置...

网友评论

    本文标题:21-在组件中使用异步动作(redux-thunk)

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