前言

大家好,不知道大家在用 vue 进行开发过程中有没有遇到这样一种场景,就是有些时候一些数据是一种通用的共享数据(比如登录信息),那么这类数据在各个组件模块中可能都会用到,如果每个组件中都去后台重新获取那么势必会造成性能浪费,为了解决这一问题一个新的状态管理工具 - vux 就应运而生了。那么 vuex 到底是个什么东西呢,它又是怎么实现数据共享的呢?接下来就跟大家共同学习一下。

了解 vuex

官方给出的解释是:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。其实可以简单理解为:将多个组件共享的变量全部存储在一个对象里面,然后将这个对象放在顶层的 Vue 实例中,让其他组件可以使用,它最大的特点是响应式。

vuex 有如下五个核心模块:

state

  • 用于存放组件间互相通信的属性值。
  • 原则上 state 中的属性只能在各个组件之间使用,而不能修改,如果要修改需要在 mutations 中修改
//伪代码
//定义
export default new Vuex.Store({state:{userinfo:{name:'Alvin'}}
})//使用
this.$store.state.userinfo.name
复制代码

mutations

  • 这里存放的都是一些函数,用于修改 state 中的属性值
  • 这里的函数中只接收两个参数:state 和 options
  • 原则上这里面的函数必须都是同步的
  • 如果某组件中需要修改 state 中的属性值,则需在该组件中用this.$store.commit (’ 方法名 ', 参数) 的方式来调用,即需要用 commit 方法来 调用 mutations 中的函数
  • 通过 commit 触发
//伪代码
//定义
export default new Vuex.Store({mutations:{changeUserInfo(state,name){state.userinfo.name = name;}}
})//使用
this.$store.commit("changeUserInfo", "Yannis")
复制代码

actions

  • 这里存放的也都是一些函数,这里的函数可以是异步的
  • 这里的函数也是接收两个参数:store 和 options
  • 如果这里的函数想要修改 state 中的值,还是得通过调用 mutations 中的方法来实现
  • 如果想要在组件中调用这里的函数,则需要用 dispatch 方法调用:this.$store.dispatch (’ 方法名 ', options)
  • 通过 dispatch 触发

getters

  • 这里也是一些函数,类似于组件中的计算属性
  • 可以处理一些通用且复杂的逻辑, 实际使用比较少

modules

  • 用于划分模块
  • 由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象显得会相当臃肿
  • 为了解决上面的问题,Vuex 允许将 store 分割成模块。每个模块拥有自己的 state、mutation、action、getter 甚至是嵌套子模块
  • 如果模块中的 mutations 或 actions 重复,则两个重复的方法都会执行
  • 如果想区分模块中重复的 mutations 或 actions,则可以在模块中加一个属性:namespace:true 即可,调用时需要指定模块名,例如:this.$store.commit (’ 模块名 / 方法名 ')

基于 vuex 的原理模拟部分 Vuex 源码

let Vue = null;
function install(_Vue){Vue = _Vue;Vue.mixin({beforeCreate(){if(this.$options.store){//说明是根实例this$store = this.$options.$store}else if(this.$parent){//有$parent属性,说明这个组件是根组件的后代组件this.$store = this.$parent.$store}}});
}class Store{constructor(options){//this.state = options.state;//没有响应式let vm = new Vue({data:{state: options.state}});this.state = vm.state;this.mutations = {};let mutations = options.mutations || {};Object.keys(mutations).forEach(key => {this.mutations[key] = (option) => {mutations[key].call(this,this.state, option);}});this.actions = {};let actions = options.actions || {};Object.keys(actions).forEach(key => {this.actions[key] = (option) => {actions[key].call(this, this.store, option);}});this.getters = {};let getters = options.getters || {};Object.keys(getters ).forEach(key => {Object.defineProperty(this.getters, key, {get:() => {return getters[key].call(this, this.state);}})});this.commit = (type, option) => {this.mutations[type](option); }this.dispatch = (type, option) => {this.actions[type](option);}}/** commit 和 dispatch应该是stote私有的commit(type, option){this.mutations[type](option );}dispatch(type, option){this.actions[type](option);}*/
}//辅助函数
export function mapState(arr){let obj = {};arr.forEach(key => {obj[key] =  function(){return this.$store.state[key]}});return obj;
}export function mapMutation(arr){let obj = {};arr.forEach(key => {obj[key] =  function(option){return this.$store.commit(key, option)}});return obj;
}export default {install,Store
}
复制代码

总结

本次分享中我们共同学习了 vue 中的状态管理模式 - vuex,最后还用重写 vuex 的方式简单梳理了一下 vuex 的实现过程,关于具体的实现原理我们会在以后的分享中详细描述。今天的分享就到这里了。

源码附件已经打包好上传到百度云了,大家自行下载即可~

链接: https://pan.baidu.com/s/14G-bpVthImHD4eosZUNSFA?pwd=yu27
提取码: yu27
百度云链接不稳定,随时可能会失效,大家抓紧保存哈。

如果百度云链接失效了的话,请留言告诉我,我看到后会及时更新~

开源地址

码云地址:
http://github.crmeb.net/u/defu

Github 地址:
http://github.crmeb.net/u/defu

状态管理模式 - vuex 的使用介绍相关推荐

  1. mount 返回状态_状态管理模式 — Vuex如何使用?

    Extract 试想当我们在开发一个Vue应用程序时,如果在一个项目中频繁的使用组件传参的方式来同步data中的值,一旦项目结构变得复杂,管理和维护这些数据将变得十分繁琐,为此,Vue为这些被多个组件 ...

  2. 2021-12-10 vue移动端卖座电影项目(十) 使用状态管理模式vuex的state控制选项卡tabbar的显隐,mutation的用法,this.$store.commit()的两个参数

    文章目录 0.vuex复习 1.引入 2.在state中存showTabbar后,直接可以引用 3.在Detail.vue的两个钩子函数中设置控制showTabbar的布尔值 4.效果:实现进入详情页 ...

  3. 【Vue.js】全局状态管理模式插件vuex

    文章目录 全局状态管理模式Vuex vuex是什么? 什么是"状态管理模式"? vuex的应用场景 Vuex安装 开始 核心概念 一.State 1.单一状态树 2.在 Vue 组 ...

  4. 理解vuex -- vue的状态管理模式

    2019独角兽企业重金招聘Python工程师标准>>> vuex是什么? 先引用vuex官网的话: Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管 ...

  5. Vuex状态管理模式-M

    Vuex Vuex 是一个专为 Vue.js 开发的状态管理模式.主要是是做数据交互,父子组件传值可以很容易办到,但是兄弟组件间传值(兄弟组件下又有父子组件),页面多并且一层嵌套一层的传值,非常麻烦, ...

  6. vuex状态管理模式:入门demo(状态管理仓)

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.Vuex 也集成到 Vue 的官方调试工具 ...

  7. Vuex 状态管理模式(使用)

    一.Vuex简介 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 二.使用 1.安装依赖 ...

  8. VueX(Vue状态管理模式)

    一.初识VueX 1.1 关于VueX VueX是适用于在Vue项目开发时使用的状态管理工具.试想一下,如果在一个项目开发中频繁的使用组件传参的方式来同步data中的值,一旦项目变得很庞大,管理和维护 ...

  9. uvex快速入门 Vue.js 应用程序开发的状态管理模式 + 库

    参考视频 vue参考文档 VueX 大型项目 管理公共数据的工具 作用: 独立与组件系统之外的,状态管理工具,采用集中式存储管理所有的组件状态,解决多组件数据通信(跨组件通信 A组件修改数据其他组件都 ...

最新文章

  1. 航天智慧物流!智能汽车竞赛—航天赛道开始报名啦!
  2. synchronized细节问题
  3. 【5】C++语法与数据结构之STL_list学生管理系统_链表内排序_函数指针
  4. 问题:如何将多个文件里内容都提取出来
  5. ASP.NET Aries 4.0 开源发布:已完成基础功能优化重写
  6. python transform(img)_pytorch之ImageFolder使用详解
  7. 打不开_网站源码安装后打不开?教你解决打不开
  8. 华为路由与交换 eSight基本概述学习笔记
  9. VARCHART XGantt系列教程:如何在分组视图中更好地显示节点
  10. 【Linux】SCP 拷贝命令
  11. Java实现 LeetCode 824 山羊拉丁文(暴力)
  12. 【车载以太网】【SOMEIP】Wireshark测试someip
  13. 基于python SMTP实现自动发送邮件教程解析
  14. matlab构建信道模型channel model, Rayleigh channel (NLoS), Rician channel (LoS)
  15. 求两个数的最大公约数(辗转相减法)
  16. CGB2111-Day13-用户模块管理
  17. NOIP一些数据,浙江2019年数学、生物竞赛数据
  18. 使用freenom注册免费顶级域名并在梅林上使用DDNS
  19. IIS的ASP木马怎么上传的
  20. 计算机与计算机网络_让计算机承担责任

热门文章

  1. c语言如何实现软件抗干扰,单片机软件系统抗干扰设计
  2. AcWing346.走廊泼水节
  3. 小程序自定义导航封装成组件后如何监听滚动距离
  4. 关闭计算机桌面图标,在电脑上如何创建关闭屏幕的快捷方式图标?
  5. C++ STL map的使用和性能分析
  6. 热门聊天表情包怎么找?怎么制作?多平台表情合集,没有找不到的表情包!搞笑-金馆长-张家辉-卡通-二次元-gif等表情大全
  7. nginx代理WebSocket配置
  8. 如何更好的表达道歉呢?
  9. artdialog ajax,GitHub - xiaok/artDialog: 优雅的web对话框控件
  10. 如何建立您的电子商务邮件列表?