App.vue中有template,script,style,那么在main.js中import App from './App'导入的到底是什么内容,
console.log(APP)出来是下面的内容,是个对象
Object { name: "app", render: render(), staticRenderFns: Array[0], _compiled: true, beforeCreate: Array[2], __file: "src\App.vue", beforeDestroy: Array[1] }
为什么既可以template: '<App/>', 也可以components: { App }
是不是通过</>和{}来判断是template还是components,这些由VUE引擎来做?
你看到的东西,是vue帮你处理过的,渲染的时候会调用render(这句存疑,我再看看调用的啥)。
_init
处理的)。如:
意思就是当前组件的html(
template
)有一个div
和一个自定义标签Custom
,当前组件内的自定义标签是这些组件(components
):中的Custom
。可以看看文档的这部分
<App />
标签通过去components里按名字找对应的component后生成实例,然后会在实例的mounted
阶段被替换掉。然后template里的<App />
的使命就结束了。然后生成App组件的实例,再去index.html
中把id为app的元素,再把它替换掉,这是整个过程。你可以把App.vue中的
<div id="app">
改成<div id="test">
看看最后渲染出来的id是啥。Vue.prototype._render = function () {
里打断点,确定组件在注册而不挂载的时候是不会调用render的。然后我大概说下直接引入vue时,vue是怎么运行的。
<App />
,会去全局的Vue的components
集合里去找(在单文件组件中会逐级的往上找,也可能是别的机制),比如components里{APP}
,其实就是{App: App}
,你可以理解为key就是自定义标签的名字,value就是注册的组件,vue对这个调用一些如render方法之后,生成实例然后替换掉页面上的<App />
标签。使用引入的方式写下方代码
提示未注册,意思就是碰到自定义标签后,没有找到对应的component。
然后调整组件注册顺序,打断点并注释掉
new Vue
部分,可以观察到并没有进入断点。你也可以去vue.js多打一些断点,看是怎么运行的。
说的有些乱,也有些不清楚和错误的地方欢迎纠正。