vue运行机制

Vue的运行主要包括模板编译、响应式系统、初始渲染和数据更新。模板编译成render函数,响应式通过Object.defineProperty监听数据变化。首次渲染时,执行render函数生成vdom并绑定依赖。当data变化时,触发更新,通过patch方法对比新旧vnode更新视图。
摘要由CSDN通过智能技术生成

vue运行机制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oZPPdV43-1583663123391)(./imgs/vue运行机制.png)]

vue核心的执行过程主要分为这几个阶段:

1)模板编译:生成可复用的render函数

2)响应式:通过Object.definedProperty监听到对象属性的get和set,实现双向绑定

3)初始渲染:执行render函数,访问data中的值,会被get监听,调用patch方法生成vdom

4)数据改变:数据发生改变会触发set,会进行更新re-render,通过patch方法对新旧vnode对比,更新视图

Vue 如何解析模板

  • 模板是什么

    • 本质:模板就是字符串

    • 与html格式很像,但是模板中是有逻辑的,可以嵌入JS变量,如v-if, v-for等

    • 视图最终还是需要由模板生成 html 来显示

    • 模板必须先要转换成JS代码

      • 有逻辑(v-if, v-for),必须用JS才能实现(图灵完备)

      • 转换为html渲染页面,必须用JS才能实现

      • 因此,模板要转换成render函数

  • render函数

    • render函数包含了模板中所有的信息,返回 vnode,解决了模板中的逻辑(v-if, v-for)问题

    • 如何找到最终生成的render函数
      找到vue源码,src/compiler/codegen/index.js,generate函数的render返回值

  • render函数与vdom

    • 模板生成 html:vm._c

    • vm._c 和 snabbdom 中的 h 函数的实现很像,都是传入标签,属性,子元素作为参数

    • Vue.js 的 vdom 实现借鉴了 snabbdom

    • updateComponent 中实现了 vdom 的 patch

    • 页面首次渲染执行 updateComponent

    • data 中每次修改属性,都会执行 updateComponent

Vue运行机制

第一步:解析模板成render函数:

  • 首先要知道render函数的生成是在打包的时候,为什么呢?webpack打包的时候我们使用到了vue-template-compiler这个loader,它的作用是将template编译成render函数,所以说编译是第一步;响应式监听是在代码执行的时候。

  • 编译过程compile分为parse,optimize,generate三部分

    • parse:将template解析成抽象语法树

    • optimize:每次重新渲染中,DOM中有一部分是不需要改变的,我们称之为static sub-trees,这一部分可以分离出来存储成常量,然后re-render的过程中也不再去渲染它,以及后边的patch过程也不再管它,比如我们常见的html的header等基本不会改变。

    • generate:generate过程会根据ast生成虚拟dom树,即vnode(在代码中是${code}),另外还会生成optimize中的静态树。

    function generate (
      ast: ASTElement | void,
      options: CompilerOptions
    ): CodegenResult {
         
      const state = new CodegenState(options)
      const code = ast ? genElement(ast, state) : '_c("div")'
      return {
         
        render: `with(this){return ${
           code}}`,
        staticRenderFns
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值