← 返回目录

Vuex

第 134 / 154 卷日期:

JS 触发 history.pushState()、history.replaceState()

Vuex

一、Vuex是什么

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

也就是说,vuex是基于 vue 框架的一个状态管理库,那么什么是状态管理呢?

状态管理模式:简单来说就是集中式的存储管理组件的状态思想

二、Vuex 解决了什么

我们思考一个场景:

比如我们有一个在线多人聊天的,类似微信的,我们有一个通知栏来告诉用户是否有未读信息,但是出现了通知栏偶尔会给出错误的通知,也就是用户收到一条新的未读消息的通知,但是当他们检查它是什么时,这只是他们已经

看到的消息。

这是为什么呢?因为这里面

多个组件 / 实例依赖于同一状态,兄弟组件之间的状态是无法传递。

并且来自不同视图的行为当需要变更同一状态的时候,经常需要通过事件等来变更和同步状态,当遗漏的时候就会出现有些地方状态更新错误。

var Vo= {}

var A = new Vue({ data: Vo

})

var B = new Vue({ data: Vo

})

比如某个数据,在实例A和实例B中使用了,而这个数据在实例A中修改了,如果我们不做处理,这个状态是不会更新到实例B中的,对于实例B来说,这个数据是没有发生改变的。小型的项目我们还比较好处理,对实例B更新就好

了。

但是,当我们在做大型的开发的时候的话,往往会有多个实例 / 组件(A,B,C,D…)共享一个数据,这种情况它们之间互相关联,导致数据的复杂性大大增加,数据的状态变得不可预测或难以理解。结果就是应用程序变得无法扩展或维

护,变得臃肿难以维护及复用

  1. 规范化
  2. 便于调试

Flux 模式的基本思想:

单一数据来源数据是只读的

更新是同步的

二、Vuex 的好处

  1. 首先多层嵌套的组件、兄弟组件间的状态会更好管理维护,且使用 vuex 也是组件通信中的一种
  2. 减轻服务端压力,对于同一份数据集,请求会缓存,所有共用
  3. 当一个项目比较大型的时候,这是便于团队之间开发和维护的,和便于调试

二、五个核心的概念 state / getters / mutations / action / modules

在 Vuex 中,核心就是一个 “store” 仓库,包含我们应用中的大部分状态,同时提供包含 state / getters / mutations / action / modules等在内的管理调用方法。

1、state state 的存储状态类似于就组件中data,是我们所有的集中数据的地方,访问 “store” 的状态可以使用两种方式,

通过 this.$store.state属性的方式或者 mapState 辅助函数。

//存储 const store = new Vuex.Store({

// 存储状态数据 state: {

count: 0, info:{

name:"wenmo", age:18

} },

)

//读取方式 computed: {

count () { return store.state.count

} }

//下面这种是全局注册了store的 computed: {

count () { return this.$store.state.count

} }

computed: { // 使用对象展开运算符将此对象混入到外部对象中

...mapState({ // ...

})

}

2、getters getters 就是类似组件中的计算属性,可以简单理解为 state 的计算属性,依赖于 state 的值,state 发生改变就会

同时改变

const store = new Vuex.Store({ state: {

todos: [ { id: 1, text: '...', done: true },

{ id: 2, text: '...', done: false } ]

}, getters: {

doneTodos: state => { return state.todos.filter(todo => todo.done)

} }

})

3、mutations

mutations的作用是用来修改 “store” 里面的值,并且是唯一的方式。

我们不能直接修改 store 容器中的状态,需要先在容器中注册一个事件函数,当需要更新状态时候要通过触发该事件来完成。

const store = new Vuex.Store({ state: {

name: "wenmo"

}, mutations:{

// 注册事件 addCount(state){

state.name = "WENMO"

} }

})

//在实例中显式的调用执行

methods:{ // 显示的调用

handleAdd(){ this.$store.commit('addCount')

} }

})

  1. action

