iis服务器助手广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue Router根据后台数据加载不同的组件实现
  • 335
分享到

Vue Router根据后台数据加载不同的组件实现

2024-04-02 19:04:59 335人浏览 独家记忆
摘要

目录实际项目中遇到的需求有一些不好的实现方式个人感觉比较好的实现方式功能已实现,但我又开始了新的思考最终方案——高阶组件实际项目中遇到的需求 同一个链接需要加载不同的页面组件。根据

实际项目中遇到的需求

同一个链接需要加载不同的页面组件。根据用户所购买服务的不同,有不同的页面展现。

有一些不好的实现方式

  • 直接把这几个组件写在同一个组件下,通过v-if去判断。如果这么做的话,甚至可以不使用Vue-router,直接把所有组件,都写在一个文件里面,全部通过v-if判断,也是可行的。(前提是几万行代码一起,你不嫌麻烦的话)
  • 在渲染这个链接的时候,直接去请求后台的数据,通过数据渲染不同的链接。(理论上是可行的,但如果用户没有用这个功能,这些链接每次都提前取了后台数据;另外如果用户知道了链接,直接访问链接,还是需要逻辑去判断用户该看到哪个页面)
  • 通过调用router.beforeEach,对每个路由进行拦截,当路由为我们指定的路由时,请求后台数据,动态跳转页面。(功能是可以完成,但实际上,这只是整个系统的一小块功能,不应该侵入整个路由系统,如果每个业务页面,都写在全局路由系统,也会导致路由的逻辑过于复杂)

个人感觉比较好的实现方式

在配置路由的地方获取服务器数据动态加载对应的组件


{
  path: 'shopKPI',
  // 如果提前把后台数据存到store里面,在这里访问store数据,可以直接判断出来
  // 但这种特定业务页面的数据放全局store,其他地方也不用,实在没有必要
  component: () => import('@/views/store/dataVersion'),
  name: 'store_KPI',
  menuName: '店铺参谋',
  meta: {
    codes: ['storeProduct.detail']
  }
}

理想很美好,现实的情况是,component接收的这个方法必须要同步的返回一个promise。

这时候我想到了上面不好的实现方式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>

把路由渲染对应的页面,改为渲染这个中间页面ChooseShopKPI


{
  path: 'shopKPI',
  // 如果提前把后台数据取到,在这里访问store数据,可以直接判断出来
  // 但这种特定业务页面的数据放全局store,其他地方也不用,实在没有必要
-  component: () => import('@/views/store/dataVersion'),
+  component: () => import('@/views/store/ChooseShopKPI'),
  name: 'store_KPI',
  menuName: '店铺参谋',
  meta: {
    codes: ['storeProduct.detail']
  }
}

这样就实现了我们期望的功能。

功能已实现,但我又开始了新的思考

这种方式虽然很好的解决了动态加载页面组件的问题。但也产生了一些小问题。

  • 如果这种通过服务器加载数据的页面后续增加的话,会出现多个ChooseXXX的中间页面。
  • 这种中间页面,实际上是做了二次路由,不熟悉逻辑的开发人员可能并不清楚这里面的页面跳转逻辑,增加了理解成本。

最终方案——高阶组件

通过对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>

直接在路由的配置中获取后台数据,并进行路由的分发。这样路由逻辑都集中在路由配置文件中,没有二次路由。维护起来不会头疼脑胀。

DynamicLoadComponent组件也得以复用,后续新增判断后台数据加载页面的路由配置,都可以导向这个中间组件。


