详解在React里使用"Vuex"


Posted in Javascript onApril 02, 2018

一直是Redux的死忠党,但使用过Vuex后,感叹于Vuex上手之快,于是萌生了写一个能在React里使用的类Vuex库,暂时取名 Ruex 。

如何使用

一:创建Store实例:

与vuex一样,使用单一状态树(一个对象)包含全部的应用层级状态(store)。

store可配置state,mutations,actions和modules属性:

  1. state :存放数据
  2. mutations :更改state的唯一方法是提交 mutation
  3. actions :Action 提交的是 mutation,而不是直接变更状态。Action 可以包含任意异步操作,触发mutation,触发其他actions。

支持中间件:中间件会在每次mutation触发前后执行。

store.js:

import {createStore} from 'ruex'
const state = {
 total_num:1111,
}
const mutations = {
 add(state,payload){
 state.total_num += payload
 },
 double(state,payload){
 state.total_num = state.total_num*payload
 },
}
const actions = {
 addAsync({state,commit,rootState,dispatch},payload){
 setTimeout(()=>{
 commit('add',payload)
 },1000)
 },
 addPromise({state,commit,rootState,dispatch},payload){
 return fetch('https://api.github.com/search/users?q=haha').then(res=>res.json())
 .then(res=>{
 commit('add',1)
 dispatch('addAsync',1)
 })
 },
 doubleAsync({state,commit,rootState,dispatch},payload){
 setTimeout(()=>{
 commit('double',2)
 },1000)
 },
 doublePromise({state,commit,rootState,dispatch},payload){
 return fetch('https://api.github.com/search/users?q=haha').then(res=>res.json())
 .then(res=>{
 commit('double',2)
 dispatch('doubleAsync',2)
 })
 },
}
// middleware
const logger = (store) => (next) => (mutation,payload) =>{
 console.group('before emit mutation ',store.getState())
 let result = next(mutation,payload)
 console.log('after emit mutation', store.getState())
 console.groupEnd()
}
// create store instance
const store = createStore({
 state,
 mutations,
 actions,
},[logger])
export default store

将Store实例绑定到组件上

ruex提供Provider方便store实例注册到全局context上。类似react-redux的方式。

App.js:

import React from 'react'
import {Provider} from 'ruex'
import store from './store.js'
class App extends React.Component{
 render(){
 return (
  <Provider store={store} >
  <Child1/>
  </Provider>
 )
 }
}

使用或修改store上数据

store绑定完成后,在组件中就可以使用state上的数据,并且可以通过触发mutation或action修改state。具体的方式参考react-redux的绑定方式:使用connect高阶组件。

Child1.js:

import React, {PureComponent} from 'react'
import {connect} from 'ruex'
class Chlid1 extends PureComponent {
 state = {}
 constructor(props) {
 super(props);
 }

 render() {
 const {
 total_num,
 } = this.props
 return (
 <div className=''>
 <div className="">
 total_num: {total_num}
 </div>

 <button onClick={this.props.add.bind(this,1)}>mutation:add</button>
 <button onClick={this.props.addAsync.bind(this,1)}>action:addAsync</button>
 <button onClick={this.props.addPromise.bind(this,1)}>action:addPromise</button>
 <br />
 <button onClick={this.props.double.bind(this,2)}>mutation:double</button>
 <button onClick={this.props.doubleAsync.bind(this,2)}>action:doubleAsync</button>
 <button onClick={this.props.doublePromise.bind(this,2)}>action:doublePromise</button>
 </div>)
 }
}


const mapStateToProps = (state) => ({
 total_num:state.total_num,
})
const mapMutationsToProps = ['add','double']
const mapActionsToProps = ['addAsync','addPromise','doubleAsync','doublePromise']

export default connect(
 mapStateToProps,
 mapMutationsToProps,
 mapActionsToProps,
)(Chlid1)

API:

  1. mapStateToProps :将state上的数据绑定到当前组件的props上。
  2. mapMutationsToProps : 将mutation绑定到props上。例如:调用时通过this.props.add(data)的方式即可触发mutation,data参数会被mutaion的payload参数接收。
  3. mapActionsToProps : 将action绑定到props上。

