Taro集成Redux快速上手的方法示例


Posted in Javascript onJune 21, 2018

前言的前言

最近被一款来自京东凹凸实验室的多终端开发框架Taro吸粉了,官方对 Taro 的简介是使用React语法,一键生成多终端应用(包括小程序 / H5 / 快应用 / RN 等),而目前 Github 的 Star 也达到了非常可观的数量:4k+。对此,笔者也尝了把鲜,体验了下如何使用Taro写微信小程序。感觉还是十分灵活易用(一气呵成,都没遇到bug!),并且 Taro 还集成了 Redux,解决了小程序没有数据流框架的痛点。

这里贴一个 Taro 的官方文档,有兴趣的同行们可以了解下~也可以和我交流~嘿嘿

Taro集成Redux快速上手的方法示例

前言

Redux是JavaScript 状态容器,提供可预测化的状态管理。一般来说,规模比较大的小程序,页面状态,数据缓存,需要管理的东西太多,这时候引入Redux可以方便的管理这些状态,同一数据,一次请求,应用全局共享。

而Taro也非常友好地为开发者提供了移植的Redux。

依赖

为了更方便地使用Redux,Taro提供了与react-redux API 几乎一致的包 @tarojs/redux 来让开发人员获得更加良好的开发体验。

开发前需要安装redux@tarojs/redux以及一些需要用到的中间件

$ yarn add redux @tarojs/redux redux-action redux-logger
# 或者使用 npm
$ npm install --save redux @tarojs/redux redux-action redux-logger

示例

下面通过实现一个Todolist快速上手Redux。

1. 目录结构

首先通过目录划分我们的store/reducers/actions

Taro集成Redux快速上手的方法示例

分别在文件夹里创建index.js,作为三个模块的主文件。reducersactions里面的内容我们需要规划好功能之后再来处理。

// store/index.js

import { createStore, applyMiddleware } from 'redux'

// 引入需要的中间件
import thunkMiddleware from 'redux-thunk'
import { createLogger } from 'redux-logger'

// 引入根reducers
import rootReducer from '../reducers'

const middlewares = [
 thunkMiddleware,
 createLogger()
]

// 创建store
export default function configStore () {
 const store = createStore(rootReducer, applyMiddleware(...middlewares))
 return store
}

2. 编写Todos

首先在app.js中引入一开始定义好的store,使用@tarojs/redux中提供的Provider组件将前面写好的store接入应用中,这样一来,被Provider包裹的页面都能共享到应用的store

import Taro, { Component } from '@tarojs/taro'
import { Provider } from '@tarojs/redux'

import configStore from './store'
import Index from './pages/index'

import './app.scss'

const store = configStore()

class App extends Component {
 ...
 render () {
  return (
   <Provider store={store}>
    <Index />
   </Provider> 
  )
 }
}

接下来就可以正式开始规划Todos应用的主要功能了。

首先我们可以新建constants文件夹来定义一系列所需的action type常量。例如Todos我们可以先新增ADDDELETE两个action type来区分新增和删除Todo指令。

// src/constants/todos.js

export const ADD = 'ADD'
export const DELETE = 'DELETE'

然后开始创建处理这两个指令的reducer

// src/reducers/index.js

import { combineReducers } from 'redux'
import { ADD, DELETE } from '../constants/todos'

// 定义初始状态
const INITIAL_STATE = {
 todos: [
  {id: 0, text: '第一条todo'}
 ]
}

function todos (state = INITIAL_STATE, action) {
 // 获取当前todos条数,用以id自增
 let todoNum = state.todos.length
 
 switch (action.type) { 
  // 根据指令处理todos
  case ADD:   
   return {
    ...state,
    todos: state.todos.concat({
     id: todoNum,
     text: action.data
    })
   }
  case DELETE:
   let newTodos = state.todos.filter(item => {
    return item.id !== action.id
   })
   
   return {
    ...state,
    todos: newTodos
   }
  default:
   return state
 }
}

export default combineReducers({
 todos
})

接着在action中定义函数对应的指令。

// src/actions/index.js

import { ADD, DELETE } from '../constants/todos'

export const add = (data) => {
 return {
  data,
  type: ADD
 }
}

export const del = (id) => {
 return {
  id,
  type: DELETE
 }
}

完成上述三步之后,我们就可以在Todos应用的主页使用相应action修改并取得新的store数据了。来看一眼Todos的index.js

// src/pages/index/index.js

import Taro, { Component } from '@tarojs/taro'
import { View, Input, Text } from '@tarojs/components'
import { connect } from '@tarojs/redux'
import './index.scss'

import { add, del } from '../../actions/index'

class Index extends Component {
 config = {
  navigationBarTitleText: '首页'
 }

 constructor () {
  super ()

  this.state = {
   newTodo: ''
  }
 }

