vue路由详解

vue引入路由

安装路由

npm install vue-router@4 --save

main.js引入路由

import router from './router'

app.use(router)

编写router/index.js

Hash 历史模式(/#/)

Hash 模式直接访问子路径不会报404,因为vue里面有内置配置

 import { createRouter, createWebHashHistory } from 'vue-router'
              const router = createRouter({
                  routes,  
                  history:createWebHashHistory()
              })

HTML5 历史模式(/)

而HTML5 模式直接访问子路径会报404,但是也可以解决:在你的服务器上添加一个简单的回退路由

参考

import { createRouter, createWebHistory } from 'vue-router'
              const router = createRouter({
                  routes,  
               history: createWebHistory(),
              })
                

路由懒加载

当打包构建应用时,JavaScript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就会更加高效


            实现1        
            import LoginView from "../views/LoginView.vue"
            替换成
            const LoginView = () => import("../views/LoginView.vue")
            

            实现2
            {
              path: '/login',
              name: 'login',
              component: () => import("../views/LoginView.vue")
            }

路由名


            命名路由
            {
              name:"About",
              path:"/about",
              component:About
            }
            

            使用命名的路由-导航
            原:this.$router.push("/about")
            使用命名的路由
            this.$router.push({
                name:"About"
            })
            

            使用命名的路由-传参
            原:<RouterLink :to="'/details/'+item">{{ item }}</RouterLink>
            使用命名的路由
            <router-link :to="{ name:'Details',params:{ name:item } }">{{ item }}</router-link>              

别名【alias】

用于访问路径设置多个名字


            {
                alias:"yl",
                path:"yule",
                component:YuleNews
              }               

路由元信息【meta】

有时,你可能希望将任意信息附加到路由上,如过渡名称、谁可以访问路由等

如:利用meta配合导航守卫完成判断用户是否登录在允许打开用户中心页面

  {
                path: "/home/index",
                name: 'index',
                component: () => import("../views/home/Index.vue"),
                meta: {
                    requiresAuth: true,
                    key: "首页"
                }
            },  
        

动态路由

添加路由

router.addRoute({
                path:"/news",
                name:"News",
                component:News
               }) 

添加嵌套路由

要将嵌套路由添加到现有的路由中,可以将路由的 name 作为第一个参数(父级name)、

 router.addRoute("News",{
                path:"yule",
                component:Yule
               }) 

添加多个路由

 const currentRouter = [
            {
            path:"/news",
            name:"News",
            component:News
            },
            {
            path: '/about',
            name: 'about',
            component:About
            }
          ]
          
          
          for(let i = 0;i<currentRouter.length;i++){
           router.addRoute(currentRouter[i])
          }  

删除路由

router.removeRoute("about")  

动态路由实战

 编写dynamicRoute.js
            const mange=
            {
                path: '/work',//工作监督管理
                name: 'work',
                component: () => import("../views/WorkMange/index.vue"),
                meta: {
                  requiresAuth: true,
                  key: "工作监督管理"
                }
            
            }
            export default mange
            

            import mangeRouter from "@/router/dynamicRoute.js"
            onMounted(() => {
                api.getPermissions({
                    username: loginStore.username,
                }).then(res => {
                    console.log(res.data);
                    if (res.data.code == 200) {
                        /*用户权限信息获取 */
                        menuStore.menu = res.data.data
                        /*权控-添加动态路由 */
                        const obj = menuStore.menu
                        for (let i in obj) {
                            if (obj[i].permissionDesc === '/work') {
                                router.addRoute('layout', mangeRouter)//嵌套路由记得写上父级名字'layout'
                            }
                        }
                    }
                }).catch(error => {
                    console.log(error);
                })
            
            })

使用路由

路由导航

RouterLink / RouterView会默认跳转/

 <template>
                  路由对应显示位置
                  <RouterView></RouterView>
                  跳转
                  <RouterLink to="/">首页</RouterLink>
                  <RouterLink to="/about">关于</RouterLink>
            </template>
                <script setup>
                import {RouterLink,RouterView} from "vue-router"
                </script>  
        

编程式导航

选项式API

 <template>
              <h3>Home首页</h3>
              <button @click="clickHandler">跳转到About页面</button>
            </template>
             <script>
            export default {
              methods:{
                clickHandler(){
                  this.$router.push("/about")
                 }
               }
            }
            </script>

组合式API

 <template>
              <h3>About关于页面</h3>
              <button @click="clickHandler">跳转到首页</button>
            </template>
            <script setup>
            import { useRouter } from 'vue-router'
            const router = useRouter()
            function clickHandler(){
              router.push("/")
            }
            </script>

嵌套路由

一些应用程序的 UI 由多层嵌套的组件组成。在这种情况下,URL 的片段通常对应于特定的嵌套组件结构

  SportNews.vue
          <template>
              <h3>体育新闻</h3>
          </template>
          

          YuleNews.vue
          <template>
              <h3>娱乐新闻</h3>
          </template>
          

          News.vue
          <template>
              <h3>新闻</h3>
              <RouterLink to="/news/sport">体育</RouterLink>
              <RouterLink to="/news/yule">娱乐</RouterLink>
              <RouterView></RouterView>
          </template>
          

          index.js
            {
                  path:"/news",
                  component:News,
                  //路由嵌套(注意:path中不再添加/)
                  children:[
                      {
                          path:"sport",
                          component:SportNews
                      },
                      {
                          path:"yule",
                          component:YuleNews
                      }
                  ]
              }

重定向

用于嵌套时默认跳转

 {
            path:"/news",
              component:News,
                redirect:"/news/sport",
                  children:[
                     {
                      path:"sport",
                      component:SportNews
                     },
                     {
                      path:"yule",
                      component:YuleNews
                     }
                   ]
          }
          
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月木@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值