Vue3-路由跳转专题详细总结

news2025/7/5 8:06:18
一、基本路由

点击事件似乎可以使用模板更改视图中的内容,个人认为与路由的区别是路由能使网页中的地址栏发生变化
请先阅读基础第二篇


1.创建一个组件,并引入

在这里插入图片描述

2.js文件中配置路径

//name相当于别名
     {
        path:'/tabView',
        component:TabView
      },
     {
        name:'myComPany',
        path:'company',
        component:Company,
      }

3.使用方式

   <router-link to="/tabView">首页</router-link>
  1. 携带参数

query

   <router-link :to="{
                path: '/tabView',
                query: {
                  title: 'query路由传值tabView',
                },
              }"
   >首页</router-link>

query传参可以用name,也可以用path

  <router-link
              :to="{
                name: 'myComPany',
                params: {
                  title: '使用params进行company路由传参必须要用name命名',
                },
              }"
              >首页</router-link
            >

只能用name

   <router-link :to="`/home/comPus/666/使用params传值`" class="botTabFather"
              >校园招聘<span class="hotTab"
                ><p class="txt">hot</p></span
              ></router-link
            >

直接在路径中传递,前提要保证路由文件中已经声明传递的变量值,否则会当作路径处理

     {
        path:'comPus/:id/:title',
        component:ComPus
      },
  1. 路由文件中携带参数
    {
        name:'myComPany',
        path:'company',
        component:Company,
        // props: {
        //   id:1,
        //   title: '路由中带参数'
        // },
        props: true
      }

props为true时,从当前组件中引入传参变量就可以使用路由中携带的参数,使用方式如下
在这里插入图片描述

二、嵌套路由

嵌套路由,顾名思义就是套娃,因而有着严格的父子关系,实际开发中三四层比较常见,至多就是七层。下面以home页面为例子,进行说明路由嵌套的实质关系。
1.确定父亲是home,其它几个页面都是home的孩子,写法如下

在这里插入图片描述

在孩子中不需要去写/,默认系统在你引入父级路径下自动给你添加过了,孩子的默认展示页面是不需要写路径名的,子页面的使用方式:

    path: '/home/JobView',

在这里插入图片描述
github完整代码

三、编程式路由导航

在这里插入图片描述

<template>
    <div>
        <button @click="toindexpage">跳转到首页</button>
    </div>
