文章目录

  • 1.前言
  • 2.Vuex是什么?
  • 3.什么是集中式状态管理模式?
  • 4.什么情况下使用Vuex?它能帮我们解决什么问题?
  • 5.简单的例子

1.前言

Vuex是一个很棒的状态管理库,它很简单并且非常好的与Vue集成,下面我们来开始学习Vuex!

2.Vuex是什么?

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化,状态分两种,一种是组件内部的状态,其实就是一个组件内使用的状态(data数据),另外一种是应用级别的状态,这里是多个组件共享的状态(数据)

3.什么是集中式状态管理模式?

在说集中式管理模式之前,我们可以先来想想常见的处理方式是怎样的,比如每个组件维护自身的数据和状态,把组件设想成一个单一的东西,一个组件包含了自身需要的数据,如果不同层级的组件共享一份数据,那么是不是每个组件都需要各自维护这份数据(是不是很麻烦),那么集中式状态管理模式则以一个全局单例模式管理应用的状态,类似于全局对象,就相当共享数据(状态)保存到一个全局对象中(管理多份状态),那么就只需要单独管理全局对象里面的状态就可以了,集中式状态管理的好处是多个状态分散在不同组件各个角落,每个 View 会有相对应的 Model 维护状态;而集中式管理模式则用于将分散于组件的状进行集中化管理,提供一个全局的 store 存储管理应用的状态。集中式的状态管理可以让整体的状态变化更加明晰

4.什么情况下使用Vuex?它能帮我们解决什么问题?

多个组件依赖于同一状态,就是组件间的数据共享,所谓共享指的是,同一份数据被多处组件使用,并且要保持一定程度的同步(比如其中一个组件改变这份状态,另外的组件也需要同步这个状态),Vuex 的状态管理存储是响应式的,就是当你的组件使用到了 Vuex 的某个状态,一旦它发生改变了,所有关联的组件都会自动更新相对应的数据。所以这个时候用 vuex 来统一管理这些组件的状态,会让逻辑更清晰,更可维护!

5.简单的例子

可能上面说的还是由点懵!下面来说下例子,不使用Vuex是怎么玩的,有多么的复杂! 场景:有个App组件(root组件),parent组件,child组件,GrandSon组件,GrandSon1组件,改变GrandSon组件或者GrandSon1组件数据,所有的组件数据都需要变更!

app.vue(根组件)的代码:

//app.vue
<template><div id="app"><Parent :root-number="num" @rootNumber="changRootNumber"></Parent></div>
</template><script>
import Parent from "./components/Parent";export default {name: "App",components: {Parent,},data() {return {num: 100,};},methods: {changRootNumber(value) {this.num = value;},}
};
</script>

parent.vue(父组件)的代码:

//parent.vue
<template><div><h2>parent组件的number值:{{ num }}</h2><Child :parent-number="num" @parentNumber="changParentNumber"></Child></div>
</template><script>
import Child from "./Child";export default {name: "Parent",props: ["rootNumber"],components: {Child,},computed: {num() {return this.rootNumber;}},methods: {changParentNumber(value) {this.$emit("rootNumber", value);},},
};
</script>

Child.vue(儿子组件)的代码:

//Child.vue
<template><div><h2>child组件的number值:{{ num }}</h2><GrandSon :child-number="num" @childNumber="changChildNumber"></GrandSon><GrandSon1 :child-number="num" @childNumber="changChildNumber"></GrandSon1></div>
</template><script>
import GrandSon from "./GrandSon";
import GrandSon1 from "./GrandSon1";
export default {name: "Child",props: ["parentNumber"],components: {GrandSon,GrandSon1},computed: {num() {return this.parentNumber;}},methods: {changChildNumber(value) {this.$emit("parentNumber", value);},},
};
</script>

GrandSon.vue 和 GrandSon1.vue(孙子组件)的代码:

//GrandSon.vue   GrandSon1.vue  一样的代码
<template><div><h2>GrandSon组件的number值:{{ num }}</h2><button @click="addNumber">点击我改变number值</button><button @click="substractNumber">点击我改变number值</button></div>
</template><script>
export default {name: "GrandSon1",props: ["childNumber"],computed: {num() {return this.childNumber;}},methods: {addNumber() {this.$emit("childNumber", this.num + 5);},substractNumber() {this.$emit("childNumber", this.num - 5);}},
};
</script>
</script>

组件与组件每层通过prop传值,并且当GrandSon改变数据时还需要每层派发事件一直到app组件,这样是不是很复杂,并且很难维护,看下效果

如果使用Vuex来集中管理状态,将变得非常的简单,并且代码很清晰,很容易维护!下一篇文章介绍如何使用Vuex!

