前言

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

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

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

使用 Redux 来进行全局变量的管理

1、在pages 同级目录新建4个文件夹。
store、actions、reducers、constants

store: 创建全局单一的store。

actions:用于描述发生什么事件。

reducers:用于action如何改变state树。

constants:用于定义所需的action type常量。

//store/index.js文件

import { createStore, applyMiddleware, compose } from 'redux'
import thunkMiddleware from 'redux-thunk'
import rootReducer from '../reducers' const composeEnhancers =
typeof window === 'object' &&
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({
// Specify extension’s options like name, actionsBlacklist, actionsCreators, serialize...
}) : compose const middlewares = [
thunkMiddleware
] if (process.env.NODE_ENV === 'development') {
middlewares.push(require('redux-logger').createLogger())
} const enhancer = composeEnhancers(
applyMiddleware(...middlewares),
// other store enhancers if any
) export default function configStore () {
const store = createStore(rootReducer, enhancer)
return store
}

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

//app.js
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>
)
}
}

constants文件夹来定义一系列所需的action type常量

//constants/login.js

export const LOGIN_TYPE = "login_type"

然后开始创建处理指令的reducers

// reducers/index.js

import { combineReducers } from 'redux'
import login from "./login" export default combineReducers({
login
})
// reducers/login.js

import {LOGIN_TYPE} from "../constants/login"
const INITIAL_STATE = {
loginType: false
} export default function login (state = INITIAL_STATE, action) {
switch (action.type) {
case LOGIN_TYPE:
return {
...state,
loginType: action.data
}
default:
return state
}
}

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

//actions/login.js

import {LOGIN_TYPE} from "../constants/login"

export const loginTypeFun = (data) => {
return {
type: LOGIN_TYPE,
data: data
}
}

最后实现数据状态的改变

//pages/index/index.js

import Taro, { Component } from '@tarojs/taro'
import { View } from '@tarojs/components'
import { AtButton } from "taro-ui"
import './index.scss'
import { connect } from '@tarojs/redux'
import { loginTypeFun } from '../../actions/login'

@connect(({ login }) => ({
login
}), (dispatch) => ({
changeLoginType(data) {
dispatch(loginTypeFun(data)})
}
})) class Index extends Component {
constructor () {
super(...arguments)
this.state = ({ })
} config = {
navigationBarTitleText: '首页'
} componentWillMount() { } toChangeLogin = (e) => {
this.props.changeLoginType(true)
}
} render () {
return (
<View className='index'>
{this.props.login.loginType}
<AtButton type="primary" onClick={this.toChangeLogin}>改变状态loginType</AtButton>
</View>
)
}
} export default Index

输出结果true

Taro -- 使用 Redux 来进行全局变量的管理的更多相关文章

  1. [Taro] taro中定义以及使用全局变量

    taro中定义以及使用全局变量 错误的姿势 // app.tsx文件中 class App extends Component { componentDidMount() { this.user = ...

  2. flux,redux,vuex状态集管理工具之间的区别

    一:redux和flux的区别 1)redux是flux中的一个实现 2))在redux中我们只能定义一个store,在flux中我们可以定义多个 3)在redux中,store和dispatch都放 ...

  3. Taro -- 定义全局变量

    Taro定义全局变量 方法1:在taro中 getApp()只能取到一开始定义的值,并不能取到改变后的值 // app.js文件中 class App extends Component { cons ...

  4. 使用Redux管理你的React应用

    因为redux和react的版本更新的比较频繁,博客园这里用的redux版本是1.0.1,如果你关心最新版本的使用技巧,欢迎来我的Github查看(https://github.com/matthew ...

  5. Redux管理你的React应用

    使用Redux管理你的React应用   因为redux和react的版本更新的比较频繁,博客园这里用的redux版本是1.0.1,如果你关心最新版本的使用技巧,欢迎来我的Github查看(https ...

  6. 微信小程序里使用 Redux 状态管理

    微信小程序里使用 Redux 状态管理 前言 前阵子一直在做小程序开发,采用的是官方给的框架 wepy , 如果还不了解的同学可以去他的官网查阅相关资料学习:不得不说的是,这个框架确相比于传统小程序开 ...

  7. 小程序第三方框架对比 ( wepy / mpvue / taro )(转)

    文章转自  https://www.cnblogs.com/Smiled/p/9806781.html 众所周知如今市面上端的形态多种多样,手机Web.ReactNative.微信小程序, 支付宝小程 ...

  8. 小程序第三方框架对比 ( wepy / mpvue / taro )

      众所周知如今市面上端的形态多种多样,手机Web.ReactNative.微信小程序, 支付宝小程序, 快应用等,每一端都是巨大的流量入口,当业务要求同时在不同的端都要求有所表现的时候,针对不同的端 ...

  9. Vue学习记录-状态管理

    要解决的问题 平时的系统开发中,基本都会碰到这个权限问题,需要根据用户的登录状态进行处理.最常见的情况就是“先登录,后使用”.除去打包成APP,无法看到连接外,如果地址栏里直接输入地址就能绕过登录的话 ...

随机推荐

  1. k8s从Harbor拉取启动镜像测试

    登陆harbor [root@k8s-master ~]# docker login 192.168.180.105:1180 Username: admin Password: WARNING! Y ...

  2. 【CF1252G】Performance Review(线段树)

    题意: n,q<=1e5,a[i],b[i][j]<=1e9,保证能力值互不相同,询问之间保留前面的影响 思路:其实把大于a[1]的看成0,小于的看成1,设第i天小于a[1]的有b[i]个 ...

  3. C# 字符串的长度问题

    string str = "aa奥奥"; 如果直接取 str.length,取的就是字符的长度,一个汉字也是一个字符,长度就是4. 一个汉字是两个字节,如果需要统计字节数,可以用下 ...

  4. E. Boxers

    E. Boxers 给定N个数字,每个数字可以加一或者减一 使得结果集合中不同数字个数最多 贪心 用桶装数 假如相同的数字$i$超过三个,则上面$i+1$,下面$i-1$都可以分一个 如果相同数字$i ...

  5. [BZOJ3781]:小B的询问(离线莫队算法)

    题目传送门 题目描述 小B有一个序列,包含$N$个$1~K$之间的整数.他一共有$M$个询问,每个询问给定一个区间$[L...R]$,求$\sum \limits_{i=1}^{K}c(i)^2$的值 ...

  6. 深入JavaWeb技术世界15:深入浅出Mybatis基本原理

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  7. JS判断Android、iOS或浏览器的多种方法(四种方法)

    第一种:通过判断浏览器的userAgent,用正则来判断是否是ios和Android客户端. 代码如下: <script type="text/javascript"> ...

  8. Day3 01 枚举

    枚举:关键字 enum  主要为了限定了选择范围,声明了一组相关的值类型的集合. 1.枚举类型,实质上是整整 2.如果不进行赋值操作,枚举类型从0开始递增. 3.枚举不能定义字段 属性  方法. 例如 ...

  9. mycat 配置简介

    最近在看 mycat ,官网: http://www.mycat.io/  上面就有 PDF 的教程下载.但是对于我这个初学者来讲,搭建环境的时候还是有点晕,下面从一个简单的例子来讲解相关配置.我用的 ...

  10. Delphi XE2 之 FireMonkey 入门(8) - TImage

    TImage 主要成员: { 属性 } Bitmap              : TBitmap;        //图像 BitmapMargins        : TBounds;      ...