首页 > 编程语言 >vue2源码-六、根据render函数生成vnode

vue2源码-六、根据render函数生成vnode

时间:2023-04-16 19:13:56浏览次数:41  
标签:function return render vm 源码 vue2 data 节点

根据render函数生成vnode

  1. 上文介绍

    上面已经将模板编译成了render函数,下面就要使用render函数,从而完成渲染的操作:

    首先,根据render函数生成虚拟节点;然后根据虚拟节点+真实数据生成真实节点。

    实现mountComponent方法,完成渲染

  2. 虚拟节点生成

    • 封装vm._render方法。

        Vue.prototype._render = function () {
          // 让with指中的this指向vm
          // 当渲染的时候会去实例取值,就可以将属性和视图绑定在一起
          return this.$options.render.call(this); // 通过ast语法转义后生成的render方法
        };
      

      _render被调用时,内部会调用_c_v_s三个方法

      所以,在vm._render方法中,需要完成以下几件事:

      • 调用render函数
      • 提供_c_vs三个方法
        Vue.prototype._c = function () {
          return createElementVNode(this, ...arguments);
        };
      
        Vue.prototype._v = function () {
          return createTextVNode(this, ...arguments);
        };
      
        Vue.prototype._s = function (value) {
            // 不是对象
          if (typeof value !== "object") return value;
            // 是对象,返回字符串
          return JSON.stringify(value);
        };
      
    • _s方法

      如上面所示。

    • 实现_c_v方法

      观察_c_v调用了两个方法,因此实现两个方法:

      export function createElement() { 
        // 返回元素虚拟节点
      }
      export function createText() {  
        // 返回文本虚拟节点
      }
      

      这两个方返回虚拟节点。

      实现:

      // h() _c()
      
      export function createElementVNode(vm, tag, data = {}, ...children) {
        if (data == null) {
          data = {}
        }
        let key = data.key
        if (key) {
          delete data.key
        }
        return vnode(vm, tag, key, data, children)
      }
      
      // _v()
      export function createTextVNode(vm, text) {
        return vnode(vm, undefined, undefined, undefined, undefined, text)
      }
      
      // ast一样吗?ast做的是语法层面的转化,他描述的是语法本身
      // 我们的虚拟dom是描述的dom元素,可以增加自定义属性
      function vnode(vm, tag, key, data, children, text) {
        return {
          vm, // 是谁的虚拟节点
          tag, // 标签
          key, // 键
          data, // 数据
          children,  // 孩子
          text, // 文本
        }
      }
      
  3. 总结生成虚拟节点

    根据render函数,生成vnode

    • 封装vm._render返回虚拟节点
    • _s_c_v的实现

标签:function,return,render,vm,源码,vue2,data,节点
From: https://www.cnblogs.com/dgqp/p/17323823.html

相关文章

  • DAPLink源码生成Keil工程并编译成功——笔记(实践篇)
    本文介绍使用DAP源码生产Keil工程的步骤。一、前期准备工作以下1~4为步骤:1.安装Python3(https://www.python.org/downloads/),并添加至路径PATH,此处忘截图了,总之看见pip、alluser、addtoPATH之类的就勾选。(网上也有些帖子说暂时不支持Python3要用Python2.7的,本人实测Pyt......
  • eureka源码简单剖析-服务端(服务续约接口)
           ......
  • eureka源码简单剖析-服务端(服务注册接口-作用是客户端的注册服务)
    本部分讲的是客户端的一些服务注册要注册中心,就是服务的提供者将服务注册到注册中心,方便消费者拿到需要的服务  peer是集群的模式 然后看下这个super.register(info,leaseDuration,isReplication);   日常学习使用的一般是eureka单机模式,企业使用都是eureka......
  • r0tracer 源码分析
    使用方法修改r0tracer.js文件最底部处的代码,开启某一个Hook模式。functionmain(){Java.perform(function(){console.Purple("r0tracerbegin...!")//0.增加精简模式,就是以彩虹色只显示进出函数。默认是关闭的,注释此行打开精简模式。//is......
  • eureka源码简单剖析-服务端(服务接口暴露策略)
    下面来看下服务接口暴露的策略。其中服务端使用了Jersey框架,而Jersey框架是一个发布restful风格接口的框架,类似我们使用的springmvc, 然后下面看下jersey部分    以上就是服务接口暴露的相关策略部分......
  • Visual Studio Code开发常用的工具栏选项,查看源码技巧以及【vscode常用的快捷键】
    一、开发常用的工具栏选项1、当前打开的文件快速在左侧资源树中定位:其实打开了当前的文件已经有在左侧资源树木定位了,只是颜色比较浅2、打开太多文件的时候,可以关闭3、设置查看当前类或文件的结构OUTLINE相当于idea查看当前类或接口的结构Structure二、查看......
  • OPCUA实践之winnt服务源码分享
    前言孔乙己显出极高兴的样子,将两个指头的长指甲敲着柜台,点头说:“对呀,对呀!......OPCUA,你用过么?”大家好,我是44岁的大龄程序员码农阿峰。离开上一个项目近半年了,这时当时在项目做的3个winnt服务,算是OPCUA的初次使用,代码并没有什么出彩的地方,却是能正常运行,而且工作了近1年的时......
  • Vue2.0 学习 第三组 条件语句
    本笔记主要参考菜鸟教程和官方文档编写。1.v-if在div或者之类的dom中使用v-if可以控制是否插入该dom,控制由v-if的true和false决定。如:<divid="app"><divv-if="test"></div></div><script>newVue({el:"#app",data:{test:true}})</script>2.v-show......
  • IDEA进入一个类的源码
    进入一个类的源码按住Ctrl后单击类名即可进入类的源码单击Structure即可看到类里的方法......
  • vue2源码-五、将模板编译解析成AST语法树2
    生成render函数前言上篇,生成ast语法树,而这篇使用ast语法树生成render函数。exportfunctioncompileToFunction(template){//1,将模板编译称为AST语法树letast=parserHTML(template);//2,使用AST生成render函数letcode=codegen(ast);}生成r......