前端笔记(10) Vue3 Router 监听路由参数变化

news2025/1/21 21:59:15

前言

Vue Router是开发Vue项目的必不可少的工具,也是极为重要的学习要点。
本篇介绍下Vue Router的基础使用和如何监听路由参数变化。

Vue Router入门

1 安装Router

安装Vue Router非常方便,只需执行一个命令,如果还不知道怎么搭建Vue项目框架,可以参考我之前的博客:前端笔记(8) Vue3+Vite 搭建项目 配置路径别名@

//npm
npm install vue-router@4
//yarn
yarn add vue-router@4

2 创建测试页面

  • 在src/views目录下,创建几个vue单文件组件,用来后面的测试。

About.vue文件:

<template>
  <p>我是About页面</p>
</template>

<script setup lang="ts">
</script>

Home.vue文件:

<template>
  <p>我是Home页面</p>
</template>

<script setup lang="ts">
</script>

3 添加路由标签

在src目录下面的那个App.vue文件添加2个路由标签
App.vue文件:

<template>
  <p>
    <router-link to="/about" active-class="active"> 【about】 </router-link>
    <router-link to="/home" active-class="active"> 【home】 </router-link>
  </p>
  <!-- 路由出口,路由匹配到的组件将渲染在这里 -->
  <router-view />
</template>

<script setup lang="ts">
</script>

<style scoped>
.active {
  color: red;
}
</style>

页面显示效果如下:
在这里插入图片描述

  • <router-link>通过to来指定链接,将呈现一个带有正确 href 属性的 <a> 标签
  • <router-view />是路由出口,路由匹配到的组件将渲染在这里

4 配置Router文件

  • 在src目录下新建router目录,然后在router目录里创建index.ts文件
  • 这里指定根路径/也跳转到/home
import {createRouter, createWebHistory, RouteRecordRaw} from 'vue-router'

export const routes: Array<RouteRecordRaw> = [
    {
        path: '/',
        redirect: '/home'
    },
    {
        path: '/home',
        component: () => import('@/views/Home.vue')
    },
    {
        path: '/about',
        component: () => import('@/views/About.vue')
    }
]

const router = createRouter({
    history: createWebHistory(),
    routes: routes as RouteRecordRaw[]
})

export default router

5 配置main.ts文件

  • 在main.ts中引入上面创建的路由器配置文件
  • 然后app.use(router)
    在这里插入图片描述

6 验证页面跳转效果

在这里插入图片描述

获取路由参数

很多时候,我们的页面是需要接收参数的,比如下面创建一个用户页面User.vue,它接收一个参数id

1 创建用户页面

User.vue文件:

<template>
  <p>
    userId:{{$route.params.id}}
    userId:{{userId}}
  </p>
</template>

<script setup lang="ts">
import {ref} from "vue";
import {useRoute} from 'vue-router'

const route = useRoute()
let userId = ref<string | string[]>();
userId.value = route.params.id
</script>

2 添加2个链接

在App.vue文件里继续添加2个跳转链接

<router-link to="/user/1" active-class="active"> 【user/1】 </router-link>
<router-link to="/user/2" active-class="active"> 【user/2】 </router-link>

3 路由器配置文件添加路由配置

import {createRouter, createWebHistory, RouteRecordRaw} from 'vue-router'

export const routes: Array<RouteRecordRaw> = [
    {
        path: '/',
        redirect: '/home'
    },
    {
        path: '/home',
        component: () => import('@/views/Home.vue')
    },
    {
        path: '/about',
        component: () => import('@/views/About.vue')
    }
    ,
    {
        path: '/user/:id',
        component: () => import('@/views/User.vue')
    }
]

const router = createRouter({
    history: createWebHistory(),
    routes: routes as RouteRecordRaw[]
})

export default router

4 查看页面演示效果

在这里插入图片描述
如上图显示,第二个userId并没有跟着变化,因为用户从 /user/1 导航到 /user/2 时,相同的组件实例将被重复使用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会被调用。

解决上面的问题主要有2种方法:

  • 用watch()监听路由route的变化
  • 用beforeRouteUpdate导航守卫

方法1:用watch()监听

<template>
  <p>
    userId:{{$route.params.id}}
    userId:{{userId}}
  </p>
</template>

<script setup lang="ts">
import {ref, watch} from "vue";
import {useRoute, onBeforeRouteUpdate} from 'vue-router'

const route = useRoute()
let userId = ref<string | string[]>();
userId.value = route.params.id

