天津时时彩走趋图 app天津时时彩开奖结果 查询天津时时彩的开奖结果查询 天津时时彩维护 天津时时彩开奖最快 天津时时彩视频程序 福彩天津时时彩 t天津时时彩走势 天津时时彩微信群 天津时时彩历史记录 天津时时彩购买大厅了 天津时时彩维护 全天天津时时彩计划 天津时时彩彩票台子 天津时时彩缩水工具 天津时时彩开奖信息 天津时时彩开奖结果lm0 哪有天津时时彩 t天津时时彩走势 天津时时彩全国开奖号码 天津时时彩投注 天津时时彩走势图上银狐网 天津时时彩怎么代理公司 天津时时彩怎么玩能赢 图感觉天津时时彩 天津时时彩怎么开 天津时时彩前三走势图表 天津时时彩怎么玩法 天津时时彩官方网址 大润发天津时时彩

全国咨询热线:400-618-4000

Vue 的 template 是如何编译成真正的 HTML

创建时间:2019年01月10日15时32分

1. 首先第一步实例化一个vue项目
2. 模板编译是在vue生命周期的mount阶段进行的
3. 在mount阶段的时候执行了compile方法将template里面的内容转化成真正的html代码
4. parse阶段是将html转化成ast(抽象语法树),用来表示代码的数据结构。在 Vue 中我把它理解为嵌套的、携带标签名、属性和父子关系的 JS 对象,以树来表现 DOM 结构。 
[JavaScript] ?#35838;?#26412;查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
html: "<div id="test">texttext</div>"
    //html转换成ast
    ast: {
    // 标签类型
    type: 1,
    // 标签名
    tag: "div",
    // 标签行内属性列表
    attrsList: [{name: "id", value: "test"}],
    // 标签行内属性
    attrsMap: {id: "test"},
    // 标签关系 父亲
    parent: undefined,
    // 字标签属性列表
    children: [{
        type: 3,
        text: 'texttext'
      }
    ],
    plain: true,
    attrs: [{name: "id", value: "'test'"}]
  }

5. optimize 会对parse生成的ast树进行静态?#35797;?#20248;化(静态内容指的是和数据没有关系,不需要?#30475;?#37117;刷新的内容)
6. generate 函数,会将每一个ast节点创建一个内部调用的方法等待后面的调用。
[JavaScript] ?#35838;?#26412;查看 复制代码
1
2
3
4
5
6
7
8
9
<template>
  <div id="test">
    {{val}}
    <img src="http://xx.jpg">
  </div>
</template>
//最后输出
{render: "with(this){return _c('div',{attrs:{"id":"test"}},[[_v(_s(val))]),_v(" "),_m(0)])}"}

7. 在complie过程结束之后会生成一个render字符串 ,接下来就是 new watcher这个时候会对绑定的数据执行监听,render 函数就是数据监听的回调所调用?#27169;?#20854;结果便是重新生成 vnode。当这个 render 函数字符串在第一次 mount、或者绑定的数据更新的时候,都会被调用,生成 Vnode。如果是数据的更新,那么 Vnode 会与数据改变之前的 Vnode 做 diff,对内容做改动之后,就会更新到我们真正的 DOM 上啦 



作者:传智播客前端与移动开发培训学院

首发: http://web.itcast.cn

大润发天津时时彩
八宝一后送彩金 逆战架子鼓谱图谱带歌 中山博爱棋牌官网 暑假班 勒沃库森vs曼联预测 尼斯大学录取条件 麻将来了cdkey在哪领 异域狂兽彩金 拜仁慕尼黑比赛直播 第五人格手游官网 全民突击雷神之锤和恒金涡轮谁好 美因茨古登堡博物馆