详解在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 相关文章推荐
懒就要懒到底——鼠标自动点击(含时间判断)
Feb 20 Javascript
TinyMCE 新增本地图片上传功能
Nov 05 Javascript
我的javascript 函数链之演变
Apr 07 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件。
Dec 26 Javascript
js关于命名空间的函数实例
Feb 05 Javascript
浅谈DOM的操作以及性能优化问题-重绘重排
Jan 08 Javascript
ES6新特性七:数组的扩充详解
Apr 21 Javascript
jquery仿京东商品放大浏览页面
Jun 06 jQuery
如何使用puppet替换文件中的string
Dec 06 Javascript
node.js的Express服务器基本使用教程
Jan 09 Javascript
微信小程序地图绘制线段并且测量(实例代码)
Jan 02 Javascript
javascript 代码是如何被压缩的示例代码
May 06 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/12/06 PHP
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
JS异常处理try..catch语句的作用和实例
2014/05/05 PHP
php+ajax导入大数据时产生的问题处理
2014/06/11 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
利用switch语句进行多选一判断的实例代码
2016/11/14 PHP
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
jQuery学习笔记之DOM对象和jQuery对象
2010/12/22 Javascript
php对mongodb的扩展(小试牛刀)
2012/11/11 Javascript
js获取单选框或复选框值及操作
2012/12/18 Javascript
js实现倒计时时钟的示例代码
2013/12/17 Javascript
jquery中使用循环下拉菜单示例代码
2014/09/24 Javascript
AngularJS语法详解
2015/01/23 Javascript
js实现的牛顿摆效果
2015/03/31 Javascript
实现placeholder效果的方案汇总
2015/06/11 Javascript
js实现汉字排序的方法
2015/07/23 Javascript
javascript操作cookie
2017/01/17 Javascript
Angular浏览器插件Batarang介绍及使用
2018/02/07 Javascript
axios对请求各种异常情况处理的封装方法
2018/09/25 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
2020/09/16 Javascript
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
python实现文本文件合并
2015/12/29 Python
替换python字典中的key值方法
2018/07/06 Python
python自动识别文本编码格式代码
2019/12/26 Python
HTML5 body设置全屏背景图片的示例代码
2020/12/08 HTML / CSS
老海军美国官网:Old Navy
2016/09/05 全球购物
全球度假村:Club Med
2017/11/27 全球购物
澳大利亚便宜的家庭购物网站:CrazySales
2018/02/06 全球购物
Liu Jo西班牙官网:意大利服装品牌
2019/09/11 全球购物
信息技术毕业生自荐信范文
2014/03/13 职场文书
签约仪式主持词
2014/03/19 职场文书
考核评语大全
2014/04/29 职场文书
重阳节活动总结
2014/08/27 职场文书
中秋节随笔
2015/08/15 职场文书
使用这 6个Vue加载动画库来减少我们网站的跳出率
2021/05/18 Vue.js