watch(
    () => route.params,
    (newValue, oldValue) => {
      console.log(newValue)
      console.log(oldValue)
      userId.value = newValue.id
    },
    { immediate: true }
)
</script>

方法2:用beforeRouteUpdate导航守卫

<template>
  <p>
    userId:{{$route.params.id}}
    userId:{{userId}}
  </p>
</template>

<script setup lang="ts">
import {ref, watch} from "vue";
import {useRoute, onBeforeRouteUpdate} from 'vue-router'

const route = useRoute()
let userId = ref<string | string[]>();
userId.value = route.params.id

onBeforeRouteUpdate((to: any) => {
  console.log(to.params.id);
  userId.value = to.params.id
})
</script>

在这里插入图片描述

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

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

相关文章

详解 HttpServletResponse

详解 HttpServletResponse 核心方法代码示例1.设置响应状态码2.设置响应头3.设置响应内容&#xff08;1&#xff09;响应一个网页&#xff08;简单HTML&#xff09;&#xff08;2&#xff09;响应一个网页&#xff08;复杂HTML&#xff09;返回已有的一个网页1.重定向2.转发返回…

uniapp - 编译微信小程序项目的微信授权登录、获取微信手机号登录、最新版微信直接登录、手机与验证码登录的示例源码(适用于 uniapp 微信小程序项目,源代码直接开箱即用)超级详细的代码及注释

效果图 uniapp 项目编译微信小程序,一些常见的登录方式及源代码,示例代码干净整洁无BUG拿来即用。 本文示例实现了 uniapp 微信小程序项目的登录功能,包含微信授权登录、获取微信手机号登录、最新直接登录等, 你可以选择一个,直接复制源代码,稍微改改就能应用到你的项目…

后台管理系统

后台管理系统主要是我们内部人员使用的一款用来管理我们产品的一个系统&#xff0c;然后呢&#xff0c;我们今天写的呢是一个电商的后台管理系统。主要是可以用来管理我们的用户还有我们是商品的。 我们这个系统呢采用的是一个前后端分离的模式&#xff0c;主要是使用后端给我…

Vue 当页面进入全屏状态时element-ui的el-select下拉菜单不显示问题

在前两天进行页面全屏时&#xff0c;一切都还好好的&#xff0c;可当使用element-ui中的el-select时&#xff0c;下拉菜单却怎么也显示不出来&#xff0c;但只要退出全屏状态&#xff0c;立马就好。 非全屏时&#xff1a; 全屏时&#xff1a; 开始我以为是层级问题&#xff0…

前端加载高德离线地图的解决方案

核心是需要下载地图瓦片放在本地&#xff0c;脱离在线地图服务&#xff0c;实现离线加载地图。使用BIGMap工具下载地图离线瓦片到本地 下载地址&#xff1a;http://www.bigemap.com/reader/download/detail201802015.html BIGEMAP GIS Office-全能版需要注册试用版&#xff08;…

web前端面试宝典——带你直击面试重难点(40个经典题目,涵盖近90%的考点,码字2w,干货满满!)

系列文章目录 JavaScript 知识梳理&#xff0c;收录了web前端面试 95%以上 的高频考点&#xff0c;满满的干货。给你做一个高效的知识梳理&#xff0c;为你的面试保驾护航&#xff01; 内容参考链接HTML & CSS 篇HTML & CSS 篇JavaScript 篇&#xff08;一&#xff09;…

【微信小程序】条件渲染和列表渲染

&#x1f352;&#x1f352; 观众老爷们好啊&#xff0c;牛牛又更新了&#xff0c;上文我们详细了解了微信小程序中的事件绑定&#xff0c;那么今天我们就来讲讲WXML语法中的列表渲染和条件渲染&#xff0c;它俩也是非常重要的知识点&#xff0c;赶紧学起来吧。 &#x1f352;&…

如何更改ElementUI组件的图标大小以及标签属性

话不多说&#xff0c;直接上菜。 ElementUI提供的Rate评分组件的默认大小是这样的 图标太小了&#xff0c;想设置宽高、行高、尺寸&#xff0c;但代码不起作用。 打开浏览器调试&#xff0c;发现是用font-size设置才有用。 由此代码存在优先级问题&#xff0c;要提高优先级。…

vscode里面使用vue的一些插件,方便开发

