关于 app.vue 组件的 render 函数问题

来源:3-2 createComponent

fy000

2020-08-05

就像大多数的 app.vue 一样

<template>
  <div id="app">
    {{message}}
  </div>
</template>

<script>
export default {
  name:'app',
  data ....
}
</script>

老师请问,这一节中的 createComponent函数的参数 Ctor是 app export 的对象,那么请问老师,那我在 template 中的 html 是在何时编译成 render 函数的呢?是 vue-loader 么,是的话,我不是纠结怎么编译的,我是纠结在哪里 将编译后的组件类型的 render 函数 产生的 vNode,与createComponent产生的 vNode 结合在一起的? 还是其他逻辑,不知道老师听懂我的意思么…总之,就是 template 产生的 vNode 在哪里…

写回答

2回答

前端工程师666777888

2021-04-02

1、进入项目:在new Vue时会在vm.$mount()中生成一个render函数

这个render函数的参数包含了整个项目的信息

2、render函数的参数实际上是个函数:createElement函数,这个createElement函数总共可以传4个参数。

render函数仅仅是个外壳,其实真正执行的是createElement函数

3、其实支撑整个项目的是第一个和第三个参数

第一个参数基本上是div

第二个参数是div上的属性,基本可有可无

第三个参数是children。就是你要说的问题所在:children中包含所有子节点。

其实children中放的是:createElement()    

________________________________________________________________________

在执行createElement函数时,其实先执行它的四个参数。

第三个参数children中可能还有createElement函数。

__________________________________________________________________


render: function (createElement) {

    return createElement(

         'div',    // 第一个参数

          {},     // 第二个参数    不用考虑

         [createElement(),createElement(),createElement()],   // 第三个参数

        2)     // 第四个参数    不用考虑

}

4个参数类似这种。先把children中的vnode生成,children中的vnode都生成完。

再调用挨着return 的最外面的createElement函数   这样就把真个项目的vnode生成了

0
0

ustbhuangyi

2020-08-06

render 函数执行的过程就是去创建组件的 vnode 树啊,看一下 render 函数的结果就知道了,参考:

https://cn.vuejs.org/v2/guide/render-function.html#%E6%A8%A1%E6%9D%BF%E7%BC%96%E8%AF%91

0
3
fy000
回复
ustbhuangyi
多谢! ..劳您费心
2020-08-06
共3条回复

Vue.js 源码深入解析 深入理解Vue实现原理

全方位讲解 Vue.js 源码,进阶高级工程师

4984 学习 · 1037 问题

查看课程