Vue全家桶系列之Vuex(一)相关推荐

  1. Vue全家桶系列之Vuex(二)

    文章目录 1.前言 2.Vuex如何使用 3.State 4.Mutation 5.Getter 6.Vue.js devtools 7.Action 8.Module 1.前言 上篇文章介绍了vue ...

  2. Vue全家桶系列之Vuex(三)

    文章目录 1.前言 2.模块的命名空间 3.模块的动态注册 4.vuex严格模式 5.vuex插件 5.1 subscribe 5.2 subscribeAction 5.3 replaceState ...

  3. Vue全家桶系列之Vue-router(五)

    文章目录 1.前言 2.路由过渡效果 3.编程式的导航 4.导航守卫 4.1 全局守卫 4.2 路由独享的守卫 4.3组件内的守卫 4.4导航解析流程 1.前言 上篇文章说了vue-router的路由 ...

  4. vue全家桶系列之网易云音乐(移动版)

    一个精致的网易云音乐webapp 网易云音乐(移动版) api来源(感谢Binaryify不断更新的网易云音乐接口,这也将是这个项目不断拓展下去的坚实依托) 源码地址 项目预览(web端在chrome ...

  5. Vue 全家桶 + Electron 开发的一个跨三端的应用

    GitHub Repo:vue-objccn Follow: halfrost · GitHub 项目地址:https://github.com/halfrost/vue-objccn 利用 Vue. ...

  6. Vue全家桶 + webpack 构建单页应用初体验

    文章指南 主题   承接这上一篇Vue + Webpack 构建模块化开发框架详解,我们知道了如何使用webpack对vue进行打包,从而开始我们的前端模块化开发之路,这一篇在上一篇的基础上讲解 Vu ...

  7. Vue 全家桶 + Electron 开发的一个跨三端的应用 1

    代码地址如下: http://www.demodashi.com/demo/11738.html GitHub Repo:vue-objccn Follow: halfrost · GitHub 利用 ...

  8. vue取div当前宽度_【前端大神面考面试官系列】入门Vue全家桶

    (给达达前端加星标,提升前端技能) 面试官问:Vue如何安装的呢? 达达回答:Vue的安装可以从两个方面进行安装,第一种是CDN引入,第二种是NPM安装. CDN引入 <script src=& ...

  9. 【前端大神面考面试官系列】入门Vue全家桶

    (给达达前端加星标,提升前端技能) 面试官问:Vue如何安装的呢? 达达回答:Vue的安装可以从两个方面进行安装,第一种是CDN引入,第二种是NPM安装. CDN引入 <script src=& ...

最新文章

  1. git for c#, clone方法
  2. BZOJ1598: [Usaco2008 Mar]牛跑步
  3. PHP MySql数据库访问
  4. 四十四、ETL工具的查询_连接和映射
  5. 微信小程序 小程序登陆功能
  6. 8 MM配置-主数据-定义行业部门和具体行业部门字段选择
  7. win上部署基于openvino2020.2的yolov5算法
  8. 攻击者巧妙滥用谷歌 DoH 下载恶意软件
  9. 利用处理程序错误***(下)
  10. 例3.5 二叉排序树 - 九度教程第35题(二叉排序树)
  11. 优秀网站源码、编程源码大全
  12. Qt实战案例(13)——Qt的界面外观详细介绍
  13. 《开源软件架构》--nginx架构概述
  14. 23 种设计模式的分类 - Design Patterns
  15. Codeforces Round #677 (Div. 3) C. Dominant Piranha
  16. 计算机安全意识小故事,安全故事精选5篇
  17. 亚马逊如何使用二次验证码?
  18. ubuntu 16.04下载网易云音乐 在处理时有错误发生:netease-cloud-music解决
  19. 为什么总有一些程序员,持续陷入焦虑、无法幸福?
  20. conda 包安装位置 虚拟环境_conda指定位置配置虚拟环境

热门文章

  1. 扁平化设计颜色之翡翠绿
  2. php微信开发 (获取用户地理位置)
  3. 马斯克中止推特收购,分手费10亿美元
  4. java 雷霆战机游戏 飞机大战 全过程教学+免费素材(附全部源代码)
  5. html 百度网盘的布局,百度网盘披露5G布局:打造个人云操作系统!
  6. 360金融路演PPT曝光:周鸿祎持股14% 预计中旬上市
  7. 估值冰火两重天 互联网金融巨头“天价”冲刺上市
  8. java实现测量到的工程数据
  9. 中华英才网三千员工全部裁员引争议
  10. config语言和config.in文件