Wepy之Redux

学海无涯苦作舟

刚接手小程序第三周...接了一个用状态管理的项目
由于之前有看到大佬写了一篇干货 就转载过来了
如今自己要用了 抽个空自己研究一下

以下内容只是自己对redux的了解 如有错误 希望大神回帖指点

首先接手的项目因为全局变量很多 所以用this.$parent.globalData.变量的方法会比较混乱(当然 你也可以全都用全局变量)
状态管理前期的配置会相对繁琐.. 并且没有全局变量开阔.. 你可能为了一个变量需要写更多的代码 但是对于日后的程序管理 还是很方便的

目前看了下项目的代码 基本都是用来存储变量 应该还会有高阶语法 这里不展开了 ..因为我也不会...这里是对教程的总结 便于自己理解

store---types

types里存储的是触发action的函数名 记住 types的都是函数名 不处理任何逻辑 命名规则是全大写

//location.js
export const CHANGE = 'CHANGE'
export const CHANGECITY = 'CHANGECITY'

↑↑↑这样就定义好了一个函数名 通过types里的index.js 入口文件 导出

//types下的index.js
export * from './location'

store---reducers

//入口文件 把reducers下的所有函数引入 并且通过combineReducers函数导出
import { combineReducers } from 'redux'
import location from './location'

export default combineReducers({
  location
})

接下来让我们看看location.js里是什么样的

import { handleActions } from 'redux-actions'
//这里把types里的函数名引入 注意相对路径
import { CHANGE, CHANGECITY } from '../types/location'
//通过handleActions函数导出
//这里函数接收2个函数 第一个函数为触发方法修改状态,第二个函数为状态里的默认值
export default handleActions({
  [CHANGE](state, action) {
    return {
      ...state,
      postLocation: action.payload.postLocation
    }
  },
  [CHANGECITY](state, action) {
    return {
      ...state,
      cityName: action.payload.cityName
    }
  }
}, {
  postLocation: '',
  cityName: ''
})


//当然也可以按照教程里这样写 应该可读性更高
import { handleActions } from 'redux-actions'
import { CHANGE, CHANGECITY } from '../types/location'
const defaultState = {
  postLocation: '',
  cityName: ''
}
export default handleActions({
  [CHANGE](state, action) {
    return {
      ...state,
      postLocation: action.payload.postLocation
    }
  },
  [CHANGECITY](state, action) {
    return {
      ...state,
      cityName: action.payload.cityName
    }
  }
}, defaultState)

其余的就不展开说了 自己也没搞
之后让我们看看在page里该如何使用把

  import wepy from 'wepy'
  import { connect } from 'wepy-redux' //引入redux
//这里我是把connct当作连接状态管理的中间件
  @connect({
    postLocation(state) {
      return state.location.postLocation
    }
  })
//之后就可以当作自己的变量用this.postLocation来取到值了

这是获取状态的值 那发起action修改值呢 connect接收2个对象 在第二个对象提取reducers

//之前的引入不变 这里只关注@connect如何使用
//首先需要引入types里的方法名
import {CHANGE, CHANGECITY } from '../store/types/location'
//在第二个对象里引入方法名 (key value 一样可以简写)
 @connect({}, {
    CHANGE,
    CHANGECITY 
  })

//自己本身的方法是通过this.CHANGE()调用
//这里有点不同 通过
this.methods.CHANGE({
  postLocation:你要存储的值
})

至此 状态管理的全局变量就到此结束
之后研究一下另外一个例子在补充


中场休息结束啦

继续看看状态的其他用法

//reducers下的list.js
    import { handleActions } from 'redux-actions'
    import { ADD , REMOVE } from '../types/list'
    //这里定义了一个数组 我们也可以把他看成一个循环的列表 key-value自定义
    const defaultState = [
        {
            title : '吃饭' ,
            text : '今天我要吃火锅'
        },
        {
            title : '工作' ,
            text : '今天我要学习Redux'
        }
    ]
    //这里的state 应该指的是上面这个对象
    export default handleActions({
        //添加一条的方法
        [ADD]( state , action ){
            state.push(action.payload)
            return [...state]
        },
        //删除一条的方法
        [REMOVE]( state , action ){
            state.splice( action.payload , 1 );
            return [ ...state ]
    
        }
    },defaultState)


我们看看page里如何使用这两个方法

//某个不知名的page
    <template lang="wxml">
      <view class="container">
        <button @tap="addList">添加</button>
        <view class="box">
            <view class="item" wx:for-items="{{ todoList }}" wx:key="index">
                <view class="title">{{ item.title }}</view>
                <view class="content">{{ item.text }}</view>
                <button type="primary" class="delete" @tap="delete({{index}})">删除</button>
            </view>
        </view>
      </view>
    </template>
    
    <script>
        import wepy from 'wepy'
        import { connect } from 'wepy-redux'
   
    
        export default class Index extends wepy.page {
    
        components = {}
    
        computed = {
            todoList(){
                return wepy.$store.getState().list;
            }
        }
    
        methods = {
            delete(index){
                wepy.$store.dispatch({ type : 'REMOVE' , payload : index })
                },
            addList(){
                wepy.$store.dispatch({ type : 'ADD' , payload : {
                    title : '学习' ,
                    text : '好好学习'
                }})
            }
        }
    
        onLoad () {
            console.log(wepy.$store.getState())
        }
}

这里很奇怪的是方法居然没有引入 直接通过另外一种姿势获取到了方法 不确定这种方法是否可靠...
在计算属性里 添加一个属性 todoList 值为状态里的reducers里的list.js 里面的数据本身就是个数组
通过wepy.$store.getState().list获取到了状态里的值

并且通过wepy.$store.dispatch({type:'',payload:''})的方法来触发了状态里的函数
type应该是定义的函数名 payload为需要传修改的值..由于在方法里传来的值只作为处理的参数 所以原数据并不是赋值了(看来还是要自己会写方法来处理我们存储的状态)
当然 插入一条的数据上例子中是写死的一个对象.我们也可以通过其他姿势去插入我们想要的数据

如果行得通 由此可见 我们可以快速的通过 wepy.$store来连接状态 弃用@connect连接器

!!!注意要在app.wpy 里加上 wepy.$store = store 才可使用下面的方式

通过wepy.$store.getState() 获取状态值

通过wepy.$store.dispatch来触发状态的方法

至此 教程中的方法都走了一遍...希望再接手项目后能上手快速一点

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,881评论 4 368
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,052评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,598评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,407评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,823评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,872评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,037评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,778评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,505评论 1 247
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,745评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,233评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,568评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,231评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,141评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,939评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,954评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,784评论 2 275