为什么Vue渲染功能可以处理单个文件组件?

Are*_*Lin 5 render vue.js vue-cli

我使用Vue cli并实现simple-webpack模板。

在入口文件中main.js,有如下代码:

render: h => h(App)
Run Code Online (Sandbox Code Playgroud)

我知道这hcreateElement函数的别名,我想知道为什么像这样的单个文件组件App可以作为参数传递,官方vue文档中没有提到这一点。

有人知道为什么吗?

Vam*_*hna 5

vue js 中的单文件组件(SFC)有一个.vue扩展名。

在 webpack 中,我们使用一个名为vue-loaderwhich 测试.vue文件的加载器

{
    test: /\.vue$/,
    loader: 'vue-loader',
    options: {
      loaders: {
      }
      // other vue-loader options go here
    }
}
Run Code Online (Sandbox Code Playgroud)

这些 SFC 被转换成一个普通的 es6 模块

<template>部分被转换为渲染函数vue-template-complier并注入到导出的模块中。

<style>标签被类似地由用于SASS任何预处理器处理或更少,然后通过 Post-css所述CSS相应地范围和内部动态添加<head>作为<style>标记的帮助下vue-style-loader

例如,如果App.vue文件如下所示:

<template>
    <div>
        <p class="myClass">{{msg}}</p>
    </div>
</template>

<script>
    export default{
        data(){
            return{
                msg: "Vue is awesome!"
            }
        }
    }
</script>
Run Code Online (Sandbox Code Playgroud)

它被转换为一个普通模块,导出为如下所示的对象:

export default {
    data(){
        return{
            msg: "Vue is awesome!"
        }
    },
    render(createElement) {
        return createElement("div", 
            [createElement("p", {class: {'myClass': true}}), this.msg]
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

这被导入为import App from './path/to/App.vue并在 root vue 实例中使用

 new Vue({
     el:"#app",
     render: h => h(App)
 })
Run Code Online (Sandbox Code Playgroud)

您可以查看这个小提琴,其中App作为普通对象传递给render根 vue 实例的函数。

有关更多详细信息,您可以查看此视频,其中 Evan You 对其进行了更详细的解释。