内部实现

ruex内部使用immer维护store状态更新,因此在mutation中,可以通过直接修改对象的属性更改状态,而不需要返回一个新的对象。例如:

const state = {
 obj:{
 name:'aaaa'
 }
}
const mutations = {
 changeName(state,payload){
 state.obj.name = 'bbbb'
 // instead of 
 // state.obj = {name:'bbbb'}
 },
}

支持modules(暂不支持namespace)

支持中间件。注:actions已实现类似redux-thunk的功能

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

Javascript 相关文章推荐
为jQuery增加join方法的实现代码
Nov 28 Javascript
jquery 之 $().hover(func1, funct2)使用方法
Jun 14 Javascript
JS实现商品倒计时实现代码
May 03 Javascript
探讨js中的双感叹号判断
Nov 11 Javascript
深入理解javascript的执行顺序
Apr 04 Javascript
JS和css实现检测移动设备方向的变化并判断横竖屏幕
May 25 Javascript
ReactNative页面跳转实例代码
Sep 27 Javascript
JS绘制微信小程序画布时钟
Dec 24 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
Mar 16 Javascript
详解微信小程序胶囊按钮返回|首页自定义导航栏功能
Jun 14 Javascript
Node.JS如何实现JWT原理
Sep 18 Javascript
JavaScript WeakMap使用详解
Feb 05 Javascript
Angular2进阶之如何避免Dom误区
Apr 02 #Javascript
Vue项目分环境打包的实现步骤
Apr 02 #Javascript
详解webpack-dev-server的简单使用
Apr 02 #Javascript
webpack v4 从dev到prd的方法
Apr 02 #Javascript
vue axios登录请求拦截器
Apr 02 #Javascript
webpack+react+antd脚手架优化的方法
Apr 02 #Javascript
vue axios请求超时的正确处理方法
Apr 02 #Javascript
You might like
十天学会php之第九天
2006/10/09 PHP
Session的工作方式
2006/10/09 PHP
PHP mail 通过Windows的SMTP发送邮件失败的解决方案
2009/05/27 PHP
PHP XML操作的各种方法解析(比较详细)
2010/06/17 PHP
如何突破PHP程序员的技术瓶颈分析
2011/07/17 PHP
PHP源码之explode使用说明
2011/08/05 PHP
PHP对象相关知识总结
2017/04/09 PHP
php实现构建排除当前元素的乘积数组方法
2018/10/06 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
2019/02/14 PHP
FireFox中textNode分片的问题
2007/04/10 Javascript
FireFox JavaScript全局Event对象
2009/06/14 Javascript
基于jquery的复制网页内容到WORD的实现代码
2011/02/16 Javascript
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
js异步加载的三种解决方案
2013/03/04 Javascript
JavaScript实现的一个倒计时的类
2015/03/12 Javascript
Node.js中Request模块处理HTTP协议请求的基本使用教程
2016/03/31 Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
2016/11/12 Javascript
js实现瀑布流效果(自动生成新的内容)
2017/03/16 Javascript
vue.js动态数据绑定学习笔记
2017/05/19 Javascript
在Create React App中启用Sass和Less的方法示例
2019/01/16 Javascript
Vue运用transition实现过渡动画
2019/05/06 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
2019/06/12 jQuery
Python 爬虫多线程详解及实例代码
2016/10/08 Python
Python 专题六 局部变量、全局变量global、导入模块变量
2017/03/20 Python
django框架之cookie/session的使用示例(小结)
2018/10/15 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
2020/05/22 Python
openCV提取图像中的矩形区域
2020/07/21 Python
Python3.7安装pyaudio教程解析
2020/07/24 Python
英国排名第一的最新设计师品牌手表独立零售商:TIC Watches
2016/09/24 全球购物
美术教学感言
2014/02/22 职场文书
入党函调证明材料
2014/12/24 职场文书
发布会邀请函
2015/01/31 职场文书
增值税发票丢失证明
2015/06/19 职场文书
Python实现简单得递归下降Parser
2022/05/02 Python
MySql数据库 查询时间序列间隔
2022/05/11 MySQL