{
  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

到此这篇关于Vue Router根据后台数据加载不同的组件实现的文章就介绍到这了,更多相关Vue Router后台数据加载不同的组件 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue Router根据后台数据加载不同的组件实现

本文链接: https://www.lsjlt.com/news/132085.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue Router根据后台数据加载不同的组件实现
    目录实际项目中遇到的需求有一些不好的实现方式个人感觉比较好的实现方式功能已实现,但我又开始了新的思考最终方案——高阶组件实际项目中遇到的需求 同一个链接需要加载不同的页面组件。根据...
    99+
    2024-04-02
  • AngularJS如何实现根据不同条件显示不同控件
    这篇文章将为大家详细讲解有关AngularJS如何实现根据不同条件显示不同控件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。由于项目需求,需要实现根据不同条件显示不同控件...
    99+
    2024-04-02
  • Vue + Vue-router如何实现同名路由切换数据不更新功能
    这篇文章将为大家详细讲解有关Vue + Vue-router如何实现同名路由切换数据不更新功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在默认情况下, 同名路由之间的...
    99+
    2024-04-02
  • Vue组件库ElementUI实现表格加载树形数据教程
    ElementUI实现表格树形列表加载教程,供大家参考,具体内容如下 Element UI 是一套采用 Vue 2.0 作为基础框架实现的组件库,一套为开发者、设计师和产品经理准备的...
    99+
    2024-04-02
  • 怎么实现Vue的数据可视化后台
    本篇内容介绍了“怎么实现Vue的数据可视化后台”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!主要功能点和实...
    99+
    2024-04-02
  • vue如何实现路由根据开发状态懒加载
    小编给大家分享一下vue如何实现路由根据开发状态懒加载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!路由根据开发状态懒加载1 一...
    99+
    2024-04-02
  • vue+vuex+axio从后台怎么获取数据存入vuex实现组件之间共享数据
    这篇文章主要介绍vue+vuex+axio从后台怎么获取数据存入vuex实现组件之间共享数据,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在vue项目中组件间相互传值或者后台获取的数...
    99+
    2024-04-02
  • Vue怎么实现分批加载数据
    本篇内容主要讲解“Vue怎么实现分批加载数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue怎么实现分批加载数据”吧!分批加载数据最近在写vue的项目,因为后台返回的数据量太大,在调用了高德...
    99+
    2023-06-30
  • Vue如何实现分批加载数据
    目录分批加载数据滚动加载数据分批加载数据 最近在写vue的项目,因为后台返回的数据量太大,在调用了高德地图渲染"polygon"覆盖物的时候处理不过来,直接蹦掉了...
    99+
    2024-04-02
  • Vue实现下拉滚动加载数据的示例
    目录第一步:安装第二步:引用第三步:使用Web项目经常会用到下拉滚动加载数据的功能,今天就来种草 Vue-infinite-loading 这个插件,讲解一下使用方法! 第一步:安装...
    99+
    2024-04-02
  • vue前端页面数据加载添加loading效果的实现
    目录前端页面数据加载添加loading效果具体实现全局loading配置1 再src/componennts/Spinner下面建立一个index.vue2 再utils下面tool...
    99+
    2024-04-02
  • vbscript怎么实现根据不同时间段显示不同的欢迎语
    本篇内容介绍了“vbscript怎么实现根据不同时间段显示不同的欢迎语”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本例中,VBScript...
    99+
    2023-06-08
  • vue中子组件向父组件传递数据如何实现加减功能
    小编给大家分享一下vue中子组件向父组件传递数据如何实现加减功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!如下图所示:当没有任何操作的时候父组件的值是 0当点击加号以后父组件的值是 1...
    99+
    2024-04-02
  • vue怎么实现滚动条加载更多数据
    这篇“vue怎么实现滚动条加载更多数据”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue怎么实现滚动条加载更多数据”文章吧...
    99+
    2023-07-04
  • vue组件中如何实现数据传递
    这篇文章给大家分享的是有关vue组件中如何实现数据传递的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:1、props:父组件 -->传值到子组件app.vue是父组...
    99+
    2024-04-02
  • vue与vue-i18n如何实现后台数据的多语言切换功能
    小编给大家分享一下vue与vue-i18n如何实现后台数据的多语言切换功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在XXX...
    99+
    2024-04-02
  • jquery中dataTable后台加载数据并分页的示例分析
    这篇文章主要为大家展示了“jquery中dataTable后台加载数据并分页的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jquery中dataTab...
    99+
    2024-04-02
  • vue如何实现不同路由的组件复用
    这篇文章主要为大家展示了“vue如何实现不同路由的组件复用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue如何实现不同路由的组件复用”这篇文章吧。不同路由的...
    99+
    2024-04-02
  • Vue实现添加数据到二维数组并显示
    目录添加数据到二维数组并显示读取二维数组添加数据到二维数组并显示 <li v-for="(item, index) in studentlist" :key="index"&g...
    99+
    2024-04-02
  • vue如何实现兄弟组件的数据传递
    本篇内容介绍了“vue如何实现兄弟组件的数据传递”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在main.js里面设置data{eventH...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作