详解vue-router 动态路由下子页面多页共活的解决方案

作者:asseek 时间:2024-04-27 16:01:22 

我们都知道 vue-router 的动态路由匹配 对组件是原地复用的策略,需要我们在组件中根据不同的 $route 参数展示不同的数据,这在大部分情景下是很高效的做法,但这无疑增加了组件的复杂度,而且不同参数间切换因为是同组件复用,切换效果不加修饰的话会显得很生硬,这里放一张图片感受一下。

详解vue-router 动态路由下子页面多页共活的解决方案

如果我们希望能够每个动态参数都能渲染出一个组件而不是去复用怎么办呢?

我这里提供一个简便的方案

通常动态路由我们都是用来处理详情页


const router = new VueRouter({
routes: [
 // 动态路径参数 以冒号开头
 { path: '/user/:id', component: User, props: true }
]
})

User.vue


<template>
<div>{{ user.name }}</div>
</template>
<script>
export default {
 name: 'User',
 props: ['id'],
 data() {
  return {data: {}};
 },
 watch: {
  id(id) {
   this.getUser(id);
  },
 },
 computed: {
  user() {
   return this.data[this.id] || {name: ''};
  },
 },
 methods: {
  getUser(id) {
   setTimeout(() => { // 假装异步
    this.data[id] = {id, name: '张' + id};
   }, 1000);
  },
 },
 mounted() {
  this.getUser(this.id);
 },
};
</script>

我们可以发现基本上这样的组件是围绕着 路径参数 即例子中的 id 做处理和渲染,只要我们能提取到这个 路径参数 ,并维护成列表,通过这个列表来渲染实际组件,然后通过 v-show 显示当前 路径参数 下的组件,就可以实现不同参数不同组件的效果了。

简单的来个例子


<template>
<div>
 <user
   v-for="_id in idList"
   v-show="_id === id"
   :id="_id"
   :key="_id"
 />
</div>
</template>
<script>
import User from './User.vue';

export default {
 name: 'UserPage',
 components: {
  User,
 },
 props: ['id'],
 data() {
  return {
   idList: [this.id],
  };
 },
 watch: {
  id(id) {
   if (!this.idList.includes(id)) this.idList.push(id);
  },
 },
};
</script>

然后把这个组件作为 router 组件


{ path: '/user/:id', component: UserPage, props: true }

现在我们完成解耦,同路由组件间参数转变切换的是真实组件了,这里再放一张图片感受一下。

详解vue-router 动态路由下子页面多页共活的解决方案

这个方案说明白了很简单,但还是有一些细节要注意处理,比如记录不同参数页面的滚动条高度,比如怎么处理子页面关闭等等,我的开源项目 e-admin 提供的 ea-view 组件对这个解决方案做了完整的细节处理,有兴趣的话可以参考一下ea-view 。

我正在造一个基于 element-ui 的中后台框架轮子e-admin 欢迎star

来源:https://segmentfault.com/a/1190000021360696

标签:vue-router,子页面,共活
0
投稿

猜你喜欢

  • 跟老齐学Python之赋值,简单也不简单

    2021-03-09 22:44:14
  • Python使用pandas处理CSV文件的实例讲解

    2021-01-31 18:23:37
  • 利用python+request通过接口实现人员通行记录上传功能

    2021-10-15 20:49:20
  • opencv3/C++图像像素操作详解

    2021-04-23 08:29:26
  • python获取文件后缀名及批量更新目录下文件后缀名的方法

    2021-02-19 20:51:14
  • pandas和spark dataframe互相转换实例详解

    2022-12-12 20:26:38
  • ASP+XML制作菜单管理

    2008-05-19 12:38:00
  • Python迭代器iterator生成器generator使用解析

    2023-11-17 18:50:24
  • 蚁群算法js版

    2008-10-08 10:15:00
  • php session 预定义数组

    2023-11-15 01:15:22
  • JS获取当前时间的年月日时分秒及时间的格式化的方法

    2024-04-17 10:23:00
  • flask SQLAlchemy连接数据库及操作的实现

    2024-01-28 09:23:29
  • Python face_recognition实现AI识别图片中的人物

    2023-08-14 21:34:35
  • scrapy-splash简单使用详解

    2023-06-02 15:22:37
  • selenium在scrapy中的使用代码

    2021-11-24 09:34:16
  • Django 实现外键去除自动添加的后缀‘_id’

    2022-11-16 08:06:35
  • 基于Token的身份验证的方法

    2023-09-27 19:05:41
  • Django中外键ForeignKey介绍使用

    2023-05-18 01:26:30
  • Python赋值逻辑的实现

    2023-09-14 21:20:27
  • 使用keras实现孪生网络中的权值共享教程

    2022-10-21 13:52:34
  • asp之家 网络编程 m.aspxhome.com