Vuex入门到上手教程


Posted in Javascript onJune 20, 2018

一、前言

当我们的应用遇到多个组件共享状态时,会需要多个组件依赖于同一状态。传参的方法对于多层嵌套的组件将会非常繁琐,并且对于兄弟组件间的状态传递无能为力。在搭建下面页面时,你可能会对 vue 组件之间的通信感到崩溃 ,特别是非父子组件之间通信。此时就应该使用vuex,轻松可以搞定组件间通信问题。

Vuex入门到上手教程 

二、什么是Vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。这里的关键在于集中式存储管理。 这意味着本来需要共享状态的更新是需要组件之间通讯的,而现在有了vuex,就组件就都和store通讯了 。

三、什么时候使用Vuex

虽然 Vuex 可以帮助我们管理共享状态,但也附带了更多的概念和框架。这需要对短期和长期效益进行权衡。 如果您的应用够简单,您最好不要使用 Vuex,因为使用 Vuex 可能是繁琐冗余的。一个简单的global event bus就足够您所需了。但是, 如果您需要构建一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。

四、Vuex安装(限定开发环境为 vue-cli)

首先要安装vue-cli脚手架,对于大陆用户,建议将npm的注册表源设置为国内的镜像(淘宝镜像),可以大幅提升安装速度。

