说说如何使用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 相关文章推荐
js压缩利器
Feb 20 Javascript
javascript实现划词标记+划词搜索功能
Mar 06 Javascript
JS 控制CSS样式表
Aug 20 Javascript
WEB 浏览器兼容 推荐收藏
May 14 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
Mar 25 Javascript
JavaScript 变量、作用域及内存
Apr 08 Javascript
JavaScript类型系统之布尔Boolean类型详解
Jun 26 Javascript
bootstrap时间插件daterangepicker使用详解
Oct 19 Javascript
Vue项目中跨域问题解决方案
Jun 05 Javascript
layui内置模块layim发送图片添加加载动画的方法
Sep 23 Javascript
基于Angular 8和Bootstrap 4实现动态主题切换的示例代码
Feb 11 Javascript
小程序Scroll-view上拉滚动刷新数据
Jun 21 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
浅析51个PHP处理字符串的函数
2013/08/02 PHP
神盾加密解密教程(一)PHP变量可用字符
2014/05/28 PHP
php实现在线通讯录功能(附源码)
2016/05/13 PHP
如何让动态插入的javascript脚本代码跑起来。
2007/01/09 Javascript
JS 实现双色表格实现代码
2009/11/24 Javascript
JS清除IE浏览器缓存的方法
2013/07/26 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
原生js模拟淘宝购物车项目实战
2015/11/18 Javascript
js动态添加的DIV中的onclick事件简单实例
2016/07/25 Javascript
响应式表格之固定表头的简单实现
2016/08/26 Javascript
jquery对Json的各种遍历方法总结(必看篇)
2016/09/29 Javascript
js判断文件格式及大小的简单实例(必看)
2016/10/11 Javascript
vue之数据交互实例代码
2017/06/20 Javascript
浅谈angularJS的$watch失效问题的解决方案
2017/08/11 Javascript
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
JS实现的对象去重功能示例
2019/06/04 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
JS如何操作DOM基于表格动态展示数据
2020/10/15 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
2020/11/12 Javascript
Python基于sftp及rsa密匙实现远程拷贝文件的方法
2016/09/21 Python
python使用两种发邮件的方式smtp和outlook示例
2017/06/02 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
浅析Django中关于session的使用
2019/12/30 Python
Django数据结果集序列化并展示实现过程
2020/04/22 Python
Python实现一个简单的递归下降分析器
2020/08/01 Python
Python识别验证码的实现示例
2020/09/30 Python
塔吉特百货公司官网:Target
2017/04/27 全球购物
Yves Rocher伊夫·黎雪美国官网:法国始创植物美肌1959
2019/01/09 全球购物
介绍一下Linux文件的记录形式
2012/04/18 面试题
工作中的自我评价如何写好
2013/10/28 职场文书
英语专业应届生求职信范文
2013/11/15 职场文书
前厅部经理岗位职责范文
2014/02/04 职场文书
小学生元旦感言
2014/02/26 职场文书
春节晚会主持词
2014/03/24 职场文书
营销与策划实训报告
2014/11/05 职场文书
丧事答谢词
2015/01/05 职场文书