第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

Vue—關于實例中為什么只能有一個根元素?

標簽:
Vue.js

这个问题分两种情况:

  • new Vue({el: ‘#app’})
  • 单文件组件template中根元素只能有一个

要解释这个问题,最好的方式就是直接看源码

一、Vue实例

一个vue实例的创建大致分为如下两个步骤

以vue2.5.2版本为例:

  1. 调用_init方法初始化事件和生命周期,对options做选项合并
  2. 看传进来的参数有没有el选项,如果有则调用$mount来挂载模板

_init方法在Vue的构造函数中被调用

image.png

_init方法的创建在initMixin中,可以看到在Vue的原型对象下添加了_init方法,里面的内容可以不管,大部分都是在做选项合并的操作,直接跳到我圈出来的地方,也就是我们接下来要说的第二步

image.png

$mount代码非常简单,判断el有没有、是不是浏览器环境,是就把query函数的返回值给它,否则赋值为undefined,做完这些事情之后调用mountComponent函数,这个函数看名字就知道是用来挂载模板

image.png

我们来看看query函数

query函数的作用就是判断传进来的el是不是元素,如果是就直接返回,否则使用浏览器document的querySelector API来获取它

image.png

到这里是否已经恍然大悟,原来答案这么简单,querySelector只会返回第一个匹配的dom元素,因此就算你写了两个顶层元素也默认只会选择第一个dom作为入口

如果你还不了解querySelector,请阅读如下文档:

因此,当我们实例化一个Vue时如果写了两个入口,现在你知道答案了吗?

let vm = new Vue({
    el:'#app',
    data:{ msg: '你好' }
})

<body>
    <div id='app'>{{msg}}</div>
    <div id='app'>{{msg}}</div>
</body>

二、单文件组件

.vue文件会通过vue-loader转换成js代码,在你通过import语句导入一个.vue时,实际上就是导入这个组件的实例,与上面同理,实例需要一个入口,如果在template标签中写了两个根元素,它也不知道将哪个元素作为组件实例的入口,因此干脆就告诉你只需要一个根元素

The template root requires exactly one element

源码如下所示,圈出来的这段代码的作用就是解析template并转换成渲染函数,最终$mount方法被调用时会将解析好的模板插入到对应的节点中

image.png

點擊查看更多內(nèi)容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優(yōu)惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消