说说如何使用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 相关文章推荐
jQuery源码解读之removeClass()方法分析
Feb 20 Javascript
jQuery往返城市和日期查询实例讲解
Oct 09 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
Jul 04 Javascript
jquery自动补齐功能插件flexselect用法示例
Aug 06 Javascript
基于 webpack2 实现的多入口项目脚手架详解
Jun 26 Javascript
React Native使用Modal自定义分享界面的示例代码
Oct 31 Javascript
详解nuxt sass全局变量(公共scss解决方案)
Jun 27 Javascript
vue watch普通监听和深度监听实例详解(数组和对象)
Aug 16 Javascript
解决vue单页面应用中动态修改title问题
Jun 09 Javascript
vue-router的钩子函数用法实例分析
Oct 26 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
Apr 17 Javascript
js实现简易点击切换显示或隐藏
Nov 29 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
德生S2000南麂列岛台湾FM收听记录
2021/03/02 无线电
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
解析PHP中的内存管理,PHP动态分配和释放内存
2013/06/28 PHP
PHP根据图片色界在不同位置加水印的方法
2015/07/01 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
PHP处理数组和XML之间的互相转换
2016/06/02 PHP
效率高的Javscript字符串替换函数的benchmark
2008/08/02 Javascript
IE DOM实现存在的部分问题及解决方法
2009/07/25 Javascript
关于JS管理作用域的问题
2013/04/10 Javascript
js实现的折叠导航示例
2013/11/29 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
jQuery实现简单的DIV拖动效果
2016/02/19 Javascript
Bootstrap的modal拖动效果
2016/12/25 Javascript
javascript实现复选框全选或反选
2017/02/04 Javascript
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
Vue.js获取被选择的option的value和text值方法
2018/08/24 Javascript
记一次用vue做的活动页的方法步骤
2019/04/11 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
[01:22:42]2014 DOTA2华西杯精英邀请赛 5 24 DK VS LGD
2014/05/26 DOTA
python中bisect模块用法实例
2014/09/25 Python
使用Python脚本在Linux下实现部分Bash Shell的教程
2015/04/17 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
Python 读取某个目录下所有的文件实例
2018/06/23 Python
python调用动态链接库的基本过程详解
2019/06/19 Python
解决pycharm 安装numpy失败的问题
2019/12/05 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
2017/01/05 HTML / CSS
村委会主任先进事迹
2014/01/15 职场文书
艾滋病宣传活动总结
2014/05/08 职场文书
入党积极分子学习优秀共产党员先进事迹思想汇报
2014/09/13 职场文书
员工自我工作评价
2015/03/06 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
导游词之韩国济州岛
2019/10/28 职场文书
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android
idea下配置tomcat避坑详解
2022/04/12 Servers