vue為什麼要求元件模板只能有乙個根元素

2021-10-04 03:26:29 字數 1418 閱讀 7104

要從兩個方面來說起:一、當我們例項化vue的時候,填寫乙個el選項,來指定我們的spa入口:

let vm =

newvue

()

>

<

/div>

<

/body>

這很好理解,就是為vue開啟乙個入口,那我們不妨來想想,如果我在body下這樣

>

<

/div>

>

<

/div>

<

/body>

vue其實並不知道哪乙個才是我們的入口,因為對於乙個入口來講,這個入口就是乙個『vue類』,vue需要把這個入口裡面的所有東西拿來渲染,處理,最後再重新插入到dom中。

如果同時設定了多個入口,那麼vue就不知道哪乙個才是這個『類』。

二、當我們在webpack搭建的vue開發環境下,使用單檔案元件時,你可能會這樣:

='component'

>

<

/div>

<

/template>

那這裡為什麼template下也必須有且只能有乙個div呢?

這裡我們要先看一看template這個標籤,這個標籤是html5出來的新標籤,它有三個特性:

1.隱藏性:該標籤不會顯示在頁面的任何地方,即便裡面有多少內容,它永遠都是隱藏的狀態;

2.任意性:該標籤可以寫在頁面的任何地方,甚至是head、body、sciprt標籤內;

3.無效性:該標籤裡的任何html內容都是無效的,不會起任何作用;

但是呢,你可以通過innerhtml來獲取到裡面的內容。

知道了這個,我們再來看.vue的單檔案元件。其實本質上,乙個單檔案元件,本質上(我認為)會被各種各樣的loader處理成為.js檔案(因為當你import乙個單檔案元件並列印出來的時候,是乙個vue例項),通過template的任意性我們知道,template包裹的html可以寫在任何地方,那麼對於乙個.vue來講,這個template裡面的內容就是會被vue處理為虛擬dom並渲染的內容,導致結果又回到了開始 :既然乙個.vue單檔案元件是乙個vue例項,那麼這個例項的入口在**?

如果在template下有多個div,那麼該如何指定這個vue例項的根入口?

為了讓元件能夠正常的生成乙個vue例項,那麼這個div會被自然的處理成程式的入口。

通過這個『根節點』,來遞迴遍歷整個vue『樹』下的所有節點,並處理為vdom,最後再渲染成真正的html,插入在正確的位置

那麼這個入口,就是這個樹的『根』,各個子元素,子元件,就是這個樹的『枝葉』,而自然而然地,這棵『樹』,就是指乙個vue例項了。

Vue例項為什麼只能有乙個根元素?

筆者入坑vue也有一段時間了,對vue也算了解,vuex vue router也用了不少 但是前幾天一看到這個面試問題卻感覺一下子回答不上了,想來每次寫 也都是拿來就用,也沒有仔細的思考過裡面的原因 每每報錯了就換一種寫法,能用就行,僅此而已。這個問題要從兩個方面來說 單檔案元件中,template...

Vue元件為什麼要export default

vue的模組機制 vue是通過webpack實現模組化,因此可以使用import來引入模組,例如 此外,你還可以在 bulid webpack.base.conf.js 檔案中修改相關配置 意思是,你的模組可以省略 js vue json 字尾,weebpack 會在之後自動新增上 可以用 符號代替...

C 為什麼模板只能在標頭檔案中實現?

模板類的定義和實現必須要在同乙個檔案中,通常是標頭檔案,編譯器要看到模板實現才能展開模板。因為初始化乙個模板,編譯器根據模板的引數建立乙個新的類。比如 templatestruct foo somewhere in a cpp foof 編譯器在解析到這段 時,會建立乙個新類,等價於 struct ...