• vue源码分析-动态组件


    前面花了两节的内容介绍了组件,从组件的原理讲到组件的应用,包括异步组件和函数式组件的实现和使用场景。众所周知,组件是贯穿整个Vue设计理念的东西,并且也是指导我们开发的核心思想,所以接下来的几篇文章,将重新回到组件的内容去做源码分析,首先会从常用的动态组件开始,包括内联模板的原理,最后会简单的提到内置组件的概念,为之后的文章埋下伏笔。

    12.1 动态组件

    动态组件我相信大部分在开发的过程中都会用到,当我们需要在不同的组件之间进行状态切换时,动态组件可以很好的满足我们的需求,其中的核心是component标签和is属性的使用。

    12.1.1 基本用法

    例子是一个动态组件的基本使用场景,当点击按钮时,视图根据this.chooseTabs值在组件child1,child2,child3间切换。

    // vue
    <div id="app">
      <button @click="changeTabs('child1')">child1</button>
      <button @click="changeTabs('child2')">child2</button>
      <button @click="changeTabs('child3')">child3</button>
      <component :is="chooseTabs">
      </component>
    </div>
    // js
    var child1 = {
       
      template: '
    content1
    '
    , } var child2 = { template: '
    content2
    '
    } var child3 = { template: '
    content3
    '
    } var vm = new Vue({ el: '#app', components: { child1, child2, child3 }, methods: { changeTabs(tab) { this.chooseTabs = tab; } } })
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    12.1.2 AST解析

    的解读和前面几篇内容一致,会从AST解析阶段说起,过程也不会专注每一个细节,而是把和以往处理方式不同的地方特别说明。针对动态组件解析的差异,集中在processComponent上,由于标签上is属性的存在,它会在最终的ast树上打上component属性的标志。

    参考Vue3源码视频讲解:进入学习

    //  针对动态组件的解析
    function processComponent (el) {
       
      var binding;
      // 拿到is属性所对应的值
      if ((binding = getBindingAttr(el, 'is'))) {
       
        // ast树上多了component的属性
        el.component = binding;
      }
      if (getAndRemoveAttr(el, 'inline-template') != null) {
       
        el.inlineTemplate = true;
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    最终的ast树如下:

    12.1.3 render函数

    有了ast树,接下来是根据ast树生成可执行的render函数,由于有component属性,render函数的产生过程会走genComponent分支。

    // render函数生成函数
    var code = generate(ast, options);
    
    // generate函数的实现
    function generate (ast
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    【无标题】
    Vue学习笔记-配置代理服务器
    Golang Context 的并发安全性探究
    LeetCode27——移除元素
    算法设计与分析 SCAU19184 传球游戏
    pyflink读取kafka数据写入mysql实例
    砖家预测:腾讯云双11服务器优惠价格表(新鲜出炉)
    安装nodejs的详细流程保姆级(踩了无数次坑)
    PE 通过导入表注入 Dll
    我服了,SpringBoot升级后这服务我一个星期都没跑起来(上)
  • 原文地址:https://blog.csdn.net/yyzzabc123/article/details/127782797