Action类似于Mutation, 但是是用来代替Mutation进行异步操作的.action用于异步的修改state,它是通过muation 间接修改state的。

若需要异步操作来修改state中的状态,首先需要action来注册事件,组件视图在通过 dispatch 分发方式调用该事件,该事件内部提交mutation中的事件完成改变状态操作,总之,通过action这个中介来提交mutation中的事件

函数.

const store = new Vuex.Store({ state: {

name: "wenmo"

}, mutations:{

// 注册事件 setName(state){

state.name = "WENMO"

} };

// 注册事件,提交给 mutation actions:{

setAction(context){ setTimeout(() => {

context.commit('setName')

}, 1000)

}, }

})

//在实例中显式的调用执行 new Vue({

el: '#app', store,

methods:{ // 显示的调用

handleAdd(){ this.$store.dispatch('setAction')

} }

const moduleA = { state: () => ({ ... }),

mutations: { ... }, actions: { ... },

getters: { ... } }

const moduleB = { state: () => ({ ... }),

mutations: { ... }, actions: { ... }

}

const store = createStore({ modules: {

a: moduleA, b: moduleB

} })

store.state.a // -> moduleA 的状态 store.state.b // -> moduleB 的状态

6、关于这五个方法的总结

state 对应的是在 store 中存储数据,类似组件中的 data getter 对应的是 store 中访问数据,类似组件中的计算属性

mutation 对应的是 store 中修改数据,并且是唯一的更新方式 action 类似于 mutation,用来代替 mutation进行异步操作的

modules 的作用是用来分割 store 的,每个 module 拥有自己的state、mutation、action、getters等

总结

Vuex 是一个专为 Vue开发的状态管理模式,使用集中式存储,管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。内部实现是 FLUX 模式,也就是约定数据的单向流动。

主要有五个属性,state / getter / mutation / action / modules,分别是用来存储数据,访问数据,修改数据,进行异步操作的,和划分模块的。

Flux 模式

一、解决什么问题当应用程序中有多个组件共享数据时,它们互连的复杂性会增加到数据状态不再可预测或不可理解的程度。因此,

应用程序变得无法扩展或维护。

举个例子就是,比如我们一个在线多人聊天,类似微信的,我们有一个通知栏来告诉用户未读信息,但是通知栏偶尔会给出错误的通知。用户将收到一条新的未读消息的通知,但是当他们检查它是什么时,这只是他们已经看到的

消息。