</template>
<script>
export default {
    methods:{
        toindexpage(){
            console.log("跳转到about页面")
            this.$router.push({path:'/about'})
//this.$router.push({path:'/mypage/123'})
//携带参数
//this.$router.push({name:"mypage",params:{id:132}})
        }
    }
}
</script>
<template>
  <div class="bar">
    <div class="barCom w">
      <div class="leftNav">
        <ul>
          <li><a href="https://www.lagou.com/" class="logo"></a></li>
          <li>
            <a href="" class="cIcon green">全国站<em></em></a>
          </li>
          <li class="defaultNav">
            <router-link to="/home">首页</router-link>
          </li>
          <li>
            <router-link
              :to="{
                path: '/home/JobView',
                query: {
                  title: 'query路由传值JobView',
                },
              }"
            >
              职位</router-link
            >
          </li>
          <li>
            <router-link
              :to="{
                name: 'myComPany',
                params: {
                  title: '使用params进行company路由传参必须要用name命名',
                },
              }"
              >公司</router-link
            >
          </li>
          <li>
            <router-link :to="`/home/comPus/666/使用params传值`" class="botTabFather"
              >校园招聘<span class="hotTab"
                ><p class="txt">hot</p></span
              ></router-link
            >
          </li>
          <li>
            <a href="" class="botTabFather"
              >课程<span class="hotTab"><p class="txt">hot</p></span></a
            >
          </li>
          <li><a href="" class="green">拉勾App</a></li>
        </ul>
      </div>
      <div class="rightNav">
        <ul>
          <li><a href="" @click.prevent="pushLoginPage">登录</a></li>
          <li><span class="grey">|</span></li>
          <li><a href="" @click.prevent="pushRegisterPage">注册</a></li>
          <li><a href="">进入企业版</a></li>
        </ul>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  methods:{
    pushLoginPage(){
      this.$router.push({
        path:"/loginPage"
      });
    },
  },
};
</script>
<style scoped>
.barCom {
  line-height: 40px;
  color: white;
  font-size: 13px;
}
.leftNav {
  float: left;
}
.leftNav ul li {
  float: left;
}
a,
router-link {
  display: block;
  padding: 0 21px;
  color: #afb5c0;
  transition: color 0.3s;
}
a:hover,
router-link {
  color: #ffffff;
}
.logo {
  width: 66px;
  height: 40px;
  background-repeat: no-repeat;
  background-size: 66px auto;
  background-position: center center;
  background-image: url(https://lagou-zhaopin-fe.lagou.com/fed/lg-www-fed/image/20210624/1624523613071.png);
}
.cIcon {
  height: 40px;
  position: relative;
  margin-right: 20px;
}
em {
  position: absolute;
  height: 0;
  width: 0;
  border-width: 5px;
  border-style: solid;
  border-color: #5f646d transparent transparent;
  right: 3px;
  top: 18px;
}
.green {
  color: #00b188;
}
.defaultNav {
  background-color: #24282c;
}
.defaultNav a {
  color: #fff;
}
.grey {
  color: #afb5c0;
}
.leftNav ul li:nth-child(2) a:hover,
.leftNav ul li:nth-child(8) a:hover {
  color: #00b188;
}

.leftNav ul li:nth-child(8) a:before {
  content: "";
  display: inline-block;
  margin: 0 2px 0 13px;
  width: 13px;
  height: 16px;
  vertical-align: text-bottom;
  background-repeat: no-repeat;
  background-size: 13px auto;
  background-position: center center;
  background-image: url("https://www.lgstatic.com/lg-www-fed/common/widgets/header_c/modules/topbar/img/icon_phone_a4c2aad.png");
}
.botTabFather {
  position: relative;
}

.hotTab {
  position: absolute;
  top: 3px;
  right: -3px;
  width: 27px;
  height: 16px;
  line-height: 14px;
  font-size: 12px;
  color: #fff;
  text-align: center;
  background: #ff7452;
  border-radius: 9px;
  z-index: 1;
}
.txt {
  -webkit-transform: scale(0.9);
}

.rightNav {
  float: right;
  margin-right: 20px;
}
.rightNav ul li {
  float: left;
}
.rightNav ul li:nth-child(1) a,
.rightNav ul li:nth-child(3) a {
  padding: 0;
}
.rightNav ul li:nth-child(3) a {
  padding-right: 21px;
}
.rightNav ul li:nth-child(2) span {
  padding: 0 7px;
}
.rightNav ul li:nth-child(1) a {
  position: relative;
}
.rightNav ul li:nth-child(1) a:before {
  position: absolute;
  top: 11px;
  left: -26px;
  width: 18px;
  height: 18px;
  content: "";
  vertical-align: text-bottom;
  background-repeat: no-repeat;
  background-size: 18px auto;
  background-position: center center;
  background-image: url("https://www.lgstatic.com/lg-www-fed/common/widgets/header_c/modules/topbar/img/icon_login@2x_a6d7b9d.png");
}
</style>
<template>
  <div class="content">
<a href="" @click.prevent="pushRegisterPage">注册</a>
  </div>
</template>

<script>
export default {
  methods:{
    pushRegisterPage(){
      console.log("此处是替换路由")
      this.$router.replace({
        path:"/loginPage"
      });
    },
  },
};
</script>

在这里插入图片描述

四、Vue3缓存路由组件

目的是将组件在页面的呈现效果保存,可以是整个路由组件分页面全部保存也可以是部分保存。
示例效果

在这里插入图片描述
vue3中引入keep-alive与vue2中效果稍作区别,使用规则可粘贴如下代码

  <router-view v-slot="{ Component }">
        <keep-alive :include="['TabTwo', 'TabPage']">
          <Component :is="Component" />
        </keep-alive>
      </router-view>

include中则是限制保存那些页面,根据每个页面下写的name区分

<template>
  <div>
    此处是tabTwo
    <br />
    <input type="text" />
  </div>
</template>
<script>
export default {
  name: "TabTwo",
};
</script>

在对应页面路由中粘贴以下配置

   meta: {
          keepAlive: true, //此页面需要缓存
        },

在这里插入图片描述

五、Vue3路由守卫

全局路由守卫

import {
  createRouter,
  createWebHashHistory
} from 'vue-router'
import HomeView from '../views/HomeView.vue'
import Company from '../views/homes/companyView.vue'
import ComPus from '../views/homes/campusView.vue'
import JobView from '../views/homes/JobView.vue'
import TabView from '../views/homes/TabView.vue'
import LoginPage from '../views/LoginPage.vue'
import RegisterPage from '../views/RegisterPage.vue'
const routes = [{
    path: '/',
    component: HomeView,
    children: [{
        // 新增
        meta: {
          keepAlive: true, //此页面需要缓存
        },
        path: 'comPus/:id/:title',
        component: ComPus
      },
      {
        name: 'myComPany',
        path: 'company',
        component: Company,
        // props: {
        //   id:1,
        //   title: '路由中带参数'
        // },
        props: true
      },
      {
        path: 'jobView',
        component: JobView
      },
      {
        path: '',
        component: TabView
      }
    ]
  },
  {
    meta: {
      keepAlive: true, //此页面需要缓存
    },
    path: '/loginPage',
    component: LoginPage
  },
  {
    path: '/registerPage',
    component: RegisterPage,
    meta: {
      isAuth: true,
      title: "注册"
    }
  }

]

const router = createRouter({
  history: createWebHashHistory(),
  routes
})
router.beforeEach((to, from, next) => {
  if (to.meta.isAuth) {
    console.log("注册页面路由守卫");
    next();
  }
  console.log("前置路由守卫,跳转之前触发");
  next(); //如果想要继续访问使用next()调用起来
})
router.beforeResolve((to, from, next) => {
  console.log("全局解析守卫 在所有组件内守卫和异步路由组件被解析之后触发");
  next();
})
router.afterEach((to, from) => {
  console.log("后置路由守卫,完成跳转触发");
  document.title = to.meta.title || "拉勾招聘"; //更改文件标题名称,放在放行之前
})

export default router

独享路由守卫

{
        // 新增
        meta: {
          keepAlive: true, //此页面需要缓存
        },
        path: 'comPus/:id/:title',
        component: ComPus,
        beforeEnter: (to, from, next) => {
          console.log("独享只有前置路由守卫");
        }
      },

组件路由守卫

//通过组件进入路由时进行调用
  beforeRouteEnter(){
        console.log("通过路由规则路由进入")
    },
    beforeRouteUpdate(){
        console.log("路由更新组件")
    },
    beforeRouteLeave(){
        console.log("通过路由规则路由离开组件")
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/406098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3项目搭建全过程

目录 一、前言 二、搭建准备 三、搭建项目 四、启动项目 一、前言 在2020年的9月19日&#xff0c;万众期待的Vue3终于发布了正式版&#xff0c;命名为“One Piece”。 它也带来了很多新的特性&#xff1a;更好的性能、更小的包体积、更好的TypeScript集成、更优秀的API设…

前端面试真题宝典(一)

面试题真题 闭包和柯里化 闭包是什么&#xff1f;闭包是能够读取其他函数内部变量的函数 柯里化是什么&#xff1f;柯里化是把一个多个参数的函数转化为单参数函数的方法 闭包的用途&#xff1a;闭包的主要用途是为了不污染全局变量&#xff0c;用闭包的局部变量来做一些库…

30个题型+代码(冲刺2023蓝桥杯)(中)

2023.3.13~4.13持续更新 目录 &#x1f34e;注意 &#x1f33c;前言 &#x1f33c;十&#xff0c;KMP&#xff08;留坑&#xff09; &#x1f33c;十一&#xff0c;Trie&#xff08;留坑&#xff09; &#x1f33c;十二&#xff0c;BFS &#x1f44a;(一)1562. 微博转发…

获取街道、镇级的地图geoJson数据方法,使用echarts绘制出街道、镇级的地图区域画面(中山市为例)

一、需求 1、在echarts上绘制市级以下的区、县的区域地图。 2、在市级下很多都是有区、县的区域&#xff0c;而少部分是不存在区、县的&#xff0c;是直接市下面一级就是街道、镇级别的区域。 3、统一管理区域数据&#xff0c;有区县的市直接拿区县的geoJson数据&#xff0c;没…

炸弹人小游戏代码开源(python)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

Ajax--》请求操作以及跨域相关讲解

目录 jQuery中的Ajax 请求超时与网络异常处理 取消请求 Ajax请求—fetch() 跨域 jQuery中的Ajax 在jQuery中应该如何发送Ajax请求呢&#xff1f;看到这篇文章你就能大概了解到如何在jQuery中发送Ajax。 要想使用jQuery框架&#xff0c;肯定是需要引进jQuery资源的&#…

CSS实现单行、多行文本溢出显示省略号(…)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、单行超出显示省略号二、多行超出显示省略号一、单行超出显示省略号 描述&#xff1a;如果文字超出父元素指定宽度&#xff0c;文字会自动换行&#xff0c;而连续…

Node.js——文件模块和路径模块(读写文件,处理路径)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿 offer&#xff08;秋招&#xff09; &#x1f947;推荐学习&…

MySQL - 死锁的产生及解决方案

MySQL - 死锁的产生及解决方案1. 死锁与产生死锁的四个必要条件1.1 什么是死锁1.2 死锁产生的4个必要条件2. 死锁案例2.1 表锁死锁2.2 行锁死锁2.3 共享锁转换为排他锁3. 死锁排查4. 实例分析4.1 案例描述4.2 案例死锁问题复现4.3 死锁排查4.4 解决死锁5. 如何避免死锁1. 死锁与…

【保姆级】JMeter Mqtt 压测配置

忽然有个紧急任务要对某个服务做MQTT做压测&#xff0c;紧急实操下JMeter&#xff0c;这里记录下非专业测试员的测试过程、(▽&#xff40;)&#xff0c;欢迎&#x1f44f;大家检查指点(&#xffe3;∇&#xffe3;)/下载⏬工具JMeter官方下载地址https://jmeter.apache.org/do…

【前端】1.学习了一段时间的vue,总结一下Vue书写规范

学习了一段时间的vue&#xff0c;总结一下Vue书写规范命名规范普通变量命名规范常量命名规范组件命名规范method 方法命名命名规范views 下的文件命名props 命名规范结构化规范命名规范 在团体开发项目中&#xff0c;为了团队所有成员书写可维护的代码&#xff0c;而不是一次性…

JS入门到精通完整版

前言 JavaScript&#xff08;简称“JS”&#xff09; 是一种具有函数优先的轻量级&#xff0c;解释型或即时编译型的编程语言。它是作为开发Web页面的脚本语言而出名&#xff0c;JavaScript 基于原型编程、多范式的动态脚本语言&#xff0c;并且支持面向对象、命令式、声明式、…

【前端灵魂脚本语言JavaScript①】——JS引入方式

&#x1f41a; 作者: 阿伟 &#x1f482; 个人主页: Flyme awei &#x1f40b; 希望大家多多支持&#x1f618;一起进步呀&#xff01; &#x1f4ac; 文章对你有帮助&#x1f449;关注✨点赞&#x1f44d;收藏&#x1f4c2; JavaScript引入 文章目录JavaScript引入一、JS介绍二…

PTA第六章作业详解

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;夏目的作业 &#x1f4ac;总结&#xff1a;希望你看完之后&am…

vue+uniapp瀑布流布局多种实现方式

文章目录前言一、实现原理二、代码实现1.方式1&#xff08;图片高度累加比较法&#xff09;2.方式2&#xff08;父元素高度比较法&#xff09;三.uniapp实现代码实现四、多列实现代码实现前言 瀑布流布局是网页设计常见的一种布局&#xff0c;一般用于图片多列展示。列宽固定&…

Vue3:状态管理-Store(Vuex,Pinia)

什么是状态管理 理论上来说&#xff0c;每一个 Vue 组件实例都已经在“管理”它自己的响应式状态了 它是一个独立的单元&#xff0c;由以下几个部分组成 状态&#xff1a;驱动整个应用的数据源&#xff1b;视图&#xff1a;对状态的一种声明式映射&#xff1b;交互&#xff1a…

写给20、21级学生的话

写给20、21级学生的话前言一、关于招聘变招生&#xff0c;你怎么看&#xff1f;二、对于即将实习/已经实习的学生&#xff0c;你有什么建议&#xff1f;1.学习方面2.提升方面三、思想成年真的很重要前言 最近&#xff0c;有一些同学遇到的实习问题&#xff0c;我统一回复下&…

Vue2通知提醒框(Notification)

项目相关依赖版本信息 可自定义设置以下属性&#xff1a; 自动关闭的延时时长&#xff08;duration&#xff09;&#xff0c;单位ms&#xff0c;默认4500ms消息从顶部弹出时&#xff0c;距离顶部的位置&#xff08;top&#xff09;&#xff0c;单位像素px&#xff0c;默认24p…

HTML常用快捷键都在这了 看完之后效率暴涨

是这么回事; 我今天上网页课的时候&#xff0c;发现好多同学在敲标签的时候敲得很慢&#xff0c;我再仔细一看&#xff0c;好家伙&#xff0c;他们的标签竟然都是一个一个的敲出来的&#xff01; 那效率能高吗&#xff1f; 这是当时让敲的代码&#xff0c;很简单&#xff0c;对…

css实现元素居中的5种方法

目录 1.最简单的方法 2.利用定位 3.定位配合css3位移 4.弹性盒模型 5.网格布局Grid 相信大家在面试的时候也会经常碰到css实现元素居中的方法&#xff0c;下面我介绍5中方法给大家&#xff0c;欢迎大家评论区交流 需求&#xff1a; 给定两个元素&#xff0c;这两个元素是…