详解在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 动态加载 css 方法总结
Jul 11 Javascript
基于jQuery的可以控制左右滚动及自动滚动效果的代码
Jul 25 Javascript
jquery cookie的用法总结
Nov 18 Javascript
Javascript实现苹果悬浮虚拟按钮
Apr 10 Javascript
JS onkeypress兼容性写法详解
Apr 27 Javascript
JS中位置与大小的获取方法
Nov 22 Javascript
使用Browserify来实现CommonJS的浏览器加载方法
May 14 Javascript
Node.js  REPL (交互式解释器)实例详解
Aug 06 Javascript
react用Redux中央仓库实现一个todolist
Sep 29 Javascript
jQuery表单校验插件validator使用方法详解
Feb 18 jQuery
JavaScript多种图形实现代码实例
Jun 28 Javascript
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
Jul 27 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
基于Windows下Apache PHP5.3.1安装教程
2010/01/08 PHP
PHP判断远程url是否有效的几种方法小结
2011/10/08 PHP
php实现上传图片文件代码
2015/07/19 PHP
php批量删除操作代码分享
2017/02/26 PHP
php生成静态页面并实现预览功能
2019/06/27 PHP
json-lib出现There is a cycle in the hierarchy解决办法
2010/02/24 Javascript
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
动态加载jquery库的方法
2014/02/12 Javascript
js打开新窗口方法整理
2014/02/17 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
jQuery的text()方法用法分析
2014/12/20 Javascript
JS 滚动事件window.onscroll与position:fixed写兼容IE6的回到顶部组件
2016/10/10 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
详解微信小程序审核不通过的解决方法
2018/01/17 Javascript
基于node搭建服务器,写接口,调接口,跨域的实例
2018/05/13 Javascript
详解react native页面间传递数据的几种方式
2018/11/07 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
2020/01/16 Javascript
vue+ts下对axios的封装实现
2020/02/18 Javascript
微信小程序如何加载数据库真实数据的实现
2020/03/04 Javascript
JavaScript中的this基本问题实例小结
2020/03/09 Javascript
Python实现CET查分的方法
2015/03/10 Python
Python三级菜单的实例
2017/09/13 Python
python opencv之SURF算法示例
2018/02/24 Python
Python实现FTP弱口令扫描器的方法示例
2019/01/31 Python
英国人最爱的饰品网站:Accessorize
2016/08/22 全球购物
澳大利亚排名第一的儿童在线玩具商店:Toy Galaxy
2018/10/06 全球购物
英语商务邀请函范文
2014/01/16 职场文书
艺术教育实施方案
2014/05/03 职场文书
企业演讲稿范文大全
2014/05/20 职场文书
岗位工作说明书
2014/07/29 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
2014年工商所工作总结
2014/12/09 职场文书
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python
动视暴雪取消疫苗禁令 让所有员工返回线下工作
2022/04/03 其他游戏
5个pandas调用函数的方法让数据处理更加灵活自如
2022/04/24 Python