详解在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 iframe中打开文件,并检测iframe存在否
Dec 28 Javascript
Mootools 1.2教程 设置和获取样式表属性
Sep 15 Javascript
ext 列表页面关于多行查询的办法
Mar 25 Javascript
IE JS无提示关闭窗口不提示的方法
Apr 29 Javascript
ExtJs事件机制基本代码模型和流程解析
Oct 24 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
Mar 17 Javascript
jQuery 获取兄弟元素的几种不错方法
May 23 Javascript
jquery.validate.js插件使用经验记录
Jul 02 Javascript
Javascript检查图片大小不要让大图片撑破页面
Nov 04 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
Mar 23 Javascript
基于javascript的异步编程实例详解
Apr 10 Javascript
关于在LayUI中使用AJAX提交巨坑记录
Oct 25 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/10/09 PHP
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
2008/11/18 PHP
php file_exists 检查文件或目录是否存在的函数
2010/05/10 PHP
php中var_export与var_dump的区别分析
2010/08/21 PHP
php实例分享之html转为rtf格式
2014/06/02 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
2015/08/21 PHP
JQuery Study Notes 学习笔记(一)
2010/08/04 Javascript
json2.js的初步学习与了解
2011/10/06 Javascript
GRID拖拽行的实例代码
2013/07/18 Javascript
JQuery事件e参数的方法preventDefault()取消默认行为
2013/09/26 Javascript
alert出数组中的随即值代码
2014/09/25 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
jquery按回车键实现表单提交的简单实例
2016/05/25 Javascript
JS实现的验证身份证及获取地区功能示例
2017/01/16 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
2018/02/09 Javascript
vue 修改 data 数据问题并实时显示的方法
2018/08/27 Javascript
JS使用cookie保存用户登录信息操作示例
2019/05/30 Javascript
解决layui 表单元素radio不显示渲染的问题
2019/09/04 Javascript
JS实现躲避粒子小游戏
2020/06/18 Javascript
写一个Vue loading 插件
2020/11/09 Javascript
Python使用爬虫猜密码
2016/02/19 Python
详解tensorflow训练自己的数据集实现CNN图像分类
2018/02/07 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
2020/01/04 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
详解python程序中的多任务
2020/09/16 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
python压包的概念及实例详解
2021/02/17 Python
英国广泛的照明产品网站:Lights4living
2018/01/28 全球购物
荷兰照明、灯具和配件网上商店:dmlights
2019/08/25 全球购物
银行实习鉴定
2013/12/13 职场文书
入党积极分子自我鉴定范文
2014/03/25 职场文书
书法大赛策划方案
2014/06/04 职场文书
高中生个性发展自我评价
2015/03/09 职场文书
签约仪式致辞
2015/07/30 职场文书
优秀班干部主要事迹材料
2015/11/04 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书