小程序

Redux详解与在小程序中怎么使用

2018-11-14  本文已影响149人  竹尘居士
redux

什么是Redux

​ Redux我们可以把它理解成一个状态管理器,可以把状态(数据)存在Redux中,以便增、删、改。例如:

  1. 从服务器上取一个收藏列表,就可以把取回来的列表数据用Redux管理,多个页面共享使用,不用把数据传来传去。
  2. A页面改变了一个状态,B页面要收到通知,做相应的操作。

​ Redux是一个给JS应用使用的可预测的状态容器,也就是说结果是可预测的,每一次改动会有确定的结果,正如函数式编程思想里的相同的参数会返回相同的结果。

​ Redux的状态会存储在单一的数据源中(存储在对象树中),这样,读取和共享就非常方便,不必去考虑会取错。状态是只能直接读取的,不能直接修改,修改只能通过发送事件(action)统一处理,这样便于分析事件,也可以避免随处修改状态造成竞态条件。统一处理状态时用纯函数(reducers中的函数)来修改状态,这些函数只是一个勾子,当需要修改状态树时Redux会来调用,你可以编写不同的函数来处理不同action对应的状态,或者复用一个函数来处理多种action。

为什么要用

​ 简单来说就是使不易维护的数据变得维护简单,以小程序举例:多个页面要共享一套数据,而且这些数据是随时可能从网络上获取更新或增减的(如页面跳转时要带数据过去(非基本类型的数据),这时如果用app中的全局变量来暂存,存的变量多了,以后维护是个大麻烦,别人接手代码也会很烦恼。),还有一个地方的数据有改变,其他地方要收到通知等这些场景就可以使用Redux来做,如果你没有遇到这些问题,说明你的项目还没有到这些复杂的阶段,可以暂不考虑用Redux。

Redux的四个部件

redux-recycle

在小程序中使用Redux

先看目录结构:

project
|--app.js
|--libs
|  |--redux-min.js
|--store
|  |--actions
|  |  |--index.js
|  |  |--person.js
|  |--reducers
|  |  |--index.js
|  |  |--person.js
|  |--types
|  |  |--index.js
|  |  |--person.js
|--index.js

以存储人的年龄信息为例说一下步骤:

  1. 引入redux的lib,(redux-min.js)。文章最后有demo,libs文件夹里有可以直接使用的库,下载即可。

  2. 建立actions,reducers,types文件夹,这三个文件夹中的index.js只是为了在有多个文件时做统一导出,如不需要可去掉。

    action:

    // actions/person.js
    function personAction(data) {
        return {
            type: UPDATE_AGE,
            data
        }
    }
    
    export const ageChange = (age = 20) => {
        return personAction({ age: age })
    }
    

    reducers:

    // reducers/person.js
    const person = (state = {}, action) => {
        switch (action.type) {
            case UPDATE_AGE:
                return {
                    ...state,
                    age: action.data.age,
                }
            default:
                return state
        }
    }
    
    export default person
    

    types:

    // types/person.js
    export const UPDATE_AGE='UPDATE_AGE'
    
  3. 配置和创建redux:

    //store/index.js
    import {createStore,combineReducers} from '../libs/redux.min'
    import rootReducer from './reducers/index'
    
    export default function configAndCreateStore(){
        return createStore(combineReducers(rootReducer))
    }
    
  4. 在app.js中引入全局的store,并模拟1秒后通过redux修改年龄:

    import Store from './store/index'
    import { ageChange } from './store/actions/index'
    
    const $store = Store()
    
    App({
      onLaunch: function () {
        const that = this
         //1秒后修改年龄为25岁
        setTimeout(() => {
          that.store.dispatch(ageChange(25))
        }, 1000);
      },
      store: $store,
      globalData: {
        userInfo: null
      }
    })
    
  5. 在页面中订阅状态更改通知,获取新状态,页面生命周期结束时取消订阅:

    // pages/index.js
    
    //获取应用实例
    const app = getApp()
      onLoad: function () {
        this.unSubscribe = app.store.subscribe(() => {
          let person = app.store.getState().person
          console.log('store.subscribe person:', person)
          //这里要做个判断,当收到的状态与页面上已有的状态不一致时才去操作页面,可能会频繁收到订阅消息,要小心操作
        })
      },
      onUnload() {
        this.unSubscribe()
      },
      onShow(){
        //在任何时候都可以获取到当前最新的状态树,要灵活使用
        let person = app.store.getState().person
        console.log('store.subscribe person:', person)
      },
    

    任何时候都可以获取到当前最新的状态树,不一定要在订阅监听器函数中,要灵活使用。

我放在github上的demo: 点击查看

一些使用建议(以网络请求回数据为例)

扩展

​ Redux可以使用中间件来改变action的处理流程,可以分类处理action,如redux-thunk中间件,它可以使dispatch接受一个函数做为action,该函数中可以进行异步网络请求等,从而实现用Redux处理网络请求并管理返回结果。

作者:竹尘居士
博客:http://zhuchenju.com
公众号:竹尘居 (zhuchenju92)

竹尘居
上一篇下一篇

猜你喜欢

热点阅读