说说如何使用Vuex进行状态管理(小结)


Posted in Javascript onApril 14, 2019

1 为什么需要状态管理

一个 Vue 组件分为数据(model)与视图(view)。当通过 methods 中的方法更新数据时,视图也会自动更新。

message.vue

<template>
  <div>
    {{message}}
    <button @click="changeMessage">改变内容</button>
  </div>
</template>

<script>
  export default {
    name: "message",
    data() {
      return {
        message: '你好'
      };
    },
    methods: {
      changeMessage() {
        this.message = '我很好'
      }
    }
  }
</script>

效果:

说说如何使用Vuex进行状态管理(小结)

这个示例中的 message 与 changeMessage() 只能在 message.vue 组件中使用。而在实际应用中,常见的就是跨组件共享数据的要求。这时,就可以通过 Vuex 来优雅并高效地管理组件状态啦O(∩_∩)O~

注意:Vuex 有一定的技术门槛,它主要应用于多人协同开发的大型单页面应用。所以,是否使用 Vuex 取决于团队规模与技术储备。

2 安装 Vuex

npm install --save vuex

安装版本:vuex@3.1.0

3 基本用法

 3.1 引入 Vuex

在 main.js 中引入 Vuex:

...
//引入 vuex 插件
import Vuex from 'vuex';
...

//加载 vuex 插件
Vue.use(Vuex);

//Vuex 配置
const store = new Vuex.Store({
  state: {
    ...
  },
  mutations: {
    ...
  }
});
...

new Vue({
  el: '#app',
 ...
  //使用 Vuex
  store: store,
 ...
})

Vuex 中的 store 包含应用的数据状态和操作过程。store 中的数据发生变化,使用了这些数据的组件也会立即更新。

3.2 定义数据

数据定义在 Vuex 的 states 属性中。

我们以计数器为例。定义了一个 count 数据并初始化为 0:

const store = new Vuex.Store({
  state: {
    count: 0
  }
});

3.3 读取数据

数据定义好之后,就可以在 vue 组件中通过 $store.state.count 读取出来啦,比如在 index.vue 中可以这样写:

<template>

  <div>
    ...
    {{count}}
   ...
  </div>
</template>

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

这里利用计算属性,从 Vuex 的 store 中读取了计数器的当前值。

3.4 修改数据

使用 Vuex 的 mutations 属性,可以修改 state 中定义的数据。我们为计数器定义增长与减少操作:

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state, n = 1) {
      state.count += n;
    },
    decrease(state) {
      state.count--;
    }
  }
});

mutations 中的函数,可以有两个入参。第一个入参是 state,第二个入参可以是任意类型。比如这里可以为新增操作,指定增长量,如果不指定,那么增长量就默认为 1。

注意:如果需要传入多个参数,那么我们可以在此传入一个带多个参数的对象。

这里使用了 ES 6 为函数设置默认值的语法。 increment(state, n = 1) 等同于:

increment (state, n){
 n = n || 1;
}

在 *.vue 组件中,可以通过 this.$store.commit 方法来执行 mutations。我们在 index.vue 中,新增三个按钮,用于 “+1” 、“-1” 和 "+3" 操作:

<template>

  <div>
 
    {{count}}
    <button @click="handleIncrement">+1</button>
    <button @click="handleDecrease">-1</button>
    <button @click="handleIncrementMore">+3</button>
  </div>
</template>

<script>
  export default {
    ...
    methods: {
      handleIncrement() {
        this.$store.commit('increment');
      },
      handleDecrease() {
        this.$store.commit('decrease');
      },
      handleIncrementMore() {
        this.$store.commit('increment', 3);
      }
     }
   }
</script>

this.$store.commit 方法的入参,是在 mutations 中定义的函数名。

还可以通过指定 type 的方式提交, type 的值就是 mutations 中定义的函数名:

main.js

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    ...
    incrementByParam(state, params) {
      state.count += params.count;
    }
  }
});

index.vue

<template>

  <div>
    {{count}}
    ...
    <button @click="handleByParam">+30</button>
  </div>
</template>

<script>
  export default {
    ...
    methods: {
      ...
      handleByParam() {
        this.$store.commit({
          type: 'incrementByParam',
          count: 30
        });
      },
    }
  }
</script>

注意:如果在 mutations 中异步操作了数据,那么组件在 commit 提交之后,将无法立即改变数据。所以,在 mutations 中,建议尽量使用同步方法来操作数据。

效果:

说说如何使用Vuex进行状态管理(小结)

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

Javascript 相关文章推荐
经常用的图片在容器中的水平垂直居中实例
Jun 10 Javascript
用js实现的自定义的对话框的实现代码
Mar 21 Javascript
js压缩工具 yuicompressor 使用教程
Mar 31 Javascript
精心挑选的12款优秀的基于jQuery的手风琴效果插件和教程
Aug 22 Javascript
js控制CSS样式属性语法对照表
Dec 11 Javascript
jquery append()方法与html()方法的区别及使用介绍
Aug 01 Javascript
jQuery获取复选框被选中数量及判断选择值的方法详解
May 25 Javascript
Node.js中npm常用命令大全
Jun 09 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
Jun 13 Javascript
H5实现中奖记录逐行滚动切换效果
Mar 13 Javascript
JS鼠标滚动分页效果示例
Jul 05 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
Aug 12 Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
Apr 14 #Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
Apr 14 #Javascript
vue 实现小程序或商品秒杀倒计时
Apr 14 #Javascript
js中async函数结合promise的小案例浅析
Apr 14 #Javascript
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
Apr 14 #Javascript
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
Apr 13 #Javascript
JS+CSS3实现的简易钟表效果示例
Apr 13 #Javascript
You might like
PHP页面间参数传递的四种方法详解
2013/06/09 PHP
php压缩和解压缩字符串的方法
2015/03/14 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
2016/09/23 PHP
浅谈php和js中json的编码和解码
2016/10/24 PHP
PHP基于Redis消息队列实现发布微博的方法
2017/05/03 PHP
JS target与currentTarget区别说明
2011/08/28 Javascript
jquery 删除cookie失效的解决方法
2013/11/12 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
js实现div的切换特效上一个下一个
2014/02/11 Javascript
浅谈jQuery中setInterval()方法
2015/07/07 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
vue toggle做一个点击切换class(实例讲解)
2018/03/13 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
详解vue项目中实现图片裁剪功能
2019/06/07 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
解决vue单页面应用打包后相对路径、绝对路径相关问题
2020/08/14 Javascript
详解Vue3 Teleport 的实践及原理
2020/12/02 Vue.js
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
[04:11]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/01/30 DOTA
[03:12]完美世界DOTA2联赛PWL DAY6集锦
2020/11/05 DOTA
Python高效编程技巧
2013/01/07 Python
Win10+GPU版Pytorch1.1安装的安装步骤
2019/09/27 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
2020/02/26 Python
Python实现读取并写入Excel文件过程解析
2020/05/27 Python
python 数据类型强制转换的总结
2021/01/25 Python
优秀员工表扬信
2014/01/17 职场文书
小学二年级学生评语
2014/04/21 职场文书
2015年双拥工作总结
2015/04/08 职场文书
毕业生学校组织意见
2015/06/04 职场文书
详解MySQL多版本并发控制机制(MVCC)源码
2021/06/23 MySQL
MySQL的安装与配置详细教程
2021/06/26 MySQL