最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue動態(tài)組件與異步組件實例詳解

 更新時間:2019年02月23日 08:56:50   作者:deniro_li  
這篇文章主要介紹了Vue動態(tài)組件與異步組件,結(jié)合實例形式分析了動態(tài)組件與異步組件相關(guān)概念、功能及使用技巧,需要的朋友可以參考下

本文實例講述了Vue動態(tài)組件與異步組件。分享給大家供大家參考,具體如下:

1 在動態(tài)組件上使用 keep-alive

我們之前曾經(jīng)在一個多標(biāo)簽的界面中使用 is 特性來切換不同的組件:

<component v-bind:is="currentTabComponent"></component>

當(dāng)在這些組件之間切換的時候,你有時會想保持這些組件的狀態(tài),以避免反復(fù)重渲染導(dǎo)致的性能問題。例如我們來展開說一說這個多標(biāo)簽界面:

你會注意到,如果你選擇了一篇文章,切換到 Archive 標(biāo)簽,然后再切換回 Posts,是不會繼續(xù)展示你之前選擇的文章的。這是因為你每次切換新標(biāo)簽的時候,Vue 都創(chuàng)建了一個新的 currentTabComponent 實例。

重新創(chuàng)建動態(tài)組件的行為通常是非常有用的,但是在這個案例中,我們更希望那些標(biāo)簽的組件實例能夠被在它們第一次被創(chuàng)建的時候緩存下來。為了解決這個問題,我們可以用一個 <keep-alive> 元素將其動態(tài)組件包裹起來。

<!-- 失活的組件將會被緩存!-->
<keep-alive>
 <component v-bind:is="currentTabComponent"></component>
</keep-alive>

現(xiàn)在這個 Posts 標(biāo)簽保持了它的狀態(tài) (被選中的文章) 甚至當(dāng)它未被渲染時也是如此。

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: '本周末,中國消費(fèi)者即將迎來上半年最大的消費(fèi)網(wǎng)購峰值,6月17日父親節(jié),6月18日端午節(jié),也是京東、天貓等電商的618購物節(jié)。略微出人意料但又在情理之中的是,中國最大的社交平臺微信,近日密集上線了兩個與支付和電商相關(guān)的功能。'
        },
        {
          id: 2,
          title: '騰訊要花32億收購《絕地求生》開發(fā)商10%股份',
          content: '目前騰訊和藍(lán)洞已經(jīng)接近達(dá)成協(xié)議,如果交易成功,騰訊將成為藍(lán)洞的第二大股東。'
        },
        {
          id: 3,
          title: '這兩個地球之眼是真的嗎?形成原因至今仍是謎團(tuán)',
          content: '一名俄羅斯男子乘坐直升機(jī)游覽時,經(jīng)過俄羅斯薩哈林島(庫頁島)時,看到一個巨大的坑洞。地球上坑坑洞洞很多,本該不用大驚小怪。但當(dāng)飛機(jī)離得更近,換了個角度看這個坑時,他震驚了,這分明就是“地球的眼睛”。'
        }
      ],
      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">
          <h3>{{ selectedPost.title }}</h3>
          <div v-html="selectedPost.content"></div>
        </div>
        <strong v-else>
          請點擊某個標(biāo)簽頁
        </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 異步組件

在大型應(yīng)用中,我們可能需要將應(yīng)用分割成小一些的代碼塊,并且只在需要的時候才從服務(wù)器加載一個模塊。為了簡化,Vue 允許你以一個工廠函數(shù)的方式定義你的組件,這個工廠函數(shù)會異步解析你的組件定義。Vue 只有在這個組件需要被渲染的時候才會被觸發(fā),且會把結(jié)果緩存起來供未來重渲染。例如:

Vue.component('async-example', function (resolve, reject) {
  setTimeout(function () {
    //在此定義組件
    resolve({
      template: `
        <div>
          我是異步加載的哦
        </div>
      `
    })
  }, 1000);
});

如你所見,這個工廠函數(shù)會收到一個 resolve 回調(diào),這個回調(diào)函數(shù)會在你從服務(wù)器得到組件定義的時候被調(diào)用。你也可以調(diào)用 reject(reason) 來表示加載失敗。這里的 setTimeout 是為了演示用的,如何獲取組件取決于你自己。一個推薦的做法是將異步組件和 webpack 的 code-splitting 功能 一起配合使用:

Vue.component('async-webpack-example', function (resolve) {
 // 這個特殊的 `require` 語法將會告訴 webpack
 // 自動將你的構(gòu)建代碼切割成多個包,這些包
 // 會通過 Ajax 請求加載
 require(['./my-async-component'], resolve)
})

你也可以在工廠函數(shù)中返回一個 Promise,所以把 webpack 2 和 ES2015 語法加在一起,我們可以寫成這樣:

Vue.component(
 'async-webpack-example',
 // 這個 `import` 函數(shù)會返回一個 `Promise` 對象。
 () => import('./my-async-component')
)

當(dāng)使用局部注冊的時候,你也可以直接提供一個返回 Promise 的函數(shù):

new Vue({
 // ...
 components: {
  'my-component': () => import('./my-async-component')
 }
})