1、vue 2 Snippets &#xff08;vue语法提示&#xff09; vue提示这个也可以 1.1 Vue VSCode Snippets 2、vetur Vetur支持.vue文件的语法高亮显示&#xff0c;除了支持template模板以外 3、Element UI Snippets(饿了么的提示) 4、indent-rainbow&#xff08;缩进高亮提示) 5…

Vue Element table表格实现表头自定义多类型动态筛选 , 目前10种筛选类型,复制即用

一、效果图 目前10种筛选类型 看看是否是你需要的&#xff0c;本文可能有点长 &#xff0c;我尽可能的给讲清楚&#xff0c;包括源码附上 二、无聊发言 点击当前行跳转部分数据后缀追加图标某列数据根据状态增加颜色标识 三、前言 实现图中的表格&#xff0c;特定的两个要求&…

css-两种画弧线方法

第一种&#xff1a;::after <template><view><view class"bg"></view></view> </template> <style> .bg{background-color: pink; } .bg::after{content: ;position: absolute;width: 160%;height: 100px;background: sk…

多项目版本管理:monorepo 策略

monorepo 是什么 一个产品会有多个项目&#xff0c;每个项目之间会存在版本同步的问题&#xff0c;如何在其中一个项目发布上线后&#xff0c;保证每个项目版本升级后的版本同步问题&#xff0c;提出的解决方案就是 monorepo 策略。 monorepo 是一种将多个项目代码存储在一个…

【小程序项目开发-- 京东商城】uni-app之商品列表页面 (上)

&#x1f935;‍♂️ 个人主页: 计算机魔术师 &#x1f468;‍&#x1f4bb; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 该文章收录专栏 ✨ 2022微信小程序京东商城实战 ✨ 文章目录一、前言介绍二、创建goodlist 分支&#xff08;选读*)三、商品列…

H5页面跳转小程序的三种方式

文章目录前言一、web-view标签返回小程序1.小程序启动页面只写web-view标签跳转到授权页面。2.编写auth.html3、把auth.html放到服务器就可以测试访问&#xff0c;打开小程序默认进入启动页面中的webview跳转到H5&#xff0c;授权成功后&#xff0c;通过wx.miniProgram.reLaunc…

Vue自定义网页顶部导航栏

Vue自定义web网页顶部导航栏 说明&#xff1a;此组件是为论坛类项目定制的一个实用的顶部导航栏&#xff0c;当然也可以用于其他的Web项目&#xff0c;只需要稍作修改便可以达到想要的效果。其中导航栏包含了搜索栏&#xff0c;用户头像&#xff0c;以及基本的导航标题。导航栏…

uniapp小程序自定义顶部导航栏,输入框软键盘把顶部顶上去的解决方法

首先在小程序input标签增加:adjust-position"false"的属性&#xff0c;然后已经可以把软键盘不使上方顶出&#xff0c;但是输入框也会因此被遮挡 解决方法&#xff1a;在input输入框聚焦的方法中增加操作 focus"inputBindFocus" 定义方法 inputBindFoc…

【vue3】基础概念的介绍

⭐【前言】 首先&#xff0c;恭喜你打开了一个系统化的学习专栏&#xff0c;在这个vue专栏中&#xff0c;大家可以根据博主发布文章的时间顺序进行一个学习。博主vue专栏指南在这&#xff1a;vue专栏的学习指南 &#x1f973;博主&#xff1a;初映CY的前说(前端领域) &#x1f…

Vue提升:理解vue中的 slot-scope=“scope“

slot是插槽&#xff0c;slot-scope“scope“语义更加明确&#xff0c;相当于一行的数据&#xff0c;在实际开发中会碰到如下的场景 这个工作状态是变化的&#xff0c;而我们就可以通过后端返回的具体值来判断这里应该显示什么样的内容&#xff0c;具体代码如下 <el-table-co…

利用vue实现登陆界面及其跳转

1.做登录框 步骤&#xff1a; &#xff08;1&#xff09; 创建vue项目&#xff0c;使用vite方式创建&#xff1b;npm init vuelatest &#xff08;2&#xff09;项目结构&#xff1a; src&#xff1a;代码书写位置&#xff1b; app.vue&#xff1a;根组件&#xff1b; main…

vue配置开发环境和生产环境

介绍 本文主要介绍开发、测试以及生产环境的配置。&#xff08;以下内容可根据需求进行配置&#xff09; 步骤 1、在src同级目录也就是根目录下新建文件&#xff1a;.env.development&#xff08;开发环境&#xff09;、.env.test&#xff08;测试环境&#xff09;、.env.pr…