npm config set registry https://[registry.npm.taobao.org](http://registry.npm.taobao.org/)
npm config get registry//配置后可通过下面方式来验证是否成功
npm install -g cnpm --registry=[https://registry](https://registry/).npm.taobao.org
//cnpm安装脚手架
cnpm install -g vue-cli
vue init webpack my-vue
cd my-vue
cnpm install
cnpm run dev

脚手架安装好后,再安装vuex

cnpm install vuex --save

 五、如何使用Vuex

1.如何通过Vuex来实现如下效果?

Vuex入门到上手教程 

①创建一个store.js文件

import Vue from "vue"
import Vuex from "vuex"
Vue.use(Vuex)
const store = new Vuex.Store({
 state: { //这里的state必须是JSON,是一个对象
 count: 1 //这是初始值
 },
 mutations: {//突变,罗列所有可能改变state的方法
 add(state) {
  state.count++; //直接改变了state中的值,而并不是返回了一个新的state
 },
 reduce(state){
  state.count--;
 }
 }
});
export default store;//用export default 封装代码,让外部可以引用

②在main.js文件中引入store.js文件

import store from "./vuex/store"
new Vue({
 router,
 store,
 el: '#app',
 render: h => h(App)
})

③新建一个模板count.vue

<template>
 <div>
  <h2>{{msg}}</h2><hr/>
  <h2>{{$store.state.count}}-{{count}}</h2>//这两种写法都可以
  <button @click="addNumber">+</button>
  <button @click="reduceNumber">-</button>
 </div>
</template>
<script>
import {mapState} from 'vuex'
export default {
 data() {
 return {
  msg: "Hello Vuex"
 };
 },
 methods: {
 addNumber() {
  return this.$store.commit("add");
 },
 reduceNumber() {
  return this.$store.commit("reduce");
 }
 },
 computed: mapState(['count'])// 映射 this.count 到 this.$store.state.count
         mapState 函数可以接受一个对象,也可以接收一个数组
};
</script>

由于 store 中的状态是响应式的,当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。 在组件中调用 store 中的状态简单到仅需要在计算属性中返回即可。改变store 中的状态的唯一途径就是显式地提交 (commit) mutations。

这样,我们就可以实现自增1或是自减1,那假如我们想要点击一次实现自增2,这该如何实现,也就是如何向Mutations传值?

2.如何在Mutations里传递参数

先store.js文件里给add方法加上一个参数n

mutations: {
 add(state,n) {
  state.count+=n;
 },
 reduce(state){
  state.count--;
 }
 }

然后在Count.vue里修改按钮的commit( )方法传递的参数

addNumber() {
  return this.$store.commit("add",2);
 },
 reduceNumber() {
  return this.$store.commit("reduce");
 }

3.getters如何实现计算过滤操作

getters从表面是获得的意思,可以把他看作在获取数据之前进行的一种再编辑,相当于对数据的一个过滤和加工。你可以把它看作store.js的计算属性。

例如:要对store.js文件中的count进行操作,在它输出前,给它加上100。

首先要在store.js里Vuex.Store()里引入getters

getters:{
  count:state=>state.count+=100
 }

然后在Count.vue中对computed进行配置,在vue 的构造器里边只能有一个computed属性,如果你写多个,只有最后一个computed属性可用,所以要用展开运算符”…”对上节写的computed属性进行一个改造。

computed: {
 ...mapState(["count"]),
 count() {
  return this.$store.getters.count;
 }
 }

需要注意的是,此时如果点击'+',就会增加102,如果点击'-',就会增加99,最后的结果是mutations和getters共同作用的。

4.actions如何实现异步修改状态

actions和上面的Mutations功能基本一样,不同点是, actions是异步的改变state状态,而Mutations是同步改变状态 。

①在store.js中声明actions

actions: {
 addAction(context) {
  context.commit('add', 2);//一开始执行add,并传递参数2
  setTimeout(() => {
  context.commit('reduce')
  }, 2000);//两秒后会执行reduce
  console.log('我比reduce提前执行');
 },
 reduceAction({
  commit
 }) {
  commit('reduce')
 }
 }

actions是可以调用Mutations里的方法的,调用add和reduce两个方法。在addAction里使用setTimeOut进行延迟执行。在actions里写了两个方法addAction和reduceAction,两个方法传递的参数也不一样。

context:上下文对象,这里你可以理解称store本身。 {commit}:直接把commit对象传递过来,可以让方法体逻辑和代码更清晰明了

②模板中的使用

<p>
 <button @click="addNumber">+</button>
 <button @click="reduceNumber">-</button>
</p>
<p>  
 <button @click="addAction">+</button>//新增
 <button @click="reduceAction">-</button>//新增
</p>
import { mapState, mapGetters, mapActions } from "vuex";
methods:{
 ...mapMutations([ 
  'add','reduce'
 ]),
 ...mapActions(['addAction','reduceAction'])
}

最后得到如下效果:点击addAction按钮事件时,先累加2,两秒后再减去1,而addNumber事件则不能实现异步效果。

Vuex入门到上手教程

ps:如果想访问源代码,请猛戳 git地址 。如果觉得对您有用,请给本文的github加个star,万分感谢

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Jquery 组合form元素为json格式,asp.net反序列化
Jul 09 Javascript
js添加select下默认的option的value和text的方法
Oct 19 Javascript
javascript瀑布流布局实现方法详解
Feb 17 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
May 16 Javascript
JavaScript实现图片瀑布流和底部刷新
Jan 02 Javascript
JS实现DIV高度自适应窗口示例
Feb 16 Javascript
js随机生成一个验证码
Jun 01 Javascript
浅谈Webpack 持久化缓存实践
Mar 22 Javascript
VUE+Element环境搭建与安装的方法步骤
Jan 24 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
Jul 11 Javascript
js实现无缝轮播图插件封装
Jul 31 Javascript
vue使用echarts实现折线图
Mar 21 Vue.js
JavaScript 中的 this 工作原理
Jun 20 #Javascript
如何用webpack4带你实现一个vue的打包的项目
Jun 20 #Javascript
JavaScript对象拷贝与Object.assign用法实例分析
Jun 20 #Javascript
vue打包的时候自动将px转成rem的操作方法
Jun 20 #Javascript
详解基于vue的服务端渲染框架NUXT
Jun 20 #Javascript
JS中call和apply函数用法实例分析
Jun 20 #Javascript
微信小程序模拟cookie的实现
Jun 20 #Javascript
You might like
中国站长站 For Dede4.0 采集规则
2007/05/27 PHP
比较简单的百度网盘文件直链PHP代码
2013/03/24 PHP
yii框架配置默认controller和action示例
2014/04/30 PHP
PHP生成不重复随机数的方法汇总
2014/11/19 PHP
语义化 H1 标签
2008/01/14 Javascript
js 自定义的联动下拉框
2010/02/07 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
2013/09/18 Javascript
JS获取键盘上任意按键的值(实例代码)
2013/11/12 Javascript
不提示直接关闭网页窗口的JS示例代码
2013/12/17 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
jQuery制作的别致导航有阴影背景高亮模式窗口
2014/04/15 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
Javascript 正则表达式实现为数字添加千位分隔符
2015/03/10 Javascript
jQuery表格插件datatables用法详解
2020/11/23 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
2016/06/30 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
2017/03/21 Javascript
Puppeteer环境搭建的详细步骤
2018/09/21 Javascript
Vue ​v-model相关知识总结
2021/01/28 Vue.js
[05:53]完美世界携手游戏风云打造 卡尔工作室观战系统篇
2013/04/22 DOTA
python实现简单温度转换的方法
2015/03/13 Python
用Python写脚本,实现完全备份和增量备份的示例
2018/04/29 Python
在Python中字典根据多项规则排序的方法
2019/01/21 Python
Python3.5模块的定义、导入、优化操作图文详解
2019/04/27 Python
pycharm 如何取消连按两下shift出现的全局搜索
2021/01/15 Python
iframe在移动端的缩放的示例代码
2018/10/12 HTML / CSS
HTML5超炫酷粒子效果的进度条的实现示例
2019/08/23 HTML / CSS
Html5嵌入钉钉的实现示例
2020/06/04 HTML / CSS
西尔斯百货官网:Sears
2016/09/06 全球购物
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
介绍一下Linux文件的记录形式
2013/09/29 面试题
公交公司毕业生求职信
2014/02/15 职场文书
办公自动化毕业生求职信
2014/03/09 职场文书
Redis如何实现分布式锁
2021/08/23 Redis
python opencv将多个图放在一个窗口的实例详解
2022/02/28 Python
css3 文字断裂效果
2022/04/22 HTML / CSS