您现在的位置是:首页 >技术杂谈 >vue-5:router网站首页技术杂谈

vue-5:router

憨憨404 2024-06-17 10:15:03
简介vue-5:router

router路由配置,使用

在vue-cli构建的vue单页面应用中,需要借助vue-router库实现路由功能

配置路由 (构建项目时要下载)

router文件夹下创建:index.js,routerConfig.js配置路由

路由懒加载:

按需加载:当你实际访问哪个路由,路由对应的组件文件才会加载,提升了应用访问速度,提升用户体验

为什么用路由懒加载 ? npm run build 不用路由懒加载,会打包成一个js,一个css文件,不易加载 ;路由懒加载后,每个组件都会生成一个js文件

views中写路由组件:main.js下导入路由管理对象,应用路由,配置路由表

 index.js

// index.js
import { createRouter, createWebHistory,createWebHashHistory } from 'vue-router'

// 导入路由配置表
import routes from './routerConfig'

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),//路由模式
  routes, //应用路由配置表
})

export default router

 routerConfig.js

单条路由配置 嵌套路由配置 重定向:path: '/home', redirect: 'homepage' 404页面

// import Index from '../views/Index.vue'
// import Login from '../views/Login.vue'
// import NotFound from '../views/NotFound.vue'
// import Detail from '../views/Detail.vue'

// import Home from '../views/Index/Home.vue'
// import GWC from '../views/Index/GWC.vue'
// import Mine from '../views/Index/Mine.vue'

// 路由懒加载/延迟加载

// 用懒加载导入的方式处理每个组件, 每个组件都会单独生成一个js文件, 当你实际访问哪个路由, 对应的组件文件才会加载, 否则不加载
var Index = ()=> import( "../views/Index.vue" )
var Login = ()=> import( "../views/Login.vue" )
var NotFound = ()=> import( "../views/NotFound.vue" )
var Detail = ()=> import( "../views/Detail.vue" )

var Home = ()=> import( "../views/Index/Home.vue" )
var GWC = ()=> import( "../views/Index/GWC.vue" )
var Mine = ()=> import( "../views/Index/Mine.vue" )

//路由配置表
export default [
    {
        path:'/index',
        component: Index,
        children:[ //嵌套路由
            {
                path:'/index/home',
                component: Home,
            },
            {
                path:'/index/gwc',
                component: GWC,
            },
            {
                path:'/index/mine',
                component: Mine,
            },
            {
                path:'/index',
                redirect:'/index/home' //重定向
            },
            {
                // path:'*', //VueRouter3中的写法
                path:'/index/:error(.*)',
                component: NotFound, //404
            },
        ]
    },
    {
        path:'/login',
        component: Login
    },
    {
        // path:'/detail/:id',
        path:'/detail',
        component: Detail
    },
    {
        path:'/',
        redirect:'/index' //重定向
    },
    {
        path:'/:error(.*)',
        component: NotFound, //404
    },
    
]

路由组件:

<router-view /> :充当 路由渲染出口

<router-link /> :用来跳转:最终渲染 成 a 标签

路由实例

$router 路由管理对象,负责跳路由

$route 路由对象,负责存储路由信息(地址,参数)

  • 跳路由两种方式

    • 标签式导航: 借助router-link 渲染的a标签来跳路由:<router-link to="/index/home">首页</router-link>

    • 编程式导航: <div @click="toGWC">购物车</div> 点击后动态路由传参

跳路由传参:建议动态路由传参

this.$router.go() 跳转一个路由 this.$router.replace() 跳转一个路由,不会向history中添加新的记录

一:动态路由传参

接参 this.$route.params.id

二:固定路由传参query

传参        this.$router.push( { path:"/detail",query:{参数id:id } } )

接参 this.$route.query.id  

// 跳转路由传参
methods: {
        toDetail(id) {
            console.log(id);
            //方式一:动态路由,路由地址需要接收 添加/:id
            // 跳转的地址需要route 接收: this.$route.params.id
            this.$router.push('/detail/'+id)

            //方式二:固定路由,query
            // this.$router.push({ path:'/detail',query: {id} })
        }
    }

接收

<template>
    <div class="detail">
        <!-- 动态路由接收参数 -->
        详情页面-{{ this.$route.params.id }}
        <!-- 固定路由接收参数 -->
        <!-- 详情页面-{{ this.$route.query.id }} -->
    </div>
</template>

<script>
export default {
    // 查看挂载没
    mounted() {
        console.log(this.$route.params.id)
    },

    methods: {
        
    },
};
</script>

页面顶部加载进度条:

nprogress:插件实现,页面顶部进度条

npm中搜索安装使用:

npm install nprogress --save

在俩守卫函数配置插件使用
NProgress.start();
NProgress.done(); 

路由守卫/导航守卫/路由钩子/路由卫士

他是一组钩子函数 就是再路由跳转的特定阶段自动执行的函数

主要对页面的跳转功能进行限制(没有登录就不能进入制定页面)

守卫函数:

   全局前置守卫函数 beforeEach

    router.beforeEach((to, from, next) => {

      to -- 去哪里
      from -- 从哪里来
      next()  -- (放不放行)
   })

router.beforeEach((to,from,next)=>{
  console.log(to)
  console.log(from)
  if(to.path=="/denglu"||to.path=="/zhuce"){
    next()
  }else{
      alert("当前未vip页面请您登录后再访问")
      next("/denglu")
  }
  
})

全局后置守卫函数 afterEach

router.afterEach((to, from)=>{

})

 beforeRouteEnter(to,from,next){
        console.log(to);
        console.log(from);
        next()

    },
    beforeRouteLeave(to,from,next){
           console.log(to);
           console.log(from);

           if(confirm("确定离开吗")){
            next()
           }else{
                next(false)
           }
    }

}

路由独享守卫 beforeEnter

{
    path: '/shop',
    name: 'Shop',
    component: Shop,
    beforeEnter(to,from,next){
      console.log(to);
      console.log(from);
      alert("您没有登录请你登录后访问")
      next("/denglu")
    }
  },
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。