《ReactNative实战讲义》Redux框架篇---(三)高级知识

| 版权声明:本文为博主原创文章,未经博主允许不得转载。

Redux框架篇系列文章总目录:
《ReactNative实战讲义》Redux框架篇—(一)基础知识
《ReactNative实战讲义》Redux框架篇—(二)基础应用
《ReactNative实战讲义》Redux框架篇—(三)高级知识
《ReactNative实战讲义》Redux框架篇—(四)高级应用

一、简介

Redux本身是同步的Action,但是实战项目中同步是不能满足我们的需求的,反而我们大部分的Action都是异步的,例如:API请求。在介绍Redux的异步用法前我们先了解一下异步和同步的区别。

  • Action发出后,Reducer立刻算出新的State,这叫做同步;
  • Action发出后,过一段时间再执行Reducer,这叫做异步;

接下来我们以异步调用API为例子,整体讲解一下异步Action。

二、详情讲解

1.异步Action请求使用场景分析

异步调用API时,有两个非常关键的时刻:发起请求的时刻,接受到响应的时刻。
一般情况下,这种异步调用API请求都需要dispatch至少三种action:

  • 通知reducer请求开始的action
  • 通知reducer请求成功的action
  • 通知reducer请求失败的action
2.如何实现异步功能

这里需要引入一个新的概念:中间件
目前围绕着Redux框架可使用的中间件相当多,这里介绍一下能够帮助我们实现异步Action的中间件:redux-thunk

(1)改造原理:
  • 将之前定义的同步action创建函数和网络请求结合起来;
  • 使用redux-thunk中间件,action创建函数除了返回action对象外还可以返回函数,此时,这个action创建函数就成为了thunk;
  • 默认情况下,createStore()所创建的Redux store没有使用middleware,所以只支持同步数据流,通过使用applyMiddleware()来增强createStore(),可以帮助你用简便的方式来描述异步的action;
(2)react-thunk工作方式
  • redux-thunk支持异步action,内部包装了store的dispatch()方法,以此来让你dispatch一些除了action以外的其他内容,例如:函数。
  • 你所使用的任何中间件都可以以自己的方式解析你dispatch的任何内容,并继续传递actions给下一个中间件;
  • 当中间件链中的最后一个中间件开始dispatch action时,这个action必须是一个普通对象,这是同步式Redux数据流开始的地方。
(3)代码示例
  • 改造createStore
import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import AppReducer from '../reducers/index';

const store = createStore(
    AppReducer,
    // 增加了applyMiddleware()和react-thunk
    applyMiddleware(
        thunk, // 允许我们 dispatch() 函数
    )
);

export const configureStore = () => {
    // console.log(store.getState());
    // store.subscribe(() =>
    //     console.log(store.getState())
    // );

    return store;
};
  • 改造API请求方法
export const getArticlesList = () => (dispatch) => {
    // TODO dispatch(); 准备请求服务器数据Action
    return fetch(url, {
            method: 'GET',
            headers: {}
        }).then((response)=>{
            if (response.ok) {
                return response.json();
            } 
        }).then((responseJson)=>{
            // TODO dispatch(ActionCreator); 获取网络数据成功Action
        }).catch((error)=>{
            // TODO dispatch(ActionCreator); 网络请求失败Action
        });
};
3. 小结

本篇文章介绍了Redux高级用法中最核心的一点,异步Action;引入了Redux高级用法的新概念,中间件。但是本文讲解的并不细致与全面,本文旨在让大家接受一些关于Redux高级用法的概念、方法、形式,后面我们会通过完整的Demo为大家讲解Redux高级应用的具体实现的样式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值