Vue Router根据后台数据加载不同的组件实现
作者:zhea55 发布时间:2023-07-02 16:59:14
目录
实际项目中遇到的需求
有一些不好的实现方式
个人感觉比较好的实现方式
功能已实现,但我又开始了新的思考
最终方案——高阶组件
实际项目中遇到的需求
同一个链接需要加载不同的页面组件。根据用户所购买服务的不同,有不同的页面展现。
有一些不好的实现方式
直接把这几个组件写在同一个组件下,通过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
来源:https://www.cnblogs.com/zhea55/p/15115555.html


猜你喜欢
- 如下所示:#利用小波分析进行特征分析#参数初始化inputfile= 'C:/Users/Administrator/Desktop
- 很多人都将<数据库设计范式>作为数据库表结构设计“圣经”,认为只要按照这个范式需求设计,就能让设计出来的表结构足够优化,既能保证
- 类的定义Python中,定义类是通过class关键字,例如我们定义一个存储学生信息的类:class Student(object):pass
- 爬取TOP500的音乐信息,包括排名情况、歌曲名、歌曲时间。网页版酷狗不能手动翻页进行下一步的浏览,仔细观察第一页的URL:http://w
- MySQL中的事件调度器,EVENT,也叫定时任务,类似于Unix crontab或Windows任务调度程序。EVENT由其名称和所在的s
- 目录索引模型B+Tree索引选择索引优化索引选择性覆盖索引最左前缀原则+索引下推前缀索引唯一索引索引失效总结索引模型哈希表适用于只有等值查询
- pytorch 权重weight 与 梯度grad 可视化查看特定layer的权重以及相应的梯度信息打印模型观察到model下面有modul
- 之前在训练网络的时候加载数据都是稀里糊涂的放进去的,也没有理清楚里面的流程,今天整理一下,加深理解,也方便以后查阅。pytorch+skle
- 一、merge函数用途pandas中的merge()函数类似于SQL中join的用法,可以将不同数据集依照某些字段(属性)进行合并操作,得到
- 分页应该是在我们开发web应用时经常要做的工作,能够比较简洁的实现数据库和视图层的分页十分重要。在数据库层利用hibernate进行数据库的
- 这篇文章主要介绍了Python字符串格式化输出代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 出自: 编程中国 http://www.bc-cn.net作者: 天涯听雨 &nbs
- 一、Tensorflow安装1、Tensorflow介绍Tensorflow是广泛使用的实现机器学习以及其它涉及大量数学运算的算法库之一。T
- 添加表字段alter table table1 add transactor varchar(10) not Null;alter tabl
- msxml3.dll 错误 '80004005'未指定的错误/Project/lijiang_071017/include/
- 需求场景,五百个文件里面,选取50个指定文件,放入新的文件夹里。1、准备工作1 安装python环境可能会报错,并且pip install
- 本文实例讲述了Python实现繁體转为简体的方法。分享给大家供大家参考,具体如下:这里需要用到两个文件,可以点击此处本站下载源文件:zh_w
- 废话不多说了,直接给大家贴代码了,具体代码如下所示:<!DOCTYPE html><html><head>
- 前言最近发现一个神器,那就是GitHub和OpenAI联合构建的AI自动编程工具Copilot!Copilot基于自然语言处理模型GPT-3
- 这篇文章主要介绍threading模块中的主类Thread的一些主要方法,实例代码如下:''' Crea