3-1作业参考答案 1

vue

基础结构

  1. el指向目标元素
  2. render接收h h->创建虚拟dom render返回虚拟dom

生命周期

  1. 初始化 事件&生命周期
  2. beforeCreate
  3. 初始化 注入及校验
  4. created
  5. el?
  6. template?
  7. beforeMount
  8. vm.$el 替换 el
  9. mounted

语法概念

  1. 插值表达式{{}}
  2. 14个内置指令及自定义指令
  3. 计算属性&监听器
  4. class&style绑定
  5. 条件渲染(v-if/v-show)&列表渲染(v-for:key)
  6. 表单输入绑定(v-model)
  7. 组件Component
  8. 插槽slot
  9. 插件VueRouter/Vuex
  10. 混入mixin
  11. 深入响应式原理
  12. 不同构建版本的vue

VueRouter工作步骤

  • import VueRouter from 'vue-router'
  • Vue.use(VueRouter)
  • 路由规则router
  • new VueRouter 传入路由规则
  • 实例化Vue并传入router时会在vm挂载route(路由规则)和router(路由对象)

动态路由

  • 通过路由规则里props设置为true 将url参数映射到props

嵌套路由

  • 在相同布局中嵌入路由

编程式导航

  • this.$router.push(path, object)
  • this.$router.replace(path);
  • this.$router.push(path, { params: xxx })
  • this.$router.go(number)

hash/history B端路由

  • hash
    • 带#
    • 基于锚点 onhashchange
  • history
    • 正常url
    • 基于html5的history api(IE10+)
    • pushState/replaceState
    • 需要服务器支持(服务器没有带路由的页面)
    • node环境下 connect-history-api-fallback
    • nginx环境下 try_files $uri $uri/ /index.html;

Vue构建版本

  • 运行时 没有template 要提前编译
  • 完整版 包含运行时和编译器 程序运行时把模版编译成render
  • 见utils/vue-router

模拟vue

数据驱动

  • 数据响应式 - 避免操作dom
  • 双向绑定 - 数据&视图
  • 数据驱动 - 关注数据

vue核心原理V2.6

  • Object.defineProperty

vue核心原理V3.0RC

  • Proxy - ES6API 不支持IE 性能由浏览器优化

发布订阅模式

  • 订阅者
  • 发布者
  • 信号中心

观察者模式

  • Watcher 订阅者
  • Dep 发布者
    • subs
    • addSubs
    • notify()

发布订阅模式与观察者模式

  • 观察者模式由订阅者和发布者直接交互
  • 发布订阅模式:订阅者与事件中心交互 发布者下发消息至事件中心

Vue响应式原理模拟(src/utils/vue)

  • 功能
    • 负责接收初始化参数(选项)
    • 将data内的属性注入到vue实例并转换成getter/setter
    • 负责调用监听observer监听data中所有属性的变化
    • 负责调用compiler解析指令/差值表达式
    • 类图
      • options/el/$data
      • _proxyData()
    • Observer
    • 负责将data选项中的属性转换为响应式数据
    • data中某个属性也是对象,把该属性转换成响应式数据
    • 数据变化发送通知
      • 类图
      • walk(data) - 遍历
      • defineReactive
    • Compiler
    • 负责编译模版,解析指令/差值表达式
    • 负责页面首次渲染
    • 当数据变化后重新渲染视图
    • 类图
      • el
      • vm
      • compile(el)
      • compileElement(node)
      • compileText(node)
      • isDirective(arrtName)
      • isTextNode(node)
      • isElementNode(node)
    • Dep
    • 收集依赖 添加观察者
    • 通知所有观察者
    • 类图
      • subs
      • addSub()
      • notify()
    • Watcher
    • 当数据变化触发依赖 dep通知所有的Watcher实例更新视图
    • 自身实例化时要往dep对象中添加自己
    • 类图
      • vm
      • key
      • cb
      • oldValue
      • update()

虚拟dom

模块

  • 导入
  • 注册
  • 使用 patch 第2个参数

snabbdom源码

如何看源码

  1. 宏观了解
  2. 带着目标看
  3. 不求甚解
  4. 调试
  5. 参考资料
核心
  • h创建js对象(vnode)
  • init设置模块 返回patch
  • patch比较新旧vnode
  • 映射真实dom
h函数
  • vue中render的参数
  • 来自hyperscript
  • 用来创建vnode
  • 函数重载
    • 参数个数或类型不同的函数
  • 核心是调用vnode返回一个虚拟节点
vnode函数
  • 就是返回一个js对象 用来描述虚拟dom
  • patch(oldVnode, newVnode)
    • 对比新旧是否相同的根据(key&sel)
    • 如果不是 直接删 重新渲染
    • 判断text 如果是 不同就直接更新
    • 判断children 如果有 判断是不是有变化 用diff算法
    • diff只进行同层级比较
  • init(modules - 模块, domApi - 可选(default htmlDomApi))
    • 返回了patch
  • createElm
    • 触发用户钩子函数 init
    • 将vnode转换成DOM对象存储到vnode.elm中(此时还没有渲染到页面)
      • sel === '!' -> 注释节点
      • sel不为空
        • 创建对应dom
        • 触发模块的钩子函数create
        • 创建所有子节点的dom
        • 触发用户的钩子函数create
        • 如果vnode中包含insert则追加插入
      • sel为空 -> 返回文本节点
    • 返回vnode.elm
  • addVnode
  • removeVnode
  • patchVnode
  • updateChildren
    • 同层级对比 时间复杂度O(n)
    • 旧开始/新开始 - 按索引正序依次对比
    • 旧结束/新结束 - 按索引倒序依次对比
    • 旧开始/新结束 - 如果相同则将旧开始移动到旧结束之后 按索引倒序依次对比
    • 旧结束/新开始 - 如果相同则将旧结束移动到旧开始之前 按索引正序依次对比
    • 新开始在旧的里面去找 - 如果有 移动到最前面 如果没有 添加到最前面
    • 循环结束之后 旧的少于新的 对比开始节点 索引依次后移 对比结束节点 索引依次向前 完全结束之后 新的中剩余整体插入到旧的之后
    • 循环结束之后 旧的多于新的 对比开始节点 索引依次后移 对比结束节点 索引依次向前 完全结束之后 旧的中剩余整体删除
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345