Henry Henry
  • JavaScript
  • TypeScript
  • Vue
  • ElementUI
  • React
  • HTML
  • CSS
  • 技术文档
  • GitHub 技巧
  • Nodejs
  • Chrome
  • VSCode
  • Other
  • Mac
  • Windows
  • Linux
  • Vim
  • VSCode
  • Chrome
  • iTerm
  • Mac
  • Obsidian
  • lazygit
  • Vim 技巧
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue 资源
GitHub (opens new window)

Henry

小学生中的前端大佬
  • JavaScript
  • TypeScript
  • Vue
  • ElementUI
  • React
  • HTML
  • CSS
  • 技术文档
  • GitHub 技巧
  • Nodejs
  • Chrome
  • VSCode
  • Other
  • Mac
  • Windows
  • Linux
  • Vim
  • VSCode
  • Chrome
  • iTerm
  • Mac
  • Obsidian
  • lazygit
  • Vim 技巧
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue 资源
GitHub (opens new window)
  • JavaScript

  • TypeScript

  • Vue

    • Vue 编码指南
    • vue-cli 启动本地服务局域网不能访问的原因分析
    • 解决 Vue 相同路由参数不同不会刷新的问题
    • 解决 vuex requires a Promise polyfill in this browser 问题
    • 关于父组件通过 v-on 接收子组件多个参数的一点研究
    • Vue $attrs 和 $listeners
    • Vue axios 发送 Form Data 数据格式请求
    • Vue 开发技巧
    • Vue 动态路由
    • Vue 集成 UEditor 富文本编辑器
    • Vue 修饰符
    • Vue 问题集合
    • Vue props 传多值的问题
    • vue-router 在 IE11 下手动更改 URL 的 hash 不会触发路由
    • vue-router 路由参数刷新消失的问题
    • 那些年被我们忽略的 vue 语法
    • vue 生命周期深入
    • vue 组件通信深入
    • vue 组件通信深入 Vuex
    • vue项目移动端、pc端适配方案
    • vuepress 如何引入 vuex
  • ElementUI

  • React

  • AntD

  • 前端
  • Vue
Henry
2020-02-08

Vue 动态路由

现在很多人还是在默默的一个个功能页去配置管理路由, 目录管理 -> 导入.vue 文件 -> 路由配置 -> 页面上应用. 当应用越来越大, 这一套流程的管理会变得越来越繁杂和臃肿. 修改起来也特别麻烦.

假如某文件夹下的目录能自动生成对应路由那就方便多了. 即假如我在 page 文件下添加 a.vue 文件, 那么我就可以从 http://localhost:8080/#/page/a 中访问到该组件. 我不用再去 router.js 那里 import 组件并配置路由路径.

想要实现这个功能主要有两个知识点, 一个是动态路由 (opens new window), 一个是动态组件 (opens new window).

动态路由:

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

1
2
3
4
5
6
7

this.$route.params.path 可以获取到 path 参数

动态组件:

<component v-bind:is="name"></component>
1

:is 是动态组件的用法, 当 name 变化, 组件就会发生变化.

所以我们可以在动态组件中实时计算路由变化.

// 需要使用 vue-async-computed 插件
asyncComputed: {
  name() {
    // 获取 this.$route.params 中的参数
    const path = this.$route.params.path
    if (path) {
      // 根据 path 导入组件并 return
      // webpackChunkName 的作用是定义打包后的文件名称
      // [webpack中动态import()打包后的文件名称定义_逝水流光的博客-CSDN博客](https://blog.csdn.net/javao_0/article/details/85162458)
      return import(/* webpackChunkName: "[request]" */ `@page/${path}`)
        .then(res => {
          return res.default
        })
        .catch(err => {
          console.log('TCL: name -> err', err)
          this.$router.push('/404')
        })
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

组件就会根据 path 改变自动改变

简化的主要流程:

  1. 动态路由监听路由变化

  2. 浏览器输入 http://localhost:8080/#/page/a, 路由发生变化

  3. this.$route.params 中获取动态路由的参数, 发现动态路由的参数为 a

  4. 动态组件中导入 page 文件下的 a.vue 文件

  5. 动态组件更新, 渲染到页面

附上源码: main.js (opens new window), Home.vue (opens new window), router.js (opens new window)

编辑 (opens new window)
#Vue
上次更新: 5/27/2023, 1:02:05 PM
Vue 开发技巧
Vue 集成 UEditor 富文本编辑器

← Vue 开发技巧 Vue 集成 UEditor 富文本编辑器→

最近更新
01
version 1.15
07-01
02
version 1.14
06-27
03
version 1.13
06-27
更多文章>
Theme by Vdoing | Copyright © 2017-2023 HenryTSZ | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式