一个Time TodoList实例了解redux在wepy中的使用
@subject: wepy-redux-time-todo
@author: leinov
@date:2018-10-30
@notice: 小程序(wepy)开发群110647537 欢迎加入
wepy-redux-time-todo
Use github地址
git clone git@github.com:leinov/wepy-redux-time-todo.git
npm install
npm run dev
添加到微信开发者工具里即可运行
Wiki
创建项目
wepy是腾讯自出的一套小程序框架,基于Vue写法,也可以灵活使用第三方库,对原生的api也做了部分优化,提高了整体代码的可读性和可维护性,也极大的提高了开发效率,极力推荐使用。首先需要安装wepy命令,通过命令创建wepy项目,在执行下面第二句命令过程中会有一些问题,在到是否使用redux的问题时选y,在创建时就会加入redux依赖以及store文件夹
npm install wepy-cli -g //安装全局wepy命令
wepy init standard wepy-redux-time-todo // 创建wepy-redux-time-todo项目
项目结构
执行创建命令后会出现类似以下结构的项目结构(下面是我自己创建文件后的)
|-- dist // 编译后执行文件夹
|-- node_modules
|-- src // 开发文件夹
| |-- components //组件
|-- sec-title.wpy
|-- pages //业务页面
|-- index.wpy
|-- store // redux
|-- actions
|-- index.js
|-- reducers
|-- timeReducer.js
|-- index.js //合并reducer
|-- types
|-- index.js
|-- style //样式
|-- weui.scss
|-- app.wpy //入口
|-- package.json
Redux概念以及使用
Redux主要的作用是管理复杂的数据,多用于操作单页应用中的复杂状态,将整个应用的状态集中放在一个容器里统一管理。作为一个状态容器,他就像一个盒子(store),这个唯一的盒子(整个应用只有一个store)里有很多状态(state), 都以一个对象树的形式储存在store 中。 唯一能改变 state 的办法是触发 action,action是一个简单的对象,用来描述你想要干什么。reducer是一个纯函数来根据action返回的type操作状态变化返回新状态,reducer作为createStore参数返回最新的store,下面我们通过redux官网的代码具体描述redux的执行过程,
Action
action可以理解为动作,用户希望干什么,比如点击一个按钮让页面的数字加1,切换日期,插入数组等,总之是一个希望页面状态发生改变的行为标识。action用一个对象表示,包含一个必须属性type
{type:"INCREMENT"} //表示添加动作
{type:"DECREMENT"} //表示减法动作
{type:"GET_DATA",payload:{}} // 表示获取数据动作并挂载一个数据在payload属性上供reducer使用,多用于异步获取数据,也可以用自己的添加其他属性
Reducer
reducer是一个形式为 (state, action) => state 的纯函数(纯函数概念:不依赖外部环境变量,只依赖内部参数、不会产生副作用、相同的输入确保相同的输出)。描述了 action 如何把 state 转变成下一个 state。state 的形式取决于你自己,可以是基本类型、数组、对象、甚至是 Immutable.js 生成的数据结构。唯一的要点是当 state 变化时需要返回全新的对象,而不是修改传入的参数。
下面例子使用 switch
语句和字符串来做判断,也可以用自己的方式。
function reducer(state = 0, action) {
switch (action.type) {
case 'INCREMENT':
return state + 1;
case 'DECREMENT':
return state - 1;
default:
return state;
}
}
store
redux的createStore方法用于创建应用唯一的store,createStore方法的参数即reducer,用于更新store内state树,通过以下创建就可以把一个初始的{state:0}的这样一个状态存入到store中
import { createStore } from 'redux';
const store = createStore(reducer);
store有几个重要的方法
store.dispatch(action)
//派发事件 表示要干什么store.getState()
// 获取存储在store里的所有状态(数据)store.subscribe(listener)
//手动监听状态变化
dispatch改变状态
store.dispatch是改变状态的唯一方式,dispatch接受一个action参数(做什么),通知reducer需要做出什么样的改变,再更新整个store
store.dispatch({INCREMENT:"INCREMENT"})
这个操作会告诉reducer 当前需要给state做加1操作,
获取state
store.getState() // {state:1}
subscribe监听
store.subscribe(() =>
console.log(store.getState())
);
在dispatch触发状态更新后需要通过subscribe监听才能获得最新的状态,如果在react中使用则需要把视图渲染函数放在监听函数内。
import store from "./redux.js"
store.subscribe(()=>{
ReactDOM.render(<App />, document.getElementById('root'))
});
以上是纯redux的使用,使用起来比较鸡肋,redux大量被使用在react项目中,封装库react-redux提供的Provider和connect可以将react和redux完美结合,使用非常方便。
Redux在wepy中的使用
通过上面的描述应该对redux有了一定的了解,接下来我们看下redux在小程序框架wepy中如何使用,wepy中需要安装wepy-redux依赖,类似react-redux,store文件夹下放redux的操作代码,redux的使用方法都相同,这里我们讲下与react使用不一样的地方
初始化store
首先需要在app.wpy中初始化store
import { setStore } from 'wepy-redux'
import configStore from './store'
const store = configStore()
setStore(store)
wepy中app.wpy编译后为原生小程序中的app.js,app.js在小程序整个执行生命周期里处于最前端,在小程序初始化时来创建store,这样在所有页面都可以使用,等同于react里的Provider
redux-actions
这里使用redux-actions
库来优化reducer里的switch
写法。
import { handleActions } from "redux-actions";
import {
TIME_CONFIG_DATA, // 学员
} from "../types/index";
export default handleActions({
[TIME_CONFIG_DATA](state, action) {
return {
...state,
timeConfigData: action.newData
};
}
}, {
timeConfigData:[], //state初始值
});
connect连接到wepy组件上
connect(states, actions) connect有两个参数,states是整个应用的状态,页面需要使用哪个状态对应获取该状态即可,actions业务操作,是wepy-redux对action的封装,这里我们不用这种方式,自己在action中手动dispatch,如果想要了解详细使用可参考wepy-redux
import { connect } from 'wepy-redux'
@connect({
timeConfigData(state) {
return state.timeReducer.num
}
})
export default class Index extends wepy.page {
// ...
methods = {
// ...
}
// ...
onLoad() {
}
}
使用数据
<template lang="wxml">
<repeat for="{{timeConfigData}}" index="index" item="item" key="key">
</repeat>
</template>
其他方法都与在react中使用相同,通过上面的配置就可以在wepy中使用redux了,详细代码参考code
一个Time TodoList实例了解redux在wepy中的使用的更多相关文章
- React 入门-写个 TodoList 实例
React 是一个用于构建用户界面的 JavaScript 库,主要特点有: 声明式渲染:设计好数据和视图的关系,数据变化 React 自动渲染,不必亲自操作DOM 组件化:页面切分成多个小部件,通过 ...
- 14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例
14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例 下面的例子演示了一个错误可以发生当一个lock 请求会导致一个死锁,例子设计2个客户端,A和B: J ...
- HOOK API (一)——HOOK基础+一个鼠标钩子实例
HOOK API (一)——HOOK基础+一个鼠标钩子实例 0x00 起因 最近在做毕业设计,有一个功能是需要实现对剪切板的监控和进程的防终止保护.原本想从内核层实现,但没有头绪.最后决定从调用层入手 ...
- puppet一个完整的实例
一个具体实例来简单说明puppet的具体结构 创建第一个配置 puppet的组成清单这主要包含这几个部分 资源,文件,模板,节点,类,定义 puppet中有个模块的定义,这个比较重要,基本是puppe ...
- 给easyui datebox时间框控件扩展一个清空的实例
给easyui datebox扩展一个清空的实例 步骤一:拓展插件 /** * 给时间框控件扩展一个清除的按钮 */ $.fn.datebox.defaults.cleanText = '清空'; ( ...
- iOS 9音频应用播放音频之第一个ios9音频实例2
iOS 9音频应用播放音频之第一个ios9音频实例2 ios9音频应用关联 iOS9音频应用中对于在主视图上添加的视图或控件,在使用它们时必须要与插座变量进行关联.ios9插座变量其实就是为主视图中的 ...
- iOS 9音频应用播放音频之第一个ios9音频实例
iOS 9音频应用播放音频之第一个ios9音频实例 第一个ios9音频实例 为了让开发者可以对上面的内容有更加深入的了解,本节将实现播放音频的第一个实例.在此实例中会涉及到项目的创建.界面设计.关联以 ...
- 第一个AngularJS表达式实例
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- 创建一个 Vue 的实例
每个 Vue 应用都是通过 Vue 函数创建一个新的 Vue 实例开始的: var vm = new Vue({ // 选项 }) 选项:el.data.methods el: 类型: ...
随机推荐
- 深入探讨 Java 类加载器(转)
原帖地址:https://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要 ...
- day08_雷神_模块一
# day08 一.模块 回顾相关: 取值顺序: 在局部调用:局部命名空间->全局命名空间->内置命名空间 在全局调用:全局命名空间->内置命名空间 内置函数: globals(), ...
- 七种bond模式说明
第一种模式:mod=0 ,即:(balance-rr) Round-robin policy(平衡抡循环策略) 特点:传输数据包顺序是依次传输(即:第1个包走eth0,下一个包就走eth1….一直循环 ...
- 2.Handler处理器 和 自定义Opener
Handler处理器 和 自定义Opener opener是 urllib2.OpenerDirector 的实例,我们之前一直都在使用的urlopen,它是一个特殊的opener(也就是模块帮我们构 ...
- Maven 集成Tomcat7插件
Maven已经是Java的项目管理标配,如何在JavaEE开发使用Maven调用Web应用,是很多同学关心的问题.本文将介绍,Maven如何介绍Tomcat插件. Maven Tomcat插件现在主要 ...
- node.js实现WebSocket
最近在学习“HTML5游戏开发实战”,其中第8章内容是使用WebSocket来构建多人游戏---<你画我猜>.然而在实现过程中,却一直出错: 客户端请求时,服务器端会报错并终止: 而浏览器 ...
- Android开发教程 - 使用Data Binding Android Studio不能正常生成相关类/方法的解决办法
本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fr ...
- Python小白学习之路(二十五)—【装饰器的应用】
通过一个任务来加深对装饰器的理解和应用 回顾:装饰器的框架 def timmer(func): def wrapper(): func() return wrapper 任务:给以下正在运行的程序加一 ...
- 使用pymysql
安装 pip3 install pymysql 连接.执行sql.关闭(游标) import pymysql mysql_connect_dict={ 'host':'127.0.0.1', 'por ...
- docker学习实践之路[第二站]nginx镜像实践
上一篇文章中已经成功的拉取的nginx的镜像 在本篇文章中则详细介绍docker利用文件卷.断后映射然后进行nginx的配置. 输入一下命令: docker run -d --name mynginx ...