 saveNewTodo (e) {
  let { newTodo } = this.state
  if (!e.detail.value || e.detail.value === newTodo) return

  this.setState({
   newTodo: e.detail.value
  })
 }

 addTodo () {
  let { newTodo } = this.state
  let { add } = this.props
  
  if (!newTodo) return

  add(newTodo)
  this.setState({
   newTodo: ''
  })
 }

 delTodo (id) {
  let { del } = this.props
  del(id)
 }

 render () {
  // 获取未经处理的todos并展示
  let { newTodo } = this.state
  let { todos, add, del } = this.props 

  const todosJsx = todos.map(todo => {
   return (
    <View className='todos_item'><Text>{todo.text}</Text><View className='del' onClick={this.delTodo.bind(this, todo.id)}>-</View></View>
   )
  })

  return (
   <View className='index todos'>
    <View className='add_wrap'>
     <Input placeholder="填写新的todo" onBlur={this.saveNewTodo.bind(this)} value={newTodo} />
     <View className='add' onClick={this.addTodo.bind(this)}>+</View>
    </View>
    <View>{ todosJsx }</View> 
   </View>
  )
 }
}

export default connect (({ todos }) => ({
 todos: todos.todos
}), (dispatch) => ({
 add (data) {
  dispatch(add(data))
 },
 del (id) {
  dispatch(del(id))
 }
}))(Index)

最后来看一眼实现的效果~~

Taro集成Redux快速上手的方法示例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jquery+thickbox仿校内登录注册框
Jun 07 Javascript
关于JavaScript中var声明变量作用域的推断
Dec 16 Javascript
js每隔5分钟执行一次ajax请求的实现方法
Nov 27 Javascript
使用jQuery仿苹果官网焦点图特效
Dec 23 Javascript
JavaScript函数的调用以及参数传递
Oct 21 Javascript
jquery结合html实现中英文页面切换
Nov 29 Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
Apr 13 jQuery
bootstrap的常用组件和栅格式布局详解
May 02 Javascript
详解Vue组件之间的数据通信实例
Jun 17 Javascript
vue实现商城购物车功能
Nov 27 Javascript
Vue组件创建和传值的方法
Aug 17 Javascript
JavaScript实现表单验证功能
Dec 09 Javascript
vue2.0项目实现路由跳转的方法详解
Jun 21 #Javascript
JS实现快递单打印功能【推荐】
Jun 21 #Javascript
详解javascript中的babel到底是什么
Jun 21 #Javascript
webpack打包react项目的实现方法
Jun 21 #Javascript
Vue Router的懒加载路径的解决方法
Jun 21 #Javascript
详解如何使用webpack打包JS
Jun 21 #Javascript
vue自定义一个v-model的实现代码
Jun 21 #Javascript
You might like
PHP 程序员也要学会使用“异常”
2009/06/16 PHP
PHP如何解决网站大流量与高并发的问题
2011/06/25 PHP
php阻止页面后退的方法分享
2014/02/17 PHP
php强大的时间转换函数strtotime
2016/02/18 PHP
Linux环境下php实现给网站截图的方法
2016/05/03 PHP
php is_writable判断文件是否可写实例代码
2016/10/13 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
一个多次搜索+多次传值的解决方案
2007/01/20 Javascript
整理Javascript数组学习笔记
2015/11/29 Javascript
动态加载js、css的简单实现代码
2016/05/26 Javascript
浅谈JS读取DOM对象(标签)的自定义属性
2016/11/21 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
ionic 3.0+ 项目搭建运行环境的教程
2017/08/09 Javascript
Vue 过滤器filters及基本用法
2017/12/26 Javascript
bing Map 在vue项目中的使用详解
2018/04/09 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
python实现异步回调机制代码分享
2014/01/10 Python
Python实现图像几何变换
2015/07/06 Python
Python遍历pandas数据方法总结
2018/02/09 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
2018/12/12 Python
对python列表里的字典元素去重方法详解
2019/01/21 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
Python中的几种矩阵乘法(小结)
2019/07/10 Python
用Python实现校园通知更新提醒功能
2019/11/23 Python
在Python中实现函数重载的示例代码
2019/12/12 Python
如何使用Python破解ZIP或RAR压缩文件密码
2020/01/09 Python
CSS3制作炫酷的自定义发光文字
2016/03/28 HTML / CSS
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
拉丁舞学习者的自我评价
2013/10/27 职场文书
企业为何需要商业计划书
2013/12/26 职场文书
喝酒检查书范文
2014/02/23 职场文书
三爱活动实施方案
2014/03/19 职场文书
2016党校学习心得体会范文
2016/01/07 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书
Golang 结构体数据集合
2022/04/22 Golang
Python通用验证码识别OCR库ddddocr的安装使用教程
2022/07/07 Python