详解在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 相关文章推荐
超级强大的表单验证
Jun 26 Javascript
彪哥1.1(智能表格)提供下载
Sep 07 Javascript
extjs form textfield的隐藏方法
Dec 29 Javascript
Jquery 的扩展方法总结
Oct 01 Javascript
jquery插件制作 自增长输入框实现代码
Aug 17 jQuery
Javascript中Event属性搜集整理
Sep 17 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
Mar 04 Javascript
javascript中scrollTop详解
Apr 13 Javascript
微信小程序保存多张图片的实现方法
Mar 05 Javascript
JS Thunk 函数的含义和用法实例总结
Apr 08 Javascript
jQuery加PHP实现图片上传并提交的示例代码
Jul 16 jQuery
JavaScript的function函数详细介绍
Nov 20 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
使用Yii2实现主从数据库设置
2016/11/20 PHP
php中str_pad()函数用法分析
2017/03/28 PHP
CakePHP框架Model关联对象用法分析
2017/08/04 PHP
laravel 修改记住我功能的cookie保存时间的方法
2019/10/14 PHP
javascript firefox不显示本地预览图片问题的解决方法
2008/11/12 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
2013/04/11 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
AngularJS动态加载模块和依赖的方法分析
2016/11/08 Javascript
jQuery实现导航高亮的方法【附demo源码下载】
2016/11/09 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
2017/09/26 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
详解组件库的webpack构建速度优化
2018/06/18 Javascript
微信小程序开发之改变data中数组或对象的某一属性值
2018/07/05 Javascript
Vue中使用canvas方法总结
2019/02/12 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
python制作抖音代码舞
2019/04/07 Python
用Python抢火车票的简单小程序实现解析
2019/08/14 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
2019/08/19 Python
python读写文件write和flush的实现方式
2020/02/21 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
Django 解决新建表删除后无法重新创建等问题
2020/05/21 Python
keras实现多GPU或指定GPU的使用介绍
2020/06/17 Python
解决Pycharm 运行后没有输出的问题
2021/02/05 Python
ASOS比利时:英国线上零售商及自有品牌
2018/07/29 全球购物
捷克鲜花配送:Florea.cz
2018/10/29 全球购物
Coltorti Boutique官网:来自意大利的设计师品牌买手店
2018/11/09 全球购物
哪些情况下不应该使用索引
2015/07/20 面试题
周年庆典主持词
2014/04/02 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
2021/06/05 Python
一次SQL查询优化原理分析(900W+数据从17s到300ms)
2022/06/10 SQL Server