html中創(chuàng)建并調(diào)用vue組件的幾種方法匯總
作者:Echoyya
出處:https://www.cnblogs.com/echoyya/
最近在寫(xiě)項(xiàng)目的時(shí)候,總是遇到在html中使用vue.js的情況,且頁(yè)面邏輯較多,之前的項(xiàng)目經(jīng)驗(yàn)都是使用腳手架等已有的項(xiàng)目架構(gòu),使用.vue文件完成組價(jià)注冊(cè),及組件之間的調(diào)用,還沒(méi)有過(guò)在html中創(chuàng)建組件的經(jīng)驗(yàn),所以借此機(jī)會(huì)學(xué)習(xí)總結(jié)一下。
方法一:Vue.extend( options )
- 用法:使用基礎(chǔ) Vue 構(gòu)造器,創(chuàng)建一個(gè)“子類”。參數(shù)是一個(gè)包含組件選項(xiàng)的對(duì)象。data 選項(xiàng)是特例,需要注意 - 在 Vue.extend() 中它必須是函數(shù)
- extend 創(chuàng)建的是 Vue 構(gòu)造器,而不是我們平時(shí)常寫(xiě)的組件實(shí)例,所以不可以通過(guò) new Vue({ components: testExtend }) 來(lái)直接使用,需要通過(guò) new Profile().$mount('selector選擇器') 來(lái)掛載到指定的元素上。
- Vue.extend + vm.$mount 組合
// 借用官網(wǎng)的例子,小小改動(dòng)了一下 // 在父組件中,創(chuàng)建一個(gè)子組件,并調(diào)用 <div id='app'> <button>{{message}}</button> <div id="mount-point"></div> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el:"#app", data:{ message:'父組件' }, }); // 創(chuàng)建構(gòu)造器 var Profile = Vue.extend({ template: '<p>{{firstName}} {{lastName}} {{alias}}</p>', data: function () { return { firstName: 'N', lastName: 'H', alias: 'Y' } } }) // 創(chuàng)建 Profile 實(shí)例,并掛載到一個(gè)元素上。 new Profile().$mount('#mount-point') </script>
方法二:Vue.component( id, [definition] ) + Vue.extend( options )
用法:Vue.component()注冊(cè)或獲取全局組件。注冊(cè)還會(huì)自動(dòng)使用給定的 id 設(shè)置組件的名稱
<div id="app"> <!-- 如果要使用組件,直接把組件的名稱以 HTML 標(biāo)簽的形式,引入到頁(yè)面中--> <todo :todo-data="todoList"></todo> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script type="text/javascript"> // 構(gòu)建一個(gè)子組件 var todoItem = Vue.extend({ template: ` <li> {{ text }} </li> `, props: ['text'] }) // 構(gòu)建一個(gè)父組件 var todoWarp = Vue.extend({ template: ` <ul> <todo-item v-for="(item, index) in todoData" v-text="item.text"></todo-item> </ul> `, props: ['todoData'], // 局部注冊(cè)子組件 components: { //使用 components 定義組件時(shí),若組件名稱使用駝峰命名,則在引用組件時(shí),需要把大寫(xiě)改為小寫(xiě),并且用'-'將單詞連接 todoItem: todoItem } }) // 注冊(cè)到全局 Vue.component('todo', todoWarp) // 等同于下面這種寫(xiě)法 Vue.component('todo',Vue.extend({ template : 'xxx', props:[xxx], components:'xxx' })) new Vue({ el: '#app', data: { todoList: [ { id: 0, text: '工作' }, { id: 1, text: '學(xué)習(xí)' }, { id: 2, text: '休息' } ] } }) </script>
方法三:直接使用Vue.component()
<div id="app"> <mycom></mycom> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script type="text/javascript"> Vue.component('mycom',{ template : '<h3>這是使用 Vue.component 創(chuàng)建的組件</h3>' }) new Vue({ el: '#app' }) </script>
但是這樣寫(xiě)會(huì)有一個(gè)問(wèn)題:在h3標(biāo)簽后出現(xiàn)另一個(gè)標(biāo)簽,就會(huì)出問(wèn)題,
Vue.component('mycom',{ template : '<h3>這是使用 Vue.component 創(chuàng)建的組件</h3><h3>這是使用 Vue.component 創(chuàng)建的組件</h3>' })
- 原因:組件template屬性指向的模板內(nèi)容,必須有且只能有唯一的一個(gè)根元素
- 解決方法: 用唯一的div作為父元素,將多個(gè)子元素包裹
方法四:使用Vue.component()
在被控制的 #app 外面使用 template 元素,定義組建的HTML模板結(jié)構(gòu)
<div id="app"> <mycom></mycom> </div> <template id="tem1"> <h1>這是 template 元素</h1> </template> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script type="text/javascript"> Vue.component('mycom', { template: '#tem1' }); new Vue({ el: '#app' }) </script>
方法五:使用Vue.component() + is
<div id="app"> <ul> <li is="todo-item" v-for="(todo,index) in todos " :title="todo" :key="index" @remove="removeTodo(index)"></li> </ul> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script type="text/javascript"> Vue.component('todo-item', { template: ` <li> {{title}} <button @click="$emit('remove')">remove</button> </li> `, props: ['title'] }) new Vue({ el: "#app", data: { todos: ["eating", "swimming", "reading"] }, methods: { removeTodo: function (index) { this.todos.splice(index, 1) } } })
補(bǔ)充說(shuō)明一下is屬性:
有些 HTML 元素,諸如 ul、ol、table 和 select,對(duì)于可以出現(xiàn)在其內(nèi)部元素是有嚴(yán)格限制的。而有些元素,諸如 li、tr 和 option,只能出現(xiàn)在特定的元素內(nèi)部。這會(huì)導(dǎo)致我們使用這些有約束條件的元素時(shí)遇到一些問(wèn)題。例如
<table> <blog-post-row></blog-post-row> </table>
這個(gè)自定義組件 會(huì)被作為無(wú)效的內(nèi)容提升到外部,并導(dǎo)致最終渲染結(jié)果出錯(cuò)。幸好這個(gè)特殊的 is attribute 給了我們一個(gè)變通的辦法:
<table> <tr is="blog-post-row"></tr> </table>
以上就是html中創(chuàng)建并調(diào)用vue組件的幾種方法匯總的詳細(xì)內(nèi)容,更多關(guān)于html 創(chuàng)建調(diào)用vue組件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
在Vue中使用Avue、配置過(guò)程及實(shí)際應(yīng)用小結(jié)
在項(xiàng)目中遇到通過(guò)點(diǎn)擊加號(hào)實(shí)現(xiàn)輸入框的增加、以及對(duì)該輸入框的輸入內(nèi)容進(jìn)行驗(yàn)證,通過(guò)這些誘導(dǎo)因素創(chuàng)作的這篇文章,本文重點(diǎn)給大家介紹在Vue中使用Avue、配置過(guò)程以及實(shí)際應(yīng)用,需要的朋友可以參考下2022-10-10vue實(shí)現(xiàn)數(shù)字+英文字母組合鍵盤(pán)功能
這篇文章主要介紹了vue實(shí)現(xiàn)數(shù)字+英文字母組合鍵盤(pán)功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12如何使用el-cascader組件寫(xiě)下拉級(jí)聯(lián)多選及全選功能
這篇文章主要介紹了如何使用el-cascader組件寫(xiě)下拉級(jí)聯(lián)多選及全選功能,因?yàn)槭怯腥x的功能,所以不能直接使用el-cascader組件,?而是選擇使用el-select組件,?在此組件內(nèi)部使用el-cascader-panel級(jí)聯(lián)面板,感興趣的朋友跟隨小編一起看看吧2024-03-03使用Mockjs模擬接口實(shí)現(xiàn)增刪改查、分頁(yè)及多條件查詢
Mock.js是一個(gè)模擬數(shù)據(jù)生成器,可以讓前端獨(dú)立于后端進(jìn)行開(kāi)發(fā),下面這篇文章主要給大家介紹了關(guān)于使用Mockjs模擬接口實(shí)現(xiàn)增刪改查、分頁(yè)及多條件查詢的相關(guān)資料,需要的朋友可以參考下2022-04-04vue監(jiān)聽(tīng)瀏覽器的后退和刷新事件,阻止默認(rèn)的事件方式
這篇文章主要介紹了vue監(jiān)聽(tīng)瀏覽器的后退和刷新事件,阻止默認(rèn)的事件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10vue路由跳轉(zhuǎn)了但界面不顯示的問(wèn)題及解決
這篇文章主要介紹了vue路由跳轉(zhuǎn)了但界面不顯示的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04