1 遞迴
為元件設定 name 屬性,這個元件就可以在自身的模板內遞迴呼叫自己。
html:
<div id="app">
<deniro-component :count="1"></deniro-component>
</div>
複製程式碼
js:
Vue.component('deniro-component',{
name:'deniro-component',
props:{
count:{
type:Number,
default:1
}
},
template:'\
<div class="child">\
<p>{{count}} 微信大變樣!看了這些新功能後,網友淡定不住了</p>\
<deniro-component\
:count="count + 1"\
v-if="count < 3"></deniro-component>\
</div>\
'
});
var app = new Vue({
el: '#app',
data: {}
});
複製程式碼
效果:
渲染結果:
可以利用元件的可遞迴特性,來實現一些具有不確定層級的元件,比如級聯選擇器和樹型元件。
2 內聯模板
一般情況下,元件的模板都是在 template 中定義的。我們也可以在元件標籤中加上 inline-template 屬性,這樣元件就會把它的內容作為實際的模板內容。
內聯模板可以接收父、子元件中宣告的資料,所以更加靈活。
html:
<div id="app2">
<deniro-component2 inline-template>
<div>
<h2>父元件中定義子元件模板</h2>
<p>{{content1}}</p>
<p>{{content2}}</p>
</div>
</deniro-component2>
</div>
複製程式碼
js:
Vue.component('deniro-component2',{
data:function () {
return {
content1:'雙屏手機一碰就碎?實測結果意外(來源於子元件)'
}
}
});
var app2 = new Vue({
el: '#app2',
data: {
content2:'AI正在改變所有行業 咖啡也將被消滅(來源於父元件)'
}
});
複製程式碼
渲染結果:
<div id="app2">
<div>
<h2>父元件中定義子元件模板</h2>
<p>雙屏手機一碰就碎?實測結果意外(來源於子元件)</p>
<p>AI正在改變所有行業 咖啡也將被消滅(來源於父元件)</p>
</div>
</div>
複製程式碼
如果父子元件定義的資料同名,那麼優先使用子元件中的資料。
因為作用域較難理解,所以除非必要,否則不建議使用。
3 動態載入
我們可以使用 is 來實現動態掛載元件。
html:
<div id="app3">
<deniro-component3 :is="currentView"></deniro-component3>
<button @click="change('A')">切換到 A 元件</button>
<button @click="change('B')">切換到 B 元件</button>
<button @click="change('C')">切換到 C 元件</button>
</div>
複製程式碼
js:
var app3 = new Vue({
el: '#app3',
components: {
componentA: {
template: '<div>元件 A</div>'
},
componentB: {
template: '<div>元件 B</div>'
},
componentC: {
template: '<div>元件 C</div>'
}
},
data: {
currentView: 'componentA'
},
methods: {
change: function (component) {
this.currentView = 'component' + component;
}
}
});
複製程式碼
效果:
data 中的 is 變數也可以直接繫結元件物件。
html:
<div id="app4">
<deniro-component4 :is="currentView"></deniro-component4>
</div>
複製程式碼
js:
var news={
template:'<p>無人機送快遞 漸行漸近</p>'
}
var app4 = new Vue({
el: '#app4',
data: {
currentView: news
}
});
複製程式碼
渲染結果:
<div id="app4">
<p>無人機送快遞 漸行漸近</p>
</div>
複製程式碼
4 非同步載入
當工程變得越來越大時,就需要考慮效能嘍。我們可以把元件定義成一個工廠函式,實現元件動態解析。Vue.js 會把本次渲染後的結果快取起來,從而提高效能。
html:
<div id="app5">
<deniro-component5></deniro-component5>
</div>
複製程式碼
js:
Vue.component('deniro-component5', function (resolve,reject) {
window.setTimeout(function () {
resolve({
template:'<div>全球首個5G電話撥通</div>'
});
},1000);
});
var app5 = new Vue({
el: '#app5'
});
複製程式碼
效果:
這裡使用 setTimeout 來模擬非同步下載,下載成功後會呼叫 resolve 方法。
一般情況下,會把元件的配置定義為物件配置,然後通過 Ajax 請求元件配置資訊,最後通過 resolve 傳入這些配置。