type
status
date
slug
summary
tags
category
icon
password
问题总结
global eventBus 有何缺陷
eventBus 比较适合简单应用,但是随着需求增加,组件之间通信增多,eventBus 就显得不够直观,不方便我们管理,而且随着组件复用的增多,多个组件通信,又相互通信,就容易导致混乱。$store 如何注入到所有子组件
$store 是在 vuex install 初始化的时候赋值的,来看一下代码:在
vuexInit 方法中,首先判断如果有 this.$options.store 说明是 root 节点,判断 store 如果是 function 就将函数执行后的返回赋值给 this.$store ,否则将 options.store 直接赋值给 this.$store。不是
root 节点就从父组件中获取 $store,这样就保证只有一个全局的 $store。mapState 实现
mapState 请看 src/helpers.js 的 mapState 部分。mapGetter 如何映射
mapGetter 方法最后会返回一个对象,这个对象的每一个 key 值是 mappedGetter 方法,mappedGetter 会返回 this.$store.getters[key]。Mutation 同步 && Action 异步
在注册
action 时储会将 action 的回调包装成 promise,通过 dispatch 方法触发 action 的时候,最后 return 的是个 Promise 对象,所以 action 支持异步。注册
mutation 和通过 commit 方法触发 mutation 的时候,都只是一个同步的代码,仍然是同步代码。dispatch 方法实现
dispatch 请看 src/store.js 的 dispatch 部分。module 分割实现 && 局部状态 namespaced
实例化
ModuleCollection请看
class ModuleCollection。如何调用 vue-devtools
在
devtoolPlugin 方法中,取出挂在 window 对象的 __VUE_DEVTOOLS_GLOBAL_HOOK__ 保存到 devtoolHook,通过 emit vuex:init 初始化 store:内置 logger 插件实现
请看插件
devtool 部分。hotUpdate
使用
webpack 的 Hot Module Replacement API 实现热重载。时间穿梭功能实现
当我们调用
devtoolHook 方法的时候,会调用 devtoolHook 的 on 方法监听 vuex:travel-to-state 事件。在
vue-devtools 的源码的 src/bridge.js 中:我们看到事件监听是通过
Node 的 EventEmitter 监听的。在回调函数中接收
targetState 参数,调用 Store 的 replaceState 方法去修改 this._vm._data.$$state,当我们点击 devtoolHook 的某一条 mutation 历史记录,就能穿梭到历史记录。但是这个历史记录又是怎么出现的呢?是通过调用
store.subscribe 方法:每当调用
commit 方法的时候,都会调用循环调用
_subscribers 中的回调函数,回调函数会调用 devtoolHook.emit 方法,发送 vuex:mutation,说明改变了 mutation,并把 mutation 和 state 作为参数传入,devtoolHook 就会储存 mutation 的历史记录了。vuex 相关在 vue-devtools/src/backend/vuex.js:看到是通过一个
mutations 数组模拟这个历史记录,每次监听到 vuex:mutation 事件就是 push mutation 相关。- 作者:张小手
- 链接:https://zxs-1024.cn/article/vuex-questions
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章