龙空技术网

vue3根据路由动态替换页面中的一部分

RyanLi 85

前言:

目前看官们对“页面置换算法题”大致比较关心,各位老铁们都想要剖析一些“页面置换算法题”的相关文章。那么小编同时在网摘上收集了一些对于“页面置换算法题””的相关文章,希望你们能喜欢,看官们一起来学习一下吧!

最近遇到一种情况,一个页面内的某一部分,需要根据路由来判断应该显示哪一部分,而这一部分动态显示的内容又可能是基于多人开发的情况。

因为不想在一个页面内每次都去添加 if 判断,然后想到了一种实现思路,就是把这部分动态内容作为动态引入的组件,这样应该是可以达到目的的,只需要不同的开发人员按照一定规则去组织各自的文件即可。这样不仅简化了这个页面,而且使得大家互不影响。下面简单贴一下大概的实现思路相关代码(代码写的很潦草,只是一个验证可行性的简单示例,还望不要吐槽我的代码写的烂)。

【】请勿吐槽我的代码写的烂,这只是一个临时的验证方案可行性的简单代码示例,并没有太仔细的归置代码。实际工作中我会尽量规范我的代码的!

增加一个页面的路由,其中子路由是一个动态path。

{  path: '/test',  name: 'test',  meta: { title: 'Test', hideChildrenInMenu: true },  // 此处可以默认重定向到一个已有的默认组件  redirect: '/test/card',  component: RouterView,  children: [    {      path: '/test/:type',      name: 'test.detail',      meta: { title: 'Test_Detail' },      // 此处声明props:true,path的动态参数:type便可以直接在页面中的props中获取到      props: true,      component: () => import('@/views/test/index.vue'),    },  ],},
在 @/views/test 文件加中新增一个 index.vue 文件,内容大概如下。
<template>  <Card :loading="loading">    <h2>下面是测试页面根据路由动态显示的部分</h2>    <Empty v-if="!detail" />    <component v-else :is="detail" />  </Card></template><script>import { Card, Empty } from 'ant-design-vue';import { markRaw } from 'vue';export default {  name: 'TestCustomComponent',  components: { Card, Empty },  props: {    // 此处的type与路由动态path的动态参数名一致,即可接收到其动态参数    type: {      type: String,    },  },  data() {    return {      detail: '',      loading: true,    };  },  mounted() {    this.getDetail();  },  methods: {    getDetail() {      if (!this.type) {        this.loading = false;        this.detail = false;        return false;      }      this.loading = true;      setTimeout(async () => {        try {          // 获取动态组件          const customComponent = await this.getCom();          // 判断如果获取到动态组件,则将其使用markRaw函数包裹后赋值给页面          // 如果不使用markRaw函数包裹获取到的组件,则控制台会有vue警告输出          this.detail = customComponent?.default && markRaw(customComponent?.default);        } finally {          this.loading = false;        }      }, 1000);    },    // 使用 import() 函数动态加载组件    async getCom() {      return await import(`@/views/testComponents/${this.type}/index.vue`);    },  },};</script><style scoped lang="less"></style>
多人分别开发不同的页面内容

基于上面的规则,不同的人员只需要按照规则,在 @/views/testComponents 下创建相应动态路由的type参数名的文件夹,然后创建一个 index.vue 文件即可。

到此基本就可以达到目的了。但比较粗糙,还有很多细节没有处理,比如:如果根据传入的type值找不到相应的文件时应该怎么处理更合适?在上面的例子中仅是简单的使用了antdvue的Empty组件,具体开发过程中可以根据实际需要做出更友好的提示。

标签: #页面置换算法题