详解vuex 渐进式教程实例代码


Posted in Javascript onNovember 27, 2018

vuex 渐进式教程,从入门级带你慢慢深入使用vuex。

Vuex 是什么?

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态, 并以相应 的规则保证状态以一种可预测的方式发生变化。

vuex官网: vuex.vuejs.org/zh/guide/

安装

安装vue-cli:

cnpm install -g vue-cli
 vue init webpack vuex

安装vuex

cnpm i vuex --save

1.初级使用方法

// main.js

import Vue from 'vue'
import App from './App'
import router from './router'
import Vuex from 'vuex' // 引入vuex

Vue.config.productionTip = false

Vue.use(Vuex);

let store = new Vuex.Store({ // store 对象
 state:{
  count:0
 }
})

/* eslint-disable no-new */
new Vue({
 el: '#app',
 router,
 store, //使用store,这可以把 store 的实例注入所有的子组件
 components: { App },
 template: '<App/>'
})

此时可以在组件中使用 this.$store.state.count 获取store中state的值。如:

// 在组件的computed中使用
 computed:{
   count(){
   return this.$store.state.count;
   }
 }

想想一下当项目比较大的时候数据繁琐,如果按照上述方法使用vuex,当你打开main.js你看的到场景是比较混乱的,各种数据繁杂在一起,不便于日后的维护。请看下一步:

2.中级使用方法: modules 模块化

state用法

2.1 在main.js中删除下述这部分代码

let store = new Vuex.Store({ // store 对象
 state:{
  count:0
 }
})

2.2. 在src目录下新建store文件夹并在该文件夹下新建index.js文件。 在 store/index.js写入:

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
 strict:true, // 开启严格模式 确保state 中的数据只能 mutations 修改
 state:{
  count:0
 }
})
export default store;

对应的main.js应该写入:

import store from './store'

写到这里,我们在组件里就可以获取到store里的state的值了

2.3 为了方便测试直接在HelloWorld.vue 中使用store

<template>
 <div class="hello">
  <h2>{{count}}</h2>
 </div>
</template>

<script>
export default {
 name: 'HelloWorld',
 computed:{
   count(){
    return this.$store.state.count;
   }
 }
}
</script>

很多时候咱们要对state里的值进行操作,在vuex提供了一个方法mutations

mutations用法(使用mutations可以修改state的值)

在sore\index.js写入:

//
...
 state:{
  count:0
 },
 mutations:{ // 更改数据的方法
  add(state){
   state.count++
  },
  //提交载荷用法
//   add(state,n){ 
//   state.count += n
//  },
  sub(state){
   state.count--
  }
 }
...
//

组件(HelloWorld.vue)中使用mutations里对应的方法:

<template>
 <div class="hello">
  <button @click="add">+</button>
  <h2>{{count}}</h2>
  <button @click="sub">-</button>
 </div>
</template>

<script>
export default {
 name: 'HelloWorld',
 computed:{
   count(){
    return this.$store.state.count;
   }
 },
  methods:{
  add(){
   this.$store.commit('add');
  },
  
  //提交载荷用法
  // add(){ 
  //  this.$store.commit('add',10);
  // },
  
  //对象风格的提交方式
  //  store.commit({
  //   type: 'add',
  //   n: 10
  //   })
  
  sub(){
   this.$store.commit('sub');
  }
 }
}
</script>

此时就可以对count进行修改了。

当你想异步操作的时候,由于mutation必须是同步的这一点,此时不能采用mutation对state 进行修改。action派上用场了,action就是一个函数集合,在里面怎么操作都可以,只要最后触发mutation 就可以了。

注解mutation不能异步操作的原因:

mutations: {
  add (state) {
   api.callAsyncMethod(() => {
  state.count++
  })
 }
}

现在想象,我们正在 debug 一个 app 并且观察 devtool 中的 mutation 日志。每一条 mutation 被记录,devtools 都需要捕捉到前一状态和后一状态的快照。然而,在上面的例子中 mutation 中的异步函数中的回调让这不可能完成:因为当 mutation 触发的时候,回调函数还没有被调用,devtools 不知道什么时候回调函数实际上被调用——实质上任何在回调函数中进行的状态的改变都是不可追踪的。

Action 用法

在sore\index.js写入:

mutations:{ // 更改数据的方法
add(state){
   state.count++
  },
  sub(state){
   state.count--
  }
 },
++++
 actions:{
  add(context){ // context 与 store 实例具有相同方法和属性(但不是store 实例)
   setTimeout(()=>{
    context.commit('add');
   },1000)
  }
 }
++++

组件(HelloWorld.vue)中使用getters里对应的方法:

<template>
 <div class="hello">
  <button @click="add">+</button>
  ++++
  <button @click="add_action">action +</button>
  ++++
  <h2>{{count}}</h2>
  <button @click="sub">-</button>
  <div>
   test: {{doneTodos[0].text}} <br>
   length: {{doneTodosLength}}
  </div>
 </div>
</template>
export default {
 methods:{
  add(){
   this.$store.commit('add');
   // console.log(this);
  },
  sub(){
   this.$store.commit('sub');
  },
  ++++
  add_action(){
   this.$store.dispatch('add');
  }
  ++++
 }
}

