Vue.js 使用了基于 HTML 的模板語法,允許開發(fā)者聲明式地將 DOM 綁定至底層 Vue 實例的數據。所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循規(guī)范的瀏覽器和 HTML 解析器解析。

在Vue中定義組件模板有很多選擇。在我看來,至少有七種不同的方式:
字符串
模板文字
X-Templates
內聯(lián)
渲染功能
JSX
單頁組件
在本文中,我們將逐一介紹每種方法的示例,并討論其優(yōu)缺點,以便您了解在任何特定情況下使用哪種方法最好。
1、字符串
默認情況下,模板將被定義為JS文件中的字符串。我想我們都同意字符串中的模板是非常難以理解的。除了廣泛的瀏覽器支持之外,這個方法沒有什么特別之處。
Vue.component('my-checkbox', {
template: `<div class="checkbox-wrapper" @click="check">
<div :class="{ checkbox: true, checked: checked }">
</div><div class="title">{{ title }}</div></div>`,
data() {
return { checked: false, title: 'Check me' }
},
methods: {
check() { this.checked = !this.checked; }
}
});2、模板文字
ES6模板字面量(“backticks”)允許您跨多行定義模板,這是在常規(guī)Javascript字符串中無法做到的。雖然為了安全起見,您可能仍然應該轉換為ES5,但現(xiàn)在許多新瀏覽器都支持這些命令,并且更容易閱讀。
不過,這種方法并不完美;我發(fā)現(xiàn)大多數ide在語法高亮、制表符、換行等方面仍然讓您感到痛苦。
Vue.component('my-checkbox', {
template: ` < div class = "checkbox-wrapper"@click = "check" >
<div: class = "{ checkbox: true, checked: checked }" ></div>
<div class="title">{{ title }}</div ></div>`,
data() {
return { checked: false, title: 'Check me' }
},
methods: {
check() { this.checked = !this.checked; }
}
});/3、X-Templates
使用此方法,您的模板將在index.html文件中的腳本標記中定義。腳本標記由文本/x-template標記,并由組件定義中的id引用。
我喜歡這種方法,它允許您用正確的HTML標記編寫HTML,但缺點是它將模板與組件定義的其余部分分開。
Vue.component('my-checkbox', {
template: '#checkbox-template',
data() {
return { checked: false, title: 'Check me' }
},
methods: {
check() { this.checked = !this.checked; }
}
});<script type="text/x-template" id="checkbox-template">
<div class="checkbox-wrapper" @click="check">
<div :class="{ checkbox: true, checked: checked }"></div>
<div class="title">{{ title }}</div>
</div>
</script>4、內聯(lián)模板
通過向組件添加inline-template屬性,您可以向Vue表明內部內容是其模板,而不是將其視為分布式內容。
它的缺點與x-templates相同,但一個優(yōu)點是內容在HTML模板中的正確位置,因此可以在頁面加載時呈現(xiàn),而不是等到Javascript運行時。
Vue.component('my-checkbox', {
data() {
return { checked: false, title: 'Check me' }
},
methods: {
check() { this.checked = !this.checked; }
}
});<my-checkbox inline-template>
<div class="checkbox-wrapper" @click="check">
<div :class="{ checkbox: true, checked: checked }"></div>
<div class="title">{{ title }}</div>
</div>
</my-checkbox>5、渲染功能
呈現(xiàn)函數要求您將模板定義為Javascript對象。它們顯然是模板選項中最冗長和抽象的。
但是,這樣做的好處是模板更接近編譯器,并且允許您訪問完整的Javascript功能,而不是指令提供的子集。
Vue.component('my-checkbox', {
data() {
return { checked: false, title: 'Check me' }
},
methods: {
check() { this.checked = !this.checked; }
},
render(createElement) {
return createElement(
'div',
{
attrs: {
'class': 'checkbox-wrapper'
},
on: {
click: this.check
}
},
[
createElement(
'div',
{
'class': {
checkbox: true,
checked: this.checked
}
}
),
createElement(
'div',
{
attrs: {
'class': 'title'
}
},
[ this.title ]
)
]
);
}
});6、JSX
Vue中最有爭議的模板選項是JSX。一些開發(fā)人員認為JSX丑陋、不直觀,是對Vue精神的背叛。
JSX要求您首先進行轉換,因為瀏覽器無法讀取它。但是,如果需要使用呈現(xiàn)函數,JSX肯定是定義模板的一種不那么抽象的方法。
Vue.component('my-checkbox', {
data() {
return { checked: false, title: 'Check me' }
},
methods: {
check() { this.checked = !this.checked; }
},
render() {
return <div class="checkbox-wrapper" onClick={ this.check }>
<div class={{ checkbox: true, checked: this.checked }}></div>
<div class="title">{ this.title }</div>
</div>
}
});7、單個文件組件
只要您對在設置中使用構建工具感到滿意,單個文件組件就是模板選項之王。它們帶來了兩方面的好處:允許您在編寫標記的同時將所有組件定義保存在一個文件中。
它們需要換位,而且有些ide不支持這種文件類型的語法高亮顯示,但在其他方面很難打敗它們。
<template>
<div class="checkbox-wrapper" @click="check">
<div :class="{ checkbox: true, checked: checked }"></div>
<div class="title">{{ title }}</div>
</div>
</template>
<script>
export default {
data() {
return { checked: false, title: 'Check me' }
},
methods: {
check() { this.checked = !this.checked; }
}
}
</script>您可能會爭辯說,有更多的模板定義的可能性,因為您可以使用模板預處理程序,如Pug與SFCs!
哪個最好?
當然沒有一種完美的方式,每一種都應該根據你的用例來判斷。我認為最好的開發(fā)人員會意識到所有可能性,并將每個開發(fā)人員作為他們的Vue.js工具帶中的工具!
英文原文地址:https://vuejsdevelopers.com/2017/03/24/vue-js-component-templates/
相關推薦:
2020年前端vue面試題大匯總(附答案)
vue教程推薦:2020最新的5個vue.js視頻教程精選
更多編程相關知識,請訪問:編程入門!!
標題名稱:Vue.js中定義組件模板的幾種方法介紹
標題來源:http://chinadenli.net/article0/cgjsio.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、品牌網站建設、微信公眾號、定制開發(fā)、小程序開發(fā)、外貿建站
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)