說說 Vue.js 元件的高階特性

deniro發表於2018-12-23

說說 Vue.js 元件的高階特性

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: {}
});
複製程式碼

效果:

說說 Vue.js 元件的高階特性

渲染結果:

說說 Vue.js 元件的高階特性

可以利用元件的可遞迴特性,來實現一些具有不確定層級的元件,比如級聯選擇器和樹型元件。

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;
		}
	}
});
複製程式碼

效果:

說說 Vue.js 元件的高階特性

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'
});
複製程式碼

效果:

說說 Vue.js 元件的高階特性

這裡使用 setTimeout 來模擬非同步下載,下載成功後會呼叫 resolve 方法。

一般情況下,會把元件的配置定義為物件配置,然後通過 Ajax 請求元件配置資訊,最後通過 resolve 傳入這些配置。


本文示例程式碼

相關文章