全站分卷索引 · 154 卷
  1. 1代码随想录知识星球精华(最强八股文)第五版(前端篇))
  2. 2html语义化
  3. 3src 和 href 的区别
  4. 4link 与 @import 的区别
  5. 5iframe
  6. 6CSS
  7. 7伪元素和伪类
  8. 8block,inline,inline-block
  9. 9重排、重绘和合成
  10. 10盒子模型
  11. 11margin 合并
  12. 12margin和padding 的值为百分比时
  13. 13浮动
  14. 14定位
  15. 15CSS选择器
  16. 16CSS选择器优先级
  17. 17选择器权重Specificity
  18. 18CSS属性继承
  19. 19不可/可继承属性
  20. 20display: none与 visibility: hidden的区别
  21. 21background-size
  22. 22client、offset&scroll
  23. 23CSS3新特性
  24. 24flex布局
  25. 25常见布局
  26. 26三栏布局
  27. 27垂直居中
  28. 28水平垂直居中
  29. 29CSS画三角形
  30. 30使chrome支持12px以下文字
  31. 31响应式布局
  32. 32媒体查询
  33. 33过渡与动画
  34. 34JavaScript 动画 和 CSS动画
  35. 35SCSS
  36. 36CSS性能优化
  37. 37有哪些数据类型
  38. 38判断数据类型
  39. 39类型转换
  40. 40parseInt&parseFloat
  41. 41浮点数求和步骤
  42. 42十进制小数转二进制
  43. 430.1+0.2 为什么不等于 0.3
  44. 44undefined 和 undeclared 的区别
  45. 45JavaScript NaN 属性
  46. 46isFinite()&isNaN()
  47. 47数组
  48. 48对原数组有影响
  49. 49对原数组无影响
  50. 50数组去重
  51. 51数组拍平
  52. 52ES6新增的数组方法
  53. 53判断是否存在某个值
  54. 54arguments为啥不是数组
  55. 55对象
  56. 56遍历对象的方法
  57. 57判断对象是否具有属性
  58. 58for in 和 for of 的区别
  59. 59继承方式
  60. 60instanceof
  61. 61深浅拷贝
  62. 62freeze属性
  63. 63函数
  64. 64函数柯里化
  65. 65函数的 length
  66. 66箭头函数和普通函数区别
  67. 67构造函数
  68. 68执行上下文
  69. 69作用域
  70. 70作用域和作用域链
  71. 71闭包和内存泄漏
  72. 72this
  73. 73关于 this 的指向问题
  74. 74改变this指向的方法(bind / call / apply)
  75. 75字符串
  76. 76DOM和事件
  77. 77哪些事件支持冒泡
  78. 78阻止冒泡
  79. 79HTMLCollection、NodeList
  80. 80dom.onclick 和 dom.addEventListener的区别
  81. 81e.target和e.currentTarget
  82. 82页面生命周期
  83. 83异步
  84. 84内存管理GC
  85. 85其它
  86. 86JavaScript 中日期时间格式转换
  87. 87input和object实现双向绑定
  88. 88JSON.stringify()
  89. 89escape、encodeURI&encodeURIComponent
  90. 90移动端滚动穿透和溢出
  91. 91ES6
  92. 92Map字典
  93. 93... 与rest
  94. 94proxy
  95. 95模块化
  96. 96Ajax、Fetch和Axios
  97. 97Webpack
  98. 98浏览器:事件循环
  99. 99浏览器内核
  100. 100浏览器同源策略
  101. 101输入URL回车后发生了什么
  102. 102HTTP
  103. 103HTTP 2.0
  104. 104浏览器存储
  105. 105鉴权
  106. 106Webstorage
  107. 107浏览器执行机制
  108. 108AST 抽象语法树
  109. 109性能优化
  110. 110CSS
  111. 111网络相关
  112. 112使用HTTP2.0
  113. 113图片
  114. 114CDN图片
  115. 115其他文件优化
  116. 116降低APP首页开屏渲染时间
  117. 117页面白屏
  118. 118HTTPS中间人攻击
  119. 119Web Worker
  120. 120Service Worker
  121. 121微前端
  122. 122Vue
  123. 123v-show 和 v-if 的区别
  124. 124双向数据绑定的原理
  125. 125Vue中的插槽使用
  126. 126Vue中的key
  127. 127Vue过滤器
  128. 128Vue中Scoped原理
  129. 129Vue中$nextTick的使用
  130. 130Vue中实现组件通信的方式
  131. 131Vue-router
  132. 132Vue路由传参
  133. 133前端路由
  134. 134Vuex
  135. 135虚拟DOM
  136. 136DIFF 算法
  137. 137Vue3和Vue2有哪些区别
  138. 138说一说你对React的理解
  139. 139React事件机制
  140. 140说一说你对react refs的理解
  141. 141react中key的作用
  142. 142组件开发
  143. 143有状态组件和无状态组件
  144. 144函数式组件和类组件的区别
  145. 145PureComponent&Component
  146. 146常见 Hooks
  147. 147状态管理
  148. 148redux toolkit
  149. 149React18新特性
  150. 150client中的createRoot取代以前的ReactDOM.render
  151. 151Suspense
  152. 152新的Hooks
  153. 153VDom一定更快吗
  154. 154Fiber