您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Vue中怎么實現動態組件與異步組件,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
1 在動態組件上使用 keep-alive
我們之前曾經在一個多標簽的界面中使用 is 特性來切換不同的組件:
<component v-bind:is="currentTabComponent"></component>
當在這些組件之間切換的時候,你有時會想保持這些組件的狀態,以避免反復重渲染導致的性能問題。例如我們來展開說一說這個多標簽界面:
你會注意到,如果你選擇了一篇文章,切換到 Archive 標簽,然后再切換回 Posts,是不會繼續展示你之前選擇的文章的。這是因為你每次切換新標簽的時候,Vue 都創建了一個新的 currentTabComponent
實例。
重新創建動態組件的行為通常是非常有用的,但是在這個案例中,我們更希望那些標簽的組件實例能夠被在它們第一次被創建的時候緩存下來。為了解決這個問題,我們可以用一個 <keep-alive>
元素將其動態組件包裹起來。
<!-- 失活的組件將會被緩存!--> <keep-alive> <component v-bind:is="currentTabComponent"></component> </keep-alive>
現在這個 Posts 標簽保持了它的狀態 (被選中的文章) 甚至當它未被渲染時也是如此。
html:
<div id="dynamic-component-demo"> <button v-for="tab in tabs" v-bind:key="tab" v-bind:class="['tab-button',{active:currentTab === tab}]" v-on:click="currentTab = tab" >{{ tab }} </button> <keep-alive> <component v-bind:is="currentTabComponent" class="tab"></component> </keep-alive> </div>
js:
Vue.component('tab-posts', { data: function () { return { posts: [ { id: 1, title: '趕在618前夕,微信更新了兩個支付與電商功能', content: '本周末,中國消費者即將迎來上半年最大的消費網購峰值,6月17日父親節,6月18日端午節,也是京東、天貓等電商的618購物節。略微出人意料但又在情理之中的是,中國最大的社交平臺微信,近日密集上線了兩個與支付和電商相關的功能。' }, { id: 2, title: '騰訊要花32億收購《絕地求生》開發商10%股份', content: '目前騰訊和藍洞已經接近達成協議,如果交易成功,騰訊將成為藍洞的第二大股東。' }, { id: 3, title: '這兩個地球之眼是真的嗎?形成原因至今仍是謎團', content: '一名俄羅斯男子乘坐直升機游覽時,經過俄羅斯薩哈林島(庫頁島)時,看到一個巨大的坑洞。地球上坑坑洞洞很多,本該不用大驚小怪。但當飛機離得更近,換了個角度看這個坑時,他震驚了,這分明就是“地球的眼睛”。' } ], selectedPost: null } }, template: ` <div class="posts-tab"> <ul class="posts-sidebar"> <li v-for="post in posts" v-bind:key="post.id" v-bind:class="{selected:post === selectedPost}" v-on:click="selectedPost = post"> {{ post.title }} </li> </ul> <div class="selected-post-container"> <div v-if="selectedPost" class="selected-post"> <h4>{{ selectedPost.title }}</h4> <div v-html="selectedPost.content"></div> </div> <strong v-else> 請點擊某個標簽頁 </strong> </div> </div> ` }); Vue.component('tab-archive', { template: '<div>archive 頁面</div>' }); new Vue({ el: '#dynamic-component-demo', data: { currentTab: 'Posts', tabs: ['Posts', 'Archive'] }, computed: { currentTabComponent: function () { return 'tab-' + this.currentTab.toLowerCase(); } } });
css:
.tab-button { padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid #ccc; cursor: pointer; background: #f0f0f0; margin-bottom: -1px; margin-right: -1px; } .tab-button:hover { background: #e0e0e0; } .tab-button.active { background: #e0e0e0; } .tab { border: 1px solid #ccc; padding: 10px; } .posts-tab { display: flex; } .posts-sidebar { max-width: 40vw; margin: 0; padding: 0 10px 0 0; list-style-type: none; border-right: 1px solid #ccc; } .posts-sidebar li { white-space: nowrap; text-overflow: ellipsis; overflow: hidden; cursor: pointer; } .posts-sidebar li:hover { background: #eee; } .posts-sidebar li.selected { background: lightblue; } .selected-post-container { padding-left: 10px; } .selected-post > :first-child { margin-top: 0; padding-top: 0; }
效果:
2 異步組件
在大型應用中,我們可能需要將應用分割成小一些的代碼塊,并且只在需要的時候才從服務器加載一個模塊。為了簡化,Vue 允許你以一個工廠函數的方式定義你的組件,這個工廠函數會異步解析你的組件定義。Vue 只有在這個組件需要被渲染的時候才會被觸發,且會把結果緩存起來供未來重渲染。例如:
Vue.component('async-example', function (resolve, reject) { setTimeout(function () { //在此定義組件 resolve({ template: ` <div> 我是異步加載的哦 </div> ` }) }, 1000); });
如你所見,這個工廠函數會收到一個 resolve
回調,這個回調函數會在你從服務器得到組件定義的時候被調用。你也可以調用 reject(reason)
來表示加載失敗。這里的 setTimeout
是為了演示用的,如何獲取組件取決于你自己。一個推薦的做法是將異步組件和 webpack 的 code-splitting 功能 一起配合使用:
Vue.component('async-webpack-example', function (resolve) { // 這個特殊的 `require` 語法將會告訴 webpack // 自動將你的構建代碼切割成多個包,這些包 // 會通過 Ajax 請求加載 require(['./my-async-component'], resolve) })
你也可以在工廠函數中返回一個 Promise
,所以把 webpack 2 和 ES2015 語法加在一起,我們可以寫成這樣:
Vue.component( 'async-webpack-example', // 這個 `import` 函數會返回一個 `Promise` 對象。 () => import('./my-async-component') )
當使用局部注冊的時候,你也可以直接提供一個返回 Promise
的函數:
new Vue({ // ... components: { 'my-component': () => import('./my-async-component') } })
如果你是一個 Browserify 用戶同時喜歡使用異步組件,很不幸這個工具的作者明確表示異步加載“并不會被 Browserify 支持”,至少官方不會。Browserify 社區已經找到了一些變通方案,這些方案可能會對已存在的復雜應用有幫助。對于其它的場景,我們推薦直接使用 webpack,以擁有內建的被作為第一公民的異步支持。
處理加載狀態
2.3.0+ 新增
這里的異步組件工廠函數也可以返回一個如下格式的對象:
const AsyncComponent = () => ({ // 需要加載的組件 (應該是一個 `Promise` 對象) component: import('./MyComponent.vue'), // 異步組件加載時使用的組件 loading: LoadingComponent, // 加載失敗時使用的組件 error: ErrorComponent, // 展示加載時組件的延時時間。默認值是 200 (毫秒) delay: 200, // 如果提供了超時時間且組件加載也超時了, // 則使用加載失敗時使用的組件。默認值是:`Infinity` timeout: 3000 })
以上就是Vue中怎么實現動態組件與異步組件,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。