详解在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高级程序设计 阅读笔记(七) ECMAScript中的语句
Feb 27 Javascript
ie下jquery.getJSON的缓存问题的处理方法
Mar 29 Javascript
用JavaScript修改CSS属性的代码
May 06 Javascript
分享一个常用的javascript静态类
Dec 31 Javascript
JavaScript多并发问题如何处理
Oct 28 Javascript
详解JS几种变量交换方式以及性能分析对比
Nov 25 Javascript
JS实现浏览器打印、打印预览示例
Feb 28 Javascript
微信小程序数字滚动插件使用详解
Feb 02 Javascript
实用的Vue开发技巧
May 30 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
Apr 22 Javascript
微信小程序自定义modal弹窗组件的方法详解
Dec 20 Javascript
JS Canvas接口和动画效果大全
Apr 29 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将数据库中所有内容生成静态html文档的代码
2010/04/12 PHP
PHP模块 Memcached功能多于Memcache
2011/06/14 PHP
PHP安全防范技巧分享
2011/11/03 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
php面向对象值单例模式
2016/05/03 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
php ajax数据传输和响应方法
2018/08/21 PHP
div移动 输入框不能输入的问题
2009/11/19 Javascript
JS打印gridview实现原理及代码
2013/02/05 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
实现高性能JavaScript之执行与加载
2016/01/30 Javascript
Vue.js实现拖放效果的实例
2016/09/30 Javascript
jQuery实现动态文字搜索功能
2017/01/05 Javascript
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
element-ui 上传图片后清空图片显示的实例
2018/09/04 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
Vue中图片Src使用变量的方法
2019/10/30 Javascript
Vue替代marquee标签超出宽度文字横向滚动效果
2019/12/09 Javascript
vue 如何从单页应用改造成多页应用
2020/10/23 Javascript
python的id()函数解密过程
2012/12/25 Python
centos 下面安装python2.7 +pip +mysqld
2014/11/18 Python
Python中的进程分支fork和exec详解
2015/04/11 Python
python中正则的使用指南
2016/12/04 Python
python安装cx_Oracle模块常见问题与解决方法
2017/02/21 Python
Python实现代码统计工具
2019/09/19 Python
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
Quiksilver美国官网:始于1969年的优质冲浪服和滑雪板外套
2020/04/20 全球购物
网络公司美工设计工作个人的自我评价
2013/11/03 职场文书
《在山的那边》教学反思
2014/02/23 职场文书
创业大赛策划书
2014/03/01 职场文书
小学运动会口号
2014/06/07 职场文书
项目投资合作意向书
2014/07/29 职场文书
中学政教处工作总结
2015/08/13 职场文书
Python+腾讯云服务器实现每日自动健康打卡
2021/12/06 Python