VueX源码分析(3)

还剩余

  • /module
  • /plugins
  • store.js

/plugins/devtool.js

  1. const devtoolHook =
  2. typeof window !== 'undefined' &&
  3. window.__VUE_DEVTOOLS_GLOBAL_HOOK__
  4. export default function devtoolPlugin (store) {
  5. if (!devtoolHook) return
  6. store._devtoolHook = devtoolHook
  7. devtoolHook.emit('vuex:init', store)
  8. devtoolHook.on('vuex:travel-to-state', targetState => {
  9. store.replaceState(targetState)
  10. })
  11. store.subscribe((mutation, state) => {
  12. devtoolHook.emit('vuex:mutation', mutation, state)
  13. })
  14. }
  • 浏览器开发者工具支持监控VueX

/plugins/logger.js

repeat

  1. function repeat (str, times) {
  2. return (new Array(times + 1)).join(str)
  3. }

解析:

  • 字符串重复几次repeat('0', 5)会返回'00000'

pad

  1. function pad (num, maxLength) {
  2. return repeat('0', maxLength - num.toString().length) + num
  3. }

解析:

  • 给数字补零,如pad(5, 5) 会返回'000005'

createLogger

  1. import { deepCopy } from '../util'
  2. export default function createLogger ({
  3. collapsed = true,
  4. filter = (mutation, stateBefore, stateAfter) => true,
  5. transformer = state => state,
  6. mutationTransformer = mut => mut,
  7. logger = console
  8. } = {}) {
  9. return store => {
  10. let prevState = deepCopy(store.state)
  11. store.subscribe((mutation, state) => {
  12. if (typeof logger === 'undefined') {
  13. return
  14. }
  15. const nextState = deepCopy(state)
  16. if (filter(mutation, prevState, nextState)) {
  17. const time = new Date()
  18. const formattedTime = ` @ ${pad(time.getHours(), 2)}:${pad(time.getMinutes(), 2)}:${pad(time.getSeconds(), 2)}.${pad(time.getMilliseconds(), 3)}`
  19. const formattedMutation = mutationTransformer(mutation)
  20. const message = `mutation ${mutation.type}${formattedTime}`
  21. const startMessage = collapsed
  22. ? logger.groupCollapsed
  23. : logger.group
  24. // render
  25. try {
  26. startMessage.call(logger, message)
  27. } catch (e) {
  28. console.log(message)
  29. }
  30. logger.log('%c prev state', 'color: #9E9E9E; font-weight: bold', transformer(prevState))
  31. logger.log('%c mutation', 'color: #03A9F4; font-weight: bold', formattedMutation)
  32. logger.log('%c next state', 'color: #4CAF50; font-weight: bold', transformer(nextState))
  33. try {
  34. logger.groupEnd()
  35. } catch (e) {
  36. logger.log('—— log end ——')
  37. }
  38. }
  39. prevState = nextState
  40. })
  41. }
  42. }
  • console的一些报错处理模板
  • store.subscribe监控的是commit,每次commit都会执行一次检测

VueX源码分析(3)的更多相关文章

  1. VueX源码分析(5)

    VueX源码分析(5) 最终也是最重要的store.js,该文件主要涉及的内容如下: Store类 genericSubscribe函数 resetStore函数 resetStoreVM函数 ins ...

  2. VueX源码分析(4)

    VueX源码分析(4) /module store.js /module/module.js import { forEachValue } from '../util' // Base data s ...

  3. VueX源码分析(2)

    VueX源码分析(2) 剩余内容 /module /plugins helpers.js store.js helpers要从底部开始分析比较好.也即先从辅助函数开始再分析那4个map函数mapSta ...

  4. VueX源码分析(1)

    VueX源码分析(1) 文件架构如下 /module /plugins helpers.js index.esm.js index.js store.js util.js util.js 先从最简单的 ...

  5. 逐行粒度的vuex源码分析

    vuex源码分析 了解vuex 什么是vuex vuex是一个为vue进行统一状态管理的状态管理器,主要分为state, getters, mutations, actions几个部分,vue组件基于 ...

  6. vuex源码分析3.0.1(原创)

    前言 chapter1 store构造函数 1.constructor 2.get state和set state 3.commit 4.dispatch 5.subscribe和subscribeA ...

  7. vuex 源码分析(七) module和namespaced 详解

    当项目非常大时,如果所有的状态都集中放到一个对象中,store 对象就有可能变得相当臃肿. 为了解决这个问题,Vuex允许我们将 store 分割成模块(module).每个模块拥有自己的 state ...

  8. vuex 源码分析(六) 辅助函数 详解

    对于state.getter.mutation.action来说,如果每次使用的时候都用this.$store.state.this.$store.getter等引用,会比较麻烦,代码也重复和冗余,我 ...

  9. vuex 源码分析(五) action 详解

    action类似于mutation,不同的是Action提交的是mutation,而不是直接变更状态,而且action里可以包含任意异步操作,每个mutation的参数1是一个对象,可以包含如下六个属 ...

随机推荐

  1. webpack配置Jquery全局包及全局包插件

    一:在配置文件配置: plugins: [ //将来以template为模版,生成一个index.html并且发布到webpack-dev-server开启的node服务器上面去 new HtmlWe ...

  2. linux下find查找与批量替换文件中指定内容

    经常在部署tomcat时需要替换配置文件中的ip,find命令批量替换还是很方便的 查找需要替换的ip,看看哪些文件有配置这个ip,执行下面命令: find ./ -type f -regex &qu ...

  3. Decorator模式(装饰器模式)

    Decorator模式? 假如现在有一块蛋糕,如果只涂上奶油,其他什么都不加,就是奶油蛋糕.如果加上草莓,就是草莓奶油蛋糕.如果再加上一块黑色巧克力板,上面用白色巧克力写上姓名,然后插上代表年龄的蜡烛 ...

  4. HDU-2588-GCD (欧拉函数)

    The greatest common divisor GCD(a,b) of two positive integers a and b,sometimes written (a,b),is the ...

  5. spring动态线程池(实质还是用了java的线程池)

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  6. DB2 触发器使用1

    本文基于多篇博文整理而来,目的是较全面的学会使用DB2触发器,后期再整理复杂的使用场景,看完本文应该能够自己创建一个基本的触发器. 1.什么是触发器当一个指定的 SQL 操作(如 DELETE,INS ...

  7. JS——通过标签获取元素、循环语句、数组去重

    通过标签获取元素: var aLi = document.getElementsByTagName('Li'); aLi[0].style.backgroundColor = 'gold'; 选中部分 ...

  8. Spring学习(六)整合web开发

    https://www.cnblogs.com/Leo_wl/p/4459274.html 1.加载Spring核心配置文件 //1.加载Spring配置文件,根据创建对对象 ApplicationC ...

  9. Shell笔试题3

    1.查找当前目录中所有大于500M的文件,把这些文件名写到一个文本文件中,并统计其个数.find ./ -size +500M -type f | tee file_list | wc -l 2.在目 ...

  10. sql 删除字段 出错

    1. 删除字段:   ALTER TABLE TALE_NAME DROP COLUMN nn;   2.报错: 消息 5074,级别 16,状态 1,第 1 行对象'DF__WorkOrder__I ...