详解在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 相关文章推荐
JS.GetAllChild(element,deep,condition)使用介绍
Sep 21 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
Feb 07 Javascript
简介JavaScript中的sub()方法的使用
Jun 08 Javascript
javascript带回调函数的异步脚本载入方法实例分析
Jul 02 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
Jun 20 Javascript
浅谈JS之tagNaem和nodeName
Sep 13 Javascript
Bootstrap导航条鼠标悬停下拉菜单
Jan 04 Javascript
Vue响应式原理详解
Apr 18 Javascript
angular第三方包开发整理(小结)
Apr 19 Javascript
Vue+Element实现表格编辑、删除、以及新增行的最优方法
May 28 Javascript
微信小程序实现收货地址左滑删除
Nov 18 Javascript
electron-vue开发环境内存泄漏问题汇总
Oct 10 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 深入理解strtotime函数的使用详解
2013/05/23 PHP
深入PHP变量存储的详解
2013/06/13 PHP
php正确输出json数据的实例讲解
2018/08/21 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
2019/12/31 PHP
cloudgamer出品ImageZoom 图片放大效果
2010/04/01 Javascript
jQuery1.5.1 animate方法源码阅读
2011/04/05 Javascript
jquery 元素控制(追加元素/追加内容)介绍及应用
2013/04/21 Javascript
Function.prototype.call.apply结合用法分析示例
2013/07/03 Javascript
jQuery中校验时间格式的正则表达式小结
2013/09/22 Javascript
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
JavaScript DOM节点操作方法总结
2016/08/23 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
JS动态显示倒计时效果
2019/12/12 Javascript
深入理解Antd-Select组件的用法
2020/02/25 Javascript
[52:31]VP vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
实例讲解Python中SocketServer模块处理网络请求的用法
2016/06/28 Python
python绘制中国大陆人口热力图
2018/11/07 Python
Python3多线程基础知识点
2019/02/19 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
2019/06/21 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
python:删除离群值操作(每一行为一类数据)
2020/06/08 Python
解决PDF 转图片时丢文字的一种可能方式
2021/03/04 Python
使用纯 CSS 创作一个脉动 loader效果的源码
2018/09/28 HTML / CSS
印度网上药店:1mg
2017/10/13 全球购物
Bonami斯洛伐克:购买家具和家居饰品
2019/07/02 全球购物
C#中有没有静态构造函数,如果有是做什么用的?
2016/06/04 面试题
大学生简历的个人自我评价
2013/12/04 职场文书
超市开业庆典策划方案
2014/05/14 职场文书
满月酒邀请函
2015/01/30 职场文书
2016年“我们的节日·端午节”活动总结
2016/04/01 职场文书
2016年第16个全民国防教育日宣传活动总结
2016/04/05 职场文书
小学生优秀作文范文(六篇)
2019/07/10 职场文书
MybatisPlus代码生成器的使用方法详解
2021/06/13 Java/Android
浅析Redis Sentinel 与 Redis Cluster
2021/06/24 Redis
Java并发编程必备之Future机制
2021/06/30 Java/Android