详解在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 相关文章推荐
用javascript获取地址栏参数
Dec 22 Javascript
张孝祥JavaScript学习阶段性总结(2)--(X)HTML学习
Feb 03 Javascript
javascript 简单抽屉效果的实现代码
Mar 09 Javascript
防止xss和sql注入:JS特殊字符过滤正则
Apr 18 Javascript
基于BootStrap Metronic开发框架经验小结【四】Bootstrap图标的提取和利用
May 12 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
Mar 13 Javascript
利用ES6的Promise.all实现至少请求多长时间的实例
Aug 28 Javascript
用jquery获取select标签中选中的option值及文本的示例
Jan 25 jQuery
手写简单的jQuery雪花飘落效果实例
Apr 22 jQuery
vue项目中在外部js文件中直接调用vue实例的方法比如说this
Apr 28 Javascript
vue-router 前端路由之路由传值的方式详解
Apr 30 Javascript
Javascript异步执行不按顺序解决方案
Apr 30 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 第三节 变量介绍
2012/04/28 PHP
从PHP的源码中深入了解stdClass类
2014/04/18 PHP
PHP之sprintf函数用法详解
2014/11/12 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
2017/08/14 PHP
Gambit vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
Jquery 动态添加按钮实现代码
2010/05/06 Javascript
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
如何使用Javascript正则表达式来格式化XML内容
2013/07/04 Javascript
基于jquery扩展漂亮的下拉框可以二次修改
2013/11/19 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
2014/01/14 Javascript
把jQuery的类、插件封装成seajs的模块的方法
2014/03/12 Javascript
jQuery中:checked选择器用法实例
2015/01/04 Javascript
基于Layer+jQuery的自定义弹框
2020/05/26 Javascript
Angular2实现自定义双向绑定属性
2017/03/22 Javascript
在 webpack 中使用 ECharts的实例详解
2018/02/05 Javascript
jQuery实现模拟搜索引擎的智能提示功能简单示例
2019/01/27 jQuery
JS随机密码生成算法
2019/09/23 Javascript
jQuery实现弹幕特效
2019/11/29 jQuery
基于Vue.js+Nuxt开发自定义弹出层组件
2020/10/09 Javascript
Python struct.unpack
2008/09/06 Python
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
2018/02/03 Python
Python快速查找list中相同部分的方法
2018/06/27 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
2018/12/20 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
python中的TCP(传输控制协议)用法实例分析
2019/11/15 Python
关于python pycharm中输出的内容不全的解决办法
2020/01/10 Python
施华洛世奇天猫官方旗舰店:SWAROVSKI
2017/04/17 全球购物
美国折扣网站:jClub
2017/08/07 全球购物
荷兰鞋子在线:Nelson Schoenen
2017/12/25 全球购物
早餐连锁店计划书
2014/01/08 职场文书
夫妻双方自愿离婚协议书怎么写
2014/12/01 职场文书
解除处分决定书
2015/06/25 职场文书
党章党规党纪学习心得体会
2016/01/14 职场文书
HTML5 新增内容和 API详解
2021/11/17 HTML / CSS
浅谈Node的内存泄露问题
2022/05/06 NodeJs