详解在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 相关文章推荐
可兼容IE的获取及设置cookie的jquery.cookie函数方法
Sep 02 Javascript
node.js中的fs.unlinkSync方法使用说明
Dec 15 Javascript
jQuery+ajax实现文章点赞功能的方法
Dec 31 Javascript
H5移动端图片压缩上传开发流程
Nov 09 Javascript
Bootstrap表单控件学习使用
Mar 07 Javascript
less简单入门(CSS 预处理语言)
Mar 08 Javascript
jQuery遍历节点方法汇总(推荐)
May 13 jQuery
Vue如何实现组件的源码解析
Jun 08 Javascript
react-native之ART绘图方法详解
Aug 08 Javascript
nuxt.js 缓存实践
Jun 25 Javascript
vue-cli 目录结构详细讲解总结
Jan 15 Javascript
基于Vue 撸一个指令实现拖拽功能
Oct 09 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的memcache类分享(memcache队列)
2014/03/26 PHP
ThinkPHP后台首页index使用frameset时的注意事项分析
2014/08/22 PHP
php结合js实现点击超链接执行删除确认操作
2014/10/31 PHP
PHP批量查询WordPress留言者E-mail地址实现方法
2015/02/15 PHP
Zend Framework+smarty用法实例详解
2016/03/19 PHP
Javascript 运动中Offset的bug解决方案
2014/12/24 Javascript
JavaScript将字符串转换成字符编码列表的方法
2015/03/19 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
原生js实现网易轮播图效果
2020/04/10 Javascript
self.attachevent is not a function的解决方法
2017/04/04 Javascript
基于node下的http小爬虫的示例代码
2018/01/11 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
DatePickerDialog 自定义样式及使用全解
2019/07/09 Javascript
vue实现多级菜单效果
2019/10/19 Javascript
Python中用函数作为返回值和实现闭包的教程
2015/04/27 Python
在Linux系统上部署Apache+Python+Django+MySQL环境
2015/12/24 Python
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
Python实现读取并保存文件的类
2017/05/11 Python
python 通过 socket 发送文件的实例代码
2018/08/14 Python
numpy基础教程之np.linalg
2019/02/12 Python
Django基础知识 web框架的本质详解
2019/07/18 Python
在linux系统下安装python librtmp包的实现方法
2019/07/22 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
python路径的写法及目录的获取方式
2019/12/26 Python
Python pip安装第三方库实现过程解析
2020/07/09 Python
Python2及Python3如何实现兼容切换
2020/09/01 Python
小程序canvas中文字设置居中锚点
2019/04/16 HTML / CSS
十岁生日父母答谢词
2014/01/18 职场文书
大学四年个人自我小结
2014/03/05 职场文书
安康杯竞赛活动总结
2014/05/05 职场文书
航空学院求职信
2014/06/11 职场文书
单位工作证明
2014/10/07 职场文书
2014年心理健康教育工作总结
2014/12/06 职场文书
Nginx反向代理至go-fastdfs案例讲解
2021/08/02 Servers