Redux Thunk好用吗?优缺点分析都在这!

天美租号

今儿个咱来聊聊Thunk,这玩意儿在Redux里头可是个好帮手,专门对付那些个异步操作,说白就是让你的数据请求啥的更顺溜。

先来个开胃小菜:装Thunk

咱得先把Thunk给弄进项目里。这还不简单?打开你的命令行,敲上这么一句:

Redux Thunk好用吗?优缺点分析都在这!

npm install redux-thunk

或者你用yarn也成:

yarn add redux-thunk

Redux Thunk好用吗?优缺点分析都在这!

安装好,这事儿就算成大半。

接着来,配置你的Store

装好Thunk,接下来得让Redux知道它的存在。找到你配置Redux Store的那块代码,一般在src/store/*src/*,加上几行:


Redux Thunk好用吗?优缺点分析都在这!

import { createStore, applyMiddleware } from 'redux';

import thunk from 'redux-thunk';

import rootReducer from './reducers'; // 你的reducer

const store = createStore(

rootReducer,

applyMiddleware(thunk) // 把thunk塞进去

Redux Thunk好用吗?优缺点分析都在这!

export default store;

瞧见没?就是把thunkapplyMiddleware一下,这步不能少,少Thunk就没法儿干活。

开始动真格:写Action

Redux Thunk好用吗?优缺点分析都在这!

Thunk的精髓就在于,它让你的Action能返回一个函数,而不是一个简单的对象。这函数里头,你想干啥都行,发请求、等结果,随你便。下面是一个例子:


// *

export const fetchData = () => {

return (dispatch) => {

Redux Thunk好用吗?优缺点分析都在这!

dispatch({ type: 'FETCH_DATA_START' }); // 先告诉大家,我要开始取数据

fetch('你的数据地址') // 发请求

.then(response => *())

.then(data => {

dispatch({ type: 'FETCH_DATA_SUCCESS', payload: data }); // 成功,把数据扔给reducer

Redux Thunk好用吗?优缺点分析都在这!

.catch(error => {

dispatch({ type: 'FETCH_DATA_FAILURE', payload: error }); // 失败,也得吱一声

Redux Thunk好用吗?优缺点分析都在这!

看看,这Action返回的函数里头,咱先dispatch一个开始取数据的信号,然后用fetch去取数据,成就把数据dispatch出去,失败也把错误信息dispatch出去。这中间的dispatch就是Redux给的,Thunk在背后默默支持着。

Reducer也得出马

Action写好,Reducer这边也得接招。Reducer就是根据Action的类型,来决定怎么更新数据状态:


Redux Thunk好用吗?优缺点分析都在这!

// *

const initialState = {

data: [],

loading: false,

error: null,

Redux Thunk好用吗?优缺点分析都在这!

const dataReducer = (state = initialState, action) => {

switch (*) {

case 'FETCH_DATA_START':

return {

...state,

loading: true, // 开始取数据,loading设为true

Redux Thunk好用吗?优缺点分析都在这!

error: null,

case 'FETCH_DATA_SUCCESS':

return {

...state,

loading: false, // 成功,loading设为false

Redux Thunk好用吗?优缺点分析都在这!

data: *, // 数据来

case 'FETCH_DATA_FAILURE':

return {

...state,

loading: false, // 失败,loading也设为false

Redux Thunk好用吗?优缺点分析都在这!

error: *, // 错误信息也得存着

default:

return state;

Redux Thunk好用吗?优缺点分析都在这!

export default dataReducer;

Reducer里,咱根据不同的Action类型,分别处理开始取数据、取数据成功、取数据失败这三种情况。这样,你的应用就知道啥时候该显示加载中,啥时候该显示数据,啥时候该显示错误。

一步,用起来!

万事俱备,只欠东风。在你的组件里,把Action给dispatch出去就行:

Redux Thunk好用吗?优缺点分析都在这!


import React, { useEffect } from 'react';

import { useDispatch, useSelector } from 'react-redux';

import { fetchData } from './actions';

function MyComponent() {

Redux Thunk好用吗?优缺点分析都在这!

const dispatch = useDispatch();

const { data, loading, error } = useSelector(state => *); // 假设你的reducer叫dataReducer

useEffect(() => {

dispatch(fetchData()); // 进来就取数据

}, [dispatch]);

if (loading) {

Redux Thunk好用吗?优缺点分析都在这!

return

加载中...

;

if (error) {

return

出错:{*}

;

return (

Redux Thunk好用吗?优缺点分析都在这!

    {*(item => (

Redux Thunk好用吗?优缺点分析都在这!

export default MyComponent;

在这个组件里,咱用useDispatch拿到dispatch函数,用useSelector拿到数据、加载状态和错误信息。一进来就dispatch(fetchData())去取数据,然后根据不同的状态显示不同的内容。齐活儿!

今儿个就聊到这儿。Thunk这玩意儿,用起来不难,关键是得理解它那个返回函数的Action,还有Reducer里头的状态处理。多写几遍,你就熟能生巧!

Redux Thunk好用吗?优缺点分析都在这!

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
验证码
评论列表 (暂无评论,55人围观)

还没有评论,来说两句吧...