说说如何使用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 相关文章推荐
查找iframe里元素的方法可传参
Sep 11 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
Dec 14 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
Jan 13 Javascript
javascript中Date对象应用之简易日历实现
Jul 12 Javascript
JS中使用 after 伪类清除浮动实例
Mar 01 Javascript
Angular组件化管理实现方法分析
Mar 17 Javascript
JS实现复选框的全选和批量删除功能
Apr 05 Javascript
解决linux下node.js全局模块找不到的问题
May 15 Javascript
vue配置多页面的实现方法
May 22 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
Aug 08 Javascript
vue过滤器用法实例分析
Mar 15 Javascript
JavaScript实现PC端横向轮播图
Feb 07 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中,文件上传
2006/12/06 PHP
PHP中extract()函数的定义和用法
2012/08/17 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(五)
2014/06/23 PHP
php恢复数组的key为数字序列的方法
2015/04/28 PHP
PHP+Session防止表单重复提交的解决方法
2018/04/09 PHP
Javascript this关键字使用分析
2008/10/21 Javascript
jQuery学习笔记之jQuery选择器的使用
2010/12/22 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
JS控制日期显示的小例子
2013/11/23 Javascript
JS实现获取剪贴板内容的方法
2016/06/21 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
微信小程序 视图容器组件的详解及实例代码
2017/01/19 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
微信小程序实现登录页云层漂浮的动画效果
2017/05/05 Javascript
详解react如何在组件中获取路由参数
2017/06/15 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
2017/12/23 Javascript
vue+elementUI实现图片上传功能
2019/08/20 Javascript
微信小程序文章详情功能完整实例
2020/06/03 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
取numpy数组的某几行某几列方法
2018/04/03 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
解决tensorflow训练时内存持续增加并占满的问题
2020/01/19 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
2020/02/29 Python
python selenium 获取接口数据的实现
2020/12/07 Python
物业管理求职自荐信
2013/09/25 职场文书
体育之星事迹材料
2014/05/11 职场文书
社团个人总结范文
2015/03/05 职场文书
2015年光棍节活动总结
2015/03/24 职场文书
员工家属慰问信
2015/03/24 职场文书
员工手册董事长致辞
2015/07/29 职场文书
大学军训口号大全
2015/12/24 职场文书
2016年教师反腐倡廉心得体会
2016/01/13 职场文书
如何做好工作总结!
2019/04/10 职场文书
Python机器学习应用之工业蒸汽数据分析篇详解
2022/01/18 Python
【海涛dota】偶遇拉娜娅 质量局德鲁伊第一视角解说
2022/04/01 DOTA
德劲DE1105机评
2022/04/05 无线电