欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue Router根據(jù)后臺數(shù)據(jù)加載不同的組件實現(xiàn)

 更新時間:2021年08月09日 08:50:07   作者:zhea55  
本文主要介紹了根據(jù)用戶所購買服務(wù)的不同,有不同的頁面展現(xiàn)。文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

實際項目中遇到的需求

同一個鏈接需要加載不同的頁面組件。根據(jù)用戶所購買服務(wù)的不同,有不同的頁面展現(xiàn)。

有一些不好的實現(xiàn)方式

  • 直接把這幾個組件寫在同一個組件下,通過v-if去判斷。如果這么做的話,甚至可以不使用vue-router,直接把所有組件,都寫在一個文件里面,全部通過v-if判斷,也是可行的。(前提是幾萬行代碼一起,你不嫌麻煩的話)
  • 在渲染這個鏈接的時候,直接去請求后臺的數(shù)據(jù),通過數(shù)據(jù)渲染不同的鏈接。(理論上是可行的,但如果用戶沒有用這個功能,這些鏈接每次都提前取了后臺數(shù)據(jù);另外如果用戶知道了鏈接,直接訪問鏈接,還是需要邏輯去判斷用戶該看到哪個頁面)
  • 通過調(diào)用router.beforeEach,對每個路由進行攔截,當(dāng)路由為我們指定的路由時,請求后臺數(shù)據(jù),動態(tài)跳轉(zhuǎn)頁面。(功能是可以完成,但實際上,這只是整個系統(tǒng)的一小塊功能,不應(yīng)該侵入整個路由系統(tǒng),如果每個業(yè)務(wù)頁面,都寫在全局路由系統(tǒng),也會導(dǎo)致路由的邏輯過于復(fù)雜)

個人感覺比較好的實現(xiàn)方式

在配置路由的地方獲取服務(wù)器數(shù)據(jù)動態(tài)加載對應(yīng)的組件

{
  path: 'shopKPI',
  // 如果提前把后臺數(shù)據(jù)存到store里面,在這里訪問store數(shù)據(jù),可以直接判斷出來
  // 但這種特定業(yè)務(wù)頁面的數(shù)據(jù)放全局store,其他地方也不用,實在沒有必要
  component: () => import('@/views/store/dataVersion'),
  name: 'store_KPI',
  menuName: '店鋪參謀',
  meta: {
    codes: ['storeProduct.detail']
  }
}

理想很美好,現(xiàn)實的情況是,component接收的這個方法必須要同步的返回一個promise。

這時候我想到了上面不好的實現(xiàn)方式1,稍微加以改造

<!-- ChooseShopKPI.vue -->
<template>
  <dataVersion v-if="!useNewShopKPI" />
  <ShopKPI v-else />
</template>

<script>
import { get } from 'lodash';
import { getStoreReportFormVersion } from '@/api/store';
import dataVersion from './dataVersion';
import ShopKPI from './ShopKPI';

export default {
  name: 'ChooseShopKPI',

  components: {
    dataVersion,
    ShopKPI,
  },

  data() {
    return { useNewShopKPI: false };
  },

  created() {
    getStoreReportFormVersion().then((res) => {
      if (get(res, 'data.data.new')) {
        this.useNewShopKPI = true;
      }
    });
  },
};
</script>

<style lang="css" scoped></style>

把路由渲染對應(yīng)的頁面,改為渲染這個中間頁面ChooseShopKPI

{
  path: 'shopKPI',
  // 如果提前把后臺數(shù)據(jù)取到,在這里訪問store數(shù)據(jù),可以直接判斷出來
  // 但這種特定業(yè)務(wù)頁面的數(shù)據(jù)放全局store,其他地方也不用,實在沒有必要
-  component: () => import('@/views/store/dataVersion'),
+  component: () => import('@/views/store/ChooseShopKPI'),
  name: 'store_KPI',
  menuName: '店鋪參謀',
  meta: {
    codes: ['storeProduct.detail']
  }
}

這樣就實現(xiàn)了我們期望的功能。

功能已實現(xiàn),但我又開始了新的思考

這種方式雖然很好的解決了動態(tài)加載頁面組件的問題。但也產(chǎn)生了一些小問題。

  • 如果這種通過服務(wù)器加載數(shù)據(jù)的頁面后續(xù)增加的話,會出現(xiàn)多個ChooseXXX的中間頁面。
  • 這種中間頁面,實際上是做了二次路由,不熟悉邏輯的開發(fā)人員可能并不清楚這里面的頁面跳轉(zhuǎn)邏輯,增加了理解成本。

最終方案——高階組件

通過對ChooseXXX進行抽象,改造為DynamicLoadComponent

<!-- DynamicLoadComponent.vue -->
<template>
  <component :is="comp"  />
</template>

