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 相关文章推荐
ASP SQL防注入的方法
Dec 25 Javascript
javascript学习笔记(十七) 检测浏览器插件代码
Jun 20 Javascript
如何学习Javascript入门指导
Nov 01 Javascript
在JS中如何调用JSP中的变量
Jan 22 Javascript
js与jquery实时监听输入框值的oninput与onpropertychange方法
Feb 05 Javascript
angularJS 中input示例分享
Feb 09 Javascript
jQuery编程中的一些核心方法简介
Aug 14 Javascript
JavaScript中instanceof运算符的使用示例
Jun 08 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
Nov 24 Javascript
jQuery File Upload文件上传插件使用详解
Dec 06 Javascript
浅谈struts1 &amp; jquery form 文件异步上传
May 25 jQuery
JS实现导航栏楼层特效
Jan 01 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
改进的IP计数器
2006/10/09 PHP
模仿OSO的论坛(五)
2006/10/09 PHP
深入apache配置文件httpd.conf的部分参数说明
2013/06/28 PHP
开源php中文分词系统SCWS安装和使用实例
2014/04/11 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
2019/03/18 PHP
JS弹出窗口代码大全(详细整理)
2012/12/21 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
2013/11/19 Javascript
用JavaScript实现使用鼠标画线的示例代码
2014/08/19 Javascript
js实现在同一窗口浏览图片
2014/09/17 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
2015/02/28 Javascript
JavaScript使用yield模拟多线程的方法
2015/03/19 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
JS实现iframe自适应高度的方法(兼容IE与FireFox)
2016/06/24 Javascript
jQuery实现的右下角广告窗体跟随效果示例
2016/09/16 Javascript
nodeJS删除文件方法示例
2016/12/25 NodeJs
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
vue vue-Router默认hash模式修改为history需要做的修改详解
2018/09/13 Javascript
基于layPage插件实现两种分页方式浅析
2019/07/27 Javascript
Typescript的三种运行方式(小结)
2019/09/18 Javascript
JS实现炫酷轮播图
2020/11/15 Javascript
[08:44]和酒神一起战斗 DOTA2教你做大人
2014/03/27 DOTA
利用Anaconda简单安装scrapy框架的方法
2018/06/13 Python
Django中日期处理注意事项与自定义时间格式转换详解
2018/08/06 Python
Python正则表达式指南 推荐
2018/10/09 Python
python 将大文件切分为多个小文件的实例
2019/01/14 Python
python gdal安装与简单使用
2019/08/01 Python
python读写csv文件并增加行列的实例代码
2019/08/01 Python
淘宝秒杀python脚本 扫码登录版
2019/09/19 Python
python如何安装下载后的模块
2020/07/03 Python
利用CSS3的3D效果制作正方体
2020/03/10 HTML / CSS
学期自我评价
2014/01/27 职场文书
三分钟英语演讲稿
2014/04/24 职场文书
心理学专业求职信
2014/06/16 职场文书
优秀共产党员事迹材料
2014/12/18 职场文书
护理心得体会范文
2016/01/22 职场文书
上个世纪50年代的可穿戴技术:无线电帽子
2022/02/18 无线电