看到这里有没有想过当我们使用state中某一个数据时,我们只想用该数据中符合条件的数据。比如:

state:{
  count:0,
  todos: [
   { id: 1, text: 'text1--true', done: true },
   { id: 2, text: 'text2--false', done: false }
  ]
 }

此时我们只想获取state.todos中done为true的数据时我们应该怎么获取?

可能会有以下两种方案:

1.每个在组件中首先获取todos,然后使用filter方法过滤;

2.写一个公共函数在每个组件中调用以下;

如果用到todos中done为true的组件很多,这两种方法都是很不理想的。Vuex为此为我们引入了一个方法Getter。

Getter 用法

官方解释:Vuex 允许我们在 store 中定义“getter”(可以认为是 store 的计算属性)。就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。

在sore\index.js写入:

mutations:{ // 更改数据的方法
  add(state){
   state.count++
  },
  sub(state){
   state.count--
  }
 },
 +++
 getters:{ // 用法类似组件中的 computed, 可以认为是store的计算属性
  doneTodos:state => { // Getter 接受 state 作为其第一个参数:
   return state.todos.filter(todo => todo.done) // -> [{ id: 1, text: 'text1--true', done: true }]
  },
  // Getter 也可以接受其他 getter 作为第二个参数
  doneTodosLength:(state,getters) => {
   return getters.doneTodos.length // -> 1
  },
 +++
 }

组件(HelloWorld.vue)中使用getters里对应的方法:

<template>
 <div class="hello">
  <button @click="add">+</button>
  <h2>{{count}}</h2>
  <button @click="sub">-</button>
+++
  <div>
   test: {{doneTodos[0].text}} <br>
   length: {{doneTodosLength}}
  </div>
+++  
 </div>
</template>
<script>
export default {
 //...
  computed:{
  +++
    doneTodos(){
     return this.$store.getters.doneTodos // -> [{ id: 1, text: 'text1--true', done: true }]
    },
    doneTodosLength(){
     return this.$store.getters.doneTodosLength // -> 1
    }
  +++
 }
}
</script>

本篇代码地址: github.com/xioasa/vue-…

总结

以上所述是小编给大家介绍的vuex 渐进式教程实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
页面载入结束自动调用js函数示例
Sep 23 Javascript
使用js判断TextBox控件值改变然后出发事件
Mar 07 Javascript
js控制鼠标事件移动及移出效果显示
Oct 19 Javascript
实用框架(iframe)操作代码
Oct 23 Javascript
JavaScript获取网页表单提交方式的方法
Apr 02 Javascript
Javascript vue.js表格分页,ajax异步加载数据
Oct 24 Javascript
JS解决移动web开发手机输入框弹出的问题
Mar 31 Javascript
详解使用nvm管理多版本node的方法
Aug 30 Javascript
vue-cli 首屏加载优化问题
Nov 06 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
Jan 19 Javascript
js实现继承的方法及优缺点总结
May 08 Javascript
基于Vue SEO的四种方案(小结)
Jul 01 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
Nov 27 #Javascript
Node+OCR实现图像文字识别功能
Nov 26 #Javascript
图片文字识别(OCR)插件Ocrad.js教程
Nov 26 #Javascript
JS 验证码功能的三种实现方式
Nov 26 #Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
Nov 26 #Javascript
tracking.js页面人脸识别插件使用方法
Apr 16 #Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
Nov 26 #Javascript
You might like
使用PHP编写发红包程序
2015/07/22 PHP
PHP微信开发之模板消息回复
2016/06/24 PHP
php生成静态页面并实现预览功能
2019/06/27 PHP
3Z版基于jquery的图片复选框(asp.net+jquery)
2010/04/12 Javascript
js jquery数组介绍
2012/07/15 Javascript
基于jquery的滚动条滚动固定div(附演示下载)
2012/10/29 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
jQuery 绑定事件到动态创建的元素上的方法实例
2013/08/18 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
jQuery中:contains选择器用法实例
2014/12/30 Javascript
JS数组的常见用法实例
2015/02/10 Javascript
JavaScript 变量、作用域及内存
2015/04/08 Javascript
AngularJS基础教程之简单介绍
2015/09/27 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
最实用的jQuery分页插件
2016/10/09 Javascript
详解jQuery选择器
2016/12/21 Javascript
jQuery实现对象转为url参数的方法
2017/01/11 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
element 结合vue 在表单验证时有值却提示错误的解决办法
2018/01/22 Javascript
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
jquery实现购物车基本功能
2019/10/25 jQuery
Vue简单实现原理详解
2020/05/07 Javascript
Python 学习笔记
2008/12/27 Python
在Django中进行用户注册和邮箱验证的方法
2016/05/09 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
Django中使用 Closure Table 储存无限分级数据
2019/06/06 Python
tensorflow使用指定gpu的方法
2020/02/04 Python
Python 实现进度条的六种方式
2021/01/06 Python
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
CAT鞋加拿大官网:CAT Footwear加拿大
2020/08/05 全球购物
服务员岗位责任制
2014/02/11 职场文书
幼儿园教研工作总结2015
2015/05/12 职场文书
浅谈pytorch中的dropout的概率p
2021/05/27 Python
详解Java实践之建造者模式
2021/06/18 Java/Android