说说如何使用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 tools 系列 scrollable(2)
Sep 06 Javascript
基于jquery的跨域调用文件
Nov 19 Javascript
js DOM的学习笔记
Dec 22 Javascript
javascript学习笔记(十二) RegExp类型介绍
Jun 20 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
Jul 17 Javascript
基于javascript实现单选及多选的向右和向左移动实例
Jul 25 Javascript
jquery实现Li滚动时滚动条自动添加样式的方法
Aug 10 Javascript
Jquery 全选反选实例代码
Nov 19 Javascript
使用ng-packagr打包Angular的方法示例
Sep 21 Javascript
如何使用Jquery动态生成二级选项列表
Feb 06 jQuery
解决vue项目中某一页面不想引用公共组件app.vue的问题
Aug 14 Javascript
JS前端基于canvas给图片添加水印
Nov 11 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模板引擎Smarty之配置文件在模板变量中的使用方法示例
2016/04/11 PHP
初窥JQuery(二)事件机制(2)
2010/12/06 Javascript
JQuery学习笔录 简单的JQuery
2012/04/09 Javascript
查找iframe里元素的方法可传参
2013/09/11 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
2015/10/14 Javascript
js实现二级菜单渐隐显示
2015/11/03 Javascript
使用PHP+JavaScript将HTML页面转换为图片的实例分享
2016/04/18 Javascript
javascript 小数乘法结果错误的处理方法
2016/07/28 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
微信小程序实现选项卡效果
2018/11/06 Javascript
Angular设置别名alias的方法
2018/11/08 Javascript
微信小程序实现炫酷的弹出式菜单特效
2019/01/28 Javascript
koa-router路由参数和前端路由的结合详解
2019/05/19 Javascript
python制作花瓣网美女图片爬虫
2015/10/28 Python
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
2018/04/21 Python
linux下python使用sendmail发送邮件
2018/05/22 Python
儿童学习python的一些小技巧
2018/05/27 Python
对python 匹配字符串开头和结尾的方法详解
2018/10/27 Python
在Python中使用MySQL--PyMySQL的基本使用方法
2019/11/19 Python
Python计算机视觉里的IOU计算实例
2020/01/17 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
Feelunique中文官网:欧洲最大化妆品零售电商
2020/07/10 全球购物
Linux文件操作命令都有哪些
2016/07/23 面试题
土木工程建筑专业毕业生求职信
2013/10/21 职场文书
运动会稿件100字
2014/09/24 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
宾馆前台接待岗位职责
2015/04/02 职场文书
2016个人廉洁自律承诺书
2016/03/25 职场文书