<script>
export default {
  name: 'DynamicLoadComponent',
  props: {
    renderComponent: {
      type: Promise,
    },
  },
  data() {
    return {
      comp: () => this.renderComponent
    }
  },
  mounted() {},
};
</script>

<style lang="css" scoped></style>

直接在路由的配置中獲取后臺數(shù)據(jù),并進行路由的分發(fā)。這樣路由邏輯都集中在路由配置文件中,沒有二次路由。維護起來不會頭疼腦脹。

DynamicLoadComponent組件也得以復(fù)用,后續(xù)新增判斷后臺數(shù)據(jù)加載頁面的路由配置,都可以導(dǎo)向這個中間組件。

{
  path: 'shopKPI',
  component: () => import('@/views/store/components/DynamicLoadComponent'),
  name: 'store_KPI',
  menuName: '店鋪參謀',
  meta: {
    codes: ['storeProduct:detail'],
  },
  props: (route) => ({
    renderComponent: new Promise((resolve, reject) => {
      getStoreReportFormVersion()
        .then((responseData) => {
          const useNewShopKPI = get(responseData, 'data.data.shop_do');
          const useOldShopKPI = get(
            responseData,
            'data.data.store_data_show'
          );

          if (useNewShopKPI) {
            resolve(import('@/views/store/ShopKPI'));
          } else if (useOldShopKPI) {
            resolve(import('@/views/store/dataVersion'));
          } else {
            resolve(import('@/views/store/ShopKPI/NoKPIService'));
          }
        })
        .catch(reject);
    }),
  })
}

查看在線小例子(只支持chrome)
https://stackblitz.com/edit/vuejs-starter-jsefwq?file=index.js

到此這篇關(guān)于Vue Router根據(jù)后臺數(shù)據(jù)加載不同的組件實現(xiàn)的文章就介紹到這了,更多相關(guān)Vue Router后臺數(shù)據(jù)加載不同的組件 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue響應(yīng)式原理的示例詳解

    Vue響應(yīng)式原理的示例詳解

    Vue 最獨特的特性之一,是非侵入式的響應(yīng)系統(tǒng)。數(shù)據(jù)模型僅僅是普通的 JavaScript 對象。而當(dāng)你修改它們時,視圖會進行更新。本文將通過示例詳解Vue的響應(yīng)式原理,感興趣的可以了解一下
    2022-03-03
  • vue小白入門教程

    vue小白入門教程

    vue是一套用于構(gòu)建用戶界面的漸進式框架,本文通過實例給大家介紹了vue入門教程適用小白初學(xué)者,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-04-04
  • 解決vue中axios設(shè)置超時(超過5分鐘)沒反應(yīng)的問題

    解決vue中axios設(shè)置超時(超過5分鐘)沒反應(yīng)的問題

    這篇文章主要介紹了解決vue中axios設(shè)置超時(超過5分鐘)沒反應(yīng)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Vue 實用分頁paging實例代碼

    Vue 實用分頁paging實例代碼

    本篇文章主要介紹了Vue 實用分頁paging實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • vue中Element-ui 輸入銀行賬號每四位加一個空格的實現(xiàn)代碼

    vue中Element-ui 輸入銀行賬號每四位加一個空格的實現(xiàn)代碼

    我們在輸入銀行賬號會設(shè)置每四位添加一個空格,輸入金額,每三位添加一個空格。那么,在vue,element-ui 組件中,如何實現(xiàn)呢?下面小編給大家?guī)砹藇ue中Element-ui 輸入銀行賬號每四位加一個空格的實現(xiàn)代碼,感興趣的朋友一起看看吧
    2018-09-09
  • 關(guān)于Vue中axios的封裝實例詳解

    關(guān)于Vue中axios的封裝實例詳解

    這篇文章主要給大家介紹了關(guān)于Vue中axios的封裝的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者使用Vue具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Vue中添加過渡效果的方法

    Vue中添加過渡效果的方法

    本篇文章主要介紹了Vue中添加過渡效果的方法,Vue 在插入、更新或者移除 DOM 時,提供多種不同方式的應(yīng)用過渡效果,有興趣的同學(xué)可以了解一下。
    2017-03-03
  • vue大型項目之分模塊運行/打包的實現(xiàn)

    vue大型項目之分模塊運行/打包的實現(xiàn)

    這篇文章主要介紹了vue大型項目之分模塊運行/打包的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Node.js+Vue腳手架環(huán)境搭建的方法步驟

    Node.js+Vue腳手架環(huán)境搭建的方法步驟

    這篇文章主要介紹了Node.js+Vue腳手架環(huán)境搭建的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2020-03-03
  • Vue express鑒權(quán)零基礎(chǔ)入門

    Vue express鑒權(quán)零基礎(chǔ)入門

    這篇文章主要介紹了詳解express鑒權(quán),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02

最新評論