如果你是一個 Browserify 用戶同時喜歡使用異步組件,很不幸這個工具的作者明確表示異步加載“并不會被 Browserify 支持”,至少官方不會。Browserify 社區(qū)已經(jīng)找到了一些變通方案,這些方案可能會對已存在的復(fù)雜應(yīng)用有幫助。對于其它的場景,我們推薦直接使用 webpack,以擁有內(nèi)建的被作為第一公民的異步支持。

處理加載狀態(tài)

2.3.0+ 新增

這里的異步組件工廠函數(shù)也可以返回一個如下格式的對象:

const AsyncComponent = () => ({
 // 需要加載的組件 (應(yīng)該是一個 `Promise` 對象)
 component: import('./MyComponent.vue'),
 // 異步組件加載時使用的組件
 loading: LoadingComponent,
 // 加載失敗時使用的組件
 error: ErrorComponent,
 // 展示加載時組件的延時時間。默認(rèn)值是 200 (毫秒)
 delay: 200,
 // 如果提供了超時時間且組件加載也超時了,
 // 則使用加載失敗時使用的組件。默認(rèn)值是:`Infinity`
 timeout: 3000
})

注意如果你希望在 Vue Router 的路由組件中使用上述語法的話,你必須使用 Vue Router 2.4.0+ 版本。

希望本文所述對大家vue.js程序設(shè)計有所幫助。

相關(guān)文章

  • vue3結(jié)合typescript中使用class封裝axios

    vue3結(jié)合typescript中使用class封裝axios

    這篇文章主要為大家介紹了vue3結(jié)合typescript中使用class封裝axios實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • 詳解Vue組件之間通信的七種方式

    詳解Vue組件之間通信的七種方式

    這篇文章主要介紹了Vue組件之間通信的七種方式,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • vue element Cascader級聯(lián)選擇器解決最后一級顯示空白問題

    vue element Cascader級聯(lián)選擇器解決最后一級顯示空白問題

    這篇文章主要介紹了vue element Cascader級聯(lián)選擇器解決最后一級顯示空白問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 詳解element-ui日期時間選擇器的日期格式化問題

    詳解element-ui日期時間選擇器的日期格式化問題

    這篇文章主要介紹了詳解element-ui日期時間選擇器的日期格式化問題,本文用到了DateTimePicker來選擇日期時間,但是在將數(shù)據(jù)傳回后臺的過程中遇到了一些令人頭疼的問題,有興趣的一起來了解一下
    2019-04-04
  • Vue elementUI 自定義表單模板組件功能實現(xiàn)

    Vue elementUI 自定義表單模板組件功能實現(xiàn)

    在項目開發(fā)中,我們會遇到這種需求,在管理后臺添加自定義表單,在指定的頁面使用定義好的表單,這篇文章主要介紹了Vue elementUI 自定義表單模板組件,需要的朋友可以參考下
    2022-12-12
  • 關(guān)于Vue的異步組件

    關(guān)于Vue的異步組件

    在大型項目中,我們可能需要拆分應(yīng)用為更小的塊,并僅在需要時再從服務(wù)器加載相關(guān)組件。Vue 提供了defineAsyncComponent 方法來實現(xiàn)此功能,需要的朋友可以參考下
    2023-04-04
  • VUE中的export default和export使用方法解析

    VUE中的export default和export使用方法解析

    export default和export都能導(dǎo)出一個模塊里面的常量,函數(shù),文件,模塊等,在其它文件或模塊中通過import來導(dǎo)入常量,函數(shù),文件或模塊。但是,在一個文件或模塊中export,import可以有多個,export default卻只能有一個。
    2022-12-12
  • vue-video-player?播放m3u8視頻流的實現(xiàn)

    vue-video-player?播放m3u8視頻流的實現(xiàn)

    本文主要介紹了vue-video-player?播放m3u8視頻流的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • vue結(jié)合Axios+v-for列表循環(huán)實現(xiàn)網(wǎng)易健康頁面(實例代碼)

    vue結(jié)合Axios+v-for列表循環(huán)實現(xiàn)網(wǎng)易健康頁面(實例代碼)

    這篇文章主要介紹了vue結(jié)合Axios+v-for列表循環(huán)實現(xiàn)網(wǎng)易健康頁面,在項目下安裝axios,通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • VUE中this.$router.push點了后hash地址改變了頁面不跳轉(zhuǎn)

    VUE中this.$router.push點了后hash地址改變了頁面不跳轉(zhuǎn)

    本文主要介紹了VUE中this.$router.push點了后hash地址改變了頁面不跳轉(zhuǎn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11

最新評論

富阳市| 新蔡县| 通海县| 富源县| 肇庆市| 灵山县| 奉新县| 泰州市| 三穗县| 万州区| 仙居县| 芮城县| 年辖:市辖区| 佛学| 永靖县| 龙泉市| 慈溪市| 鹤岗市| 长岛县| 怀化市| 茂名市| 北碚区| 莱州市| 长丰县| 司法| 洪江市| 田林县| 台州市| 本溪市| 营口市| 榆林市| 双柏县| 洪江市| 凤翔县| 汕头市| 沙湾县| 綦江县| 凌源市| 桃江县| 呼玛县| 巴青县|