Vue3的学习(二)路由

路由

简单路由案例:

在router文件夹下的index.ts文件中:

import {createRouter,createWebHistory} from 'vue-router'
import Car from '@/components/Car.vue'
import Person from '@/components/learning/Person.vue'
import Water from '@/components/learning/Water.vue'const router = createRouter({history:createWebHistory(),//路由器的工作模式routes:[{path:'/home',component:Car},{path:'/news',component:Person},{path:'/about',component:Water}]
})export default router

配置路由规则,createWebHistory是指定路由的工作模式,routes中的每个元素都是一个配置好的路由,其中path是路由的路径,component是该路由对应的组件

main.ts:

import './assets/main.css'import { createApp } from 'vue'
import App from './App.vue'
import router from './router'const app = createApp(App)
app.use(router)
app.mount('#app')

挂载app组件之前,要让其配置上路由,使用.use(router)

app.vue:

其中RouterLink标签是用于定位路由的,to就是指定按下该dom后路径会跳向哪个,active-class是指定当为当前路由时,该dom会应用上该class,可以用于指定路由激活时的样式

RouterView就是路由指定的组件的展示区,展示当前路由对应的那个component组件

<script setup lang="ts">
import router from './router'import { RouterView,RouterLink} from 'vue-router';
</script><template><div class="app"><h2 class="title">vue路由测试</h2><!-- 导航区 --><div class="navigate"><RouterLink to="/home" active-class="active">首页</RouterLink><RouterLink to="/news" active-class="active">新闻</RouterLink><RouterLink to="/about" active-class="active">关于</RouterLink></div><!-- 展示区 --><div class="main-content"><RouterView></RouterView></div></div>
</template><style scoped>
/* App */
.title {text-align: center;word-spacing: 5px;margin: 30px 0;height: 70px;line-height: 70px;background-image: linear-gradient(45deg, gray, white);border-radius: 10px;box-shadow: 0 0 2px;font-size: 30px;}.navigate {display: flex;justify-content: space-around;margin: 0 100px;}.navigate a {display: block;text-align: center;width: 90px;height: 40px;line-height: 40px;border-radius: 10px;background-color: gray;text-decoration: none;color: white;font-size: 18px;letter-spacing: 5px;}.navigate a.active {background-color: #64967E;color: #ffc268;font-weight: 900;text-shadow: 0 0 1px black;font-family: 微软雅黑;}.main-content {margin: 0 auto;margin-top: 30px;border-radius: 10px;width: 90%;height: 400px;border: 1px solid;}
</style>

注意点

  • 路由组件通常存放在pages或views文件夹,一般组件通常存放在components文件夹。
    • 路由组件,靠路由的规则渲染出来的组件,即放在routes的元素的component配置项中的组件
  • 通过点击导航,消失后的组件默认是被卸载掉的,需要的时候再加载

to的第二种写法

to属性里面可以直接写路径,也可以写作一个对象的写法:

<RouterLink :to="{path:'/about'}" active-class="active">关于</RouterLink>

命名路由

给路由命名在routes的路由元素中加一个配置项name,指定名称

const router = createRouter({history:createWebHistory(),//路由器的工作模式routes:[{name:'ergouHome',path:'/home',component:Car}]
})

然后to的第二种写法对象写法中,就可以指定这个name去指定路由

<RouterLink :to="{name:'ergouHome'}" active-class="active">首页</RouterLink>

路由器工作模式

  • history模式:

    • 优点:url更加美观,不带有#,更接近传统的网站url

    • 缺点:后期项目上线,需要服务端配合处理路径问题,否则刷新会有404错误

    • 使用方式,导入createWebHistory,在createRouter中加入:

      const router = createRouter({history:createWebHistory(),//history模式routes:[//……………………]
      })
      
  • hash模式

    • 优点:兼容性好,因为不需要服务器端进行处理路径

    • 缺点:url带有#不美观,且在seo优化方面相对较差

    • 使用:

      const router = createRouter({history:createWebHashHistory(),//hash模式routes:[//……………………]
      })
      

嵌套路由

路由的嵌套即在路由组件中继续使用其他路由组件,层层嵌套

在router的index.ts中,要在要配置嵌套路由的路由配置中加上children配置项(数组),其中的元素就是指定一个一个嵌套的子路由组件。子路由组件中的path前面不要加”/”,例:

const router = createRouter({history:createWebHistory(),//路由器的工作模式routes:[{path:'/news',component:News,children:[{path:'detail',component:Detail}]}]
})

在父路由组件中,加上RouterView标签,并配置好RouterLink标签(其中的to要写完整的路径,比如上方的要展示Detail组件,path就要写作/news/detail)

<template><div class="news"><ul><li v-for="news in newList" :key="news.id"><RouterLink to="/news/detail">{{ news.title }}</RouterLink></li></ul><div class="newsContent"><RouterView></RouterView></div></div>
</template>

路由传参之query参数

用query参数可以添加或者获取路径上的param参数列表,即路径上的?后面的kv信息。以达到路由传参的

添加:添加一般由父路由组件指定参数信息:有两种写法:

  • 第一种:字符串中的参数值占位

        <ul><li v-for="news in newList" :key="news.id"><!-- 第一种写法 --><RouterLink :to="`/news/detail?id=${news.id}&title=${news.title}`">{{ news.title }}</RouterLink></li></ul>
    

    但是第一种方式不方便,且观感上不美观。建议使用第二种方式

  • 第二种,使用对象式写法

        <ul><li v-for="news in newList" :key="news.id"><!-- 第二种写法:将to写作对象的形式 --><RouterLink :to="{// path:'/news/detail',name:'detail',query:{id:news.id,title:news.title,content:news.content}}">{{ news.title }}</RouterLink></li></ul>
    

获取:子路由组件获取query的参数值

<template><ul class="news-list"><li>编号:{{ route.query.id }}</li><li>标题:{{ route.query.title }}</li><li>内容:{{ route.query.content }}</li></ul>
</template><script lang="ts" name="About" setup>import { useRoute } from 'vue-router';let route = useRoute()
</script>

用useRoute就可以获取到地址上的各个参数的参数值,这些参数值都是存于query参数中,所以获取要使用 route.query.参数名。

路由传参之params参数

params参数是将参数值直接以路径的形式存在路径当中

要让路由不会将路径上的值视为真正的路径,就要在router中的index.ts中的路由配置中指定好参数名:

const router = createRouter({history:createWebHistory(),//路由器的工作模式routes:[{name:'about',path:'/about',component:News2,children:[{path:'detail2/:id/:title/:content',name:'detail2',component:Detail2}]}]
})

添加参数:

    <ul><li v-for="news in newList" :key="news.id"><!-- 第一种写法 --><!-- <RouterLink :to="`/about/detail2/${news.id}/${news.title}/${news.content}`">{{ news.title }}</RouterLink> --><!-- 第二种写法 --><RouterLink :to="{name:'detail2',//此时只能使用指定name来指定路由的写法params:{id:news.id,    //此处的名称要根据路由中指定的参数名来title:news.title,content:news.content}}">{{ news.title }}</RouterLink></li></ul>

但是这种方式不能传入数组类型的数据

如果想让参数可传可不传,在参数名后加上一个?

获取参数:

<template><ul class="news-list"><li>编号:{{ route.params.id }}</li><li>标题:{{ route.params.title }}</li><li>内容:{{ route.params.content }}</li></ul>
</template><script lang="ts" name="About" setup>import { useRoute } from 'vue-router';let route = useRoute()
</script>

路由传参之路由的props配置

  • 第一种写法:将所有的params参数信息多一份转换为给子路由组件的props配置项的参数。(只能用于params参数)

在子路由组件的路由配置中加上props配置项,直接让其值为true。

const router = createRouter({history:createWebHistory(),//路由器的工作模式routes:[{name:'about',path:'/about',component:News2,children:[{path:'detail2/:id/:title/:content',name:'detail2',component:Detail2,props:true}]}]
})

如此Detail2组件就会多三个props参数id、title、content。

<template><ul class="news-list"><li>编号:{{ route.params.id }}</li><li>标题:{{ route.params.title }}</li><li>内容:{{ route.params.content }}</li><hr><li>编号:{{ id }}</li><li>标题:{{ title }}</li><li>内容:{{ content }}</li></ul>
</template><script lang="ts" name="About" setup>import { useRoute } from 'vue-router';let route = useRoute()defineProps(['id','title','content'])
</script><style>.news-list{list-style: none;padding-left: 20px;}.news-list>li{line-height: 30px;}
</style>
  • 第二种写法:函数式写法,可以获取route并使用,也就是那个useRoute()的返回值
const router = createRouter({history:createWebHistory(),//路由器的工作模式routes:[{name:'news',path:'/news',component:News,children:[{name:'detail',path:'detail',component:Detail,props(route){return {//也可以直接return route.queryid:route.query.id,title:route.query.title,content:route.query.content}}}]}]
})

这里的route参数接收的就是useRoute()的返回值的那个route,因为第一种写法不能使用在query参数的使用上,但是第二种写法都可以适用,也可以自己return想要的props参数。return返回的参数就会变成给子路由组件的props参数。

  • 第三种写法:对象式写法,可以自己决定将什么作为props参数给路由组件。
props:{a:100,b:200,c:'abc'
}

但是这种写法写死了,不灵活,建议使用第一种或者第二种。

replace属性

<RouterLink :to="…… ……" replace>…… ……</RouterLink>

push模式就是将浏览器历史记录以栈的形式存储,新点开的页面状态加到栈顶,replace模式就是将新点开的页面状态替换掉当前页面状态到栈顶。

要让某个路由是replace模式的,在对应的RouterLink标签上加上replace属性即可。

编程式导航

编程式路由导航就是脱离<RouterLink>实现路由跳转。

要实现这种方式,使用useRouter(注意是useRouter,不是useRoute),例:

<template><div class="home"><img src="<http://www.atguigu.com/images/index_new/logo.png>"></div>
</template><script lang="ts" setup>import { onMounted } from 'vue';import { useRouter } from 'vue-router';const router = useRouter()//注意,不是useRoute,是useRouteronMounted(()=>{setTimeout(()=>{router.push('/news')},5000)})
</script>

调用router的push函数,传入要跳转的路由,就可以实现不使用RouterLink的方式来跳转路由。

push函数中还可以写做对象的写法,说白了就是,to中怎么写,push的参数中就怎么写。

<template><div class="news"><ul><li v-for="news in newList" :key="news.id"><!-- 第一种写法 --><!-- <RouterLink :to="`/about/detail2/${news.id}/${news.title}/${news.content}`">{{ news.title }}</RouterLink> --><!-- 第二种写法 --><RouterLink :to="{name:'detail2',//此时只能使用指定name来指定路由的写法params:{id:news.id,    //此处的名称要根据路由中指定的参数名来title:news.title,content:news.content}}">{{ news.title }}</RouterLink><button @click="showNewsDetail(news.id,news.title,news.content)">查看新闻</button></li></ul><div class="newsContent"><RouterView></RouterView></div></div>
</template><script lang="ts" setup>import { reactive } from 'vue';import { RouterView ,RouterLink,useRouter} from 'vue-router';const newList = reactive([{id:'new01',title:'很好的抗癌食物',content:'西兰花'},{id:'new02',title:'如何一夜暴富',content:'做梦'},{id:'new03',title:'如何赚大钱',content:'学it'},{id:'new04',title:'好消息',content:'放假了'}])const router = useRouter()function showNewsDetail(id:string,title:string,content:string){router.push({name:'detail2',params:{id:id,title:title,content:content}})}
</script>

如果想要使用replace模式,将push换成replace函数就行,写法一样。

重定向

在route包下的index.ts中,要加上重定向,加上一个路由元素,使用redirect属性,例:

const router = createRouter({history:createWebHistory(),//路由器的工作模式routes:[{name:'ergouHome',path:'/home',component:Home},{name:'news',path:'/news',component:News,children:[{name:'detail',path:'detail',component:Detail,props(route){return {id:route.query.id,title:route.query.title,content:route.query.content}}}]},{name:'about',path:'/about',component:News2,children:[{path:'detail2/:id/:title/:content',name:'detail2',component:Detail2,props:true}]},{ //重定向path:'/',redirect:'/home'}]
})

当配置了重定向的时候,当路径为其path的时候,就会跳转到redirect指定的那个路由

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTMLCSS练习

1) 效果如下 2) 代码如下 2.1) HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" conte…

Ultralytics:YOLO11使用教程

Ultralytics&#xff1a;YOLO11使用教程 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows YOLO11使用教程进行目标检测进行实例分割进行姿势估计进行旋转框检测进行图像分类 参考文献 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多…

一文解读数据中台附搭建指南

数据是企业的核心资产&#xff0c;更是企业数字化转型的关键驱动力。为了更好地管理和利用数据&#xff0c;进行数据共享&#xff0c;充分发挥数据的作用&#xff0c;越来越多的企业开始构建实时数据中台。 一数据中台 定义&#xff1a;数据中台是将企业内部各个部门、系统、应…

Qt 自绘开关按钮以及设计器中的提升为用法

文章目录 自绘按钮实现概要效果图代码 提升为用法介绍步骤 总结 自绘按钮实现 概要 当我们需要一个开关样式的QPushbutton&#xff0c;没有图片的话&#xff0c;我们可以采用自绘的形式实现。且使用QtDesinger中提升为Promote to的功能加入界面中&#xff0c;而不是使用代码的…

OpenCV高级图形用户界面(1)创建滑动条函数createTrackbar()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 创建一个滑动条并将其附加到指定的窗口。 该函数 createTrackbar 创建一个具有指定名称和范围的滑动条&#xff08;滑块或范围控制&#xff09;…

作为一名测试工程师如何学习Kubernetes(k8s)技能

前言 Kubernetes(K8s)作为云原生时代的关键技术之一&#xff0c;对于运维工程师、开发工程师以及测试工程师来说&#xff0c;都是一门需要掌握的重要技术。作为一名软件测试工程师&#xff0c;学习Kubernetes是一个有助于提升自动化测试、容器化测试以及云原生应用测试能力的重…

重学SpringBoot3-集成Redis(三)之注解缓存策略设置

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;三&#xff09;之注解缓存策略设置 1. 引入 Redis 依赖2. 配置 RedisCacheManager 及自定义过期策略2.1 示例代码&#xff1a;自定…

API接口开发心得,接口封装方法

API&#xff08;应用程序编程接口&#xff09;是定义了一组规则&#xff0c;允许不同的软件应用程序或组件交互的技术。在Web开发中&#xff0c;API通常通过HTTP请求实现。在API接口的开发过程中&#xff0c;接口封装是一个重要环节。以下是一些API接口开发心得以及接口封装方法…

如何使用ssm实现大学生兼职跟踪系统

TOC 10909ssm大学生兼职跟踪系统 系统概述 进过系统的分析后&#xff0c;就开始记性系统的设计&#xff0c;系统设计包含总体设计和详细设计。总体设计只是一个大体的设计&#xff0c;经过了总体设计&#xff0c;我们能够划分出系统的一些东西&#xff0c;例如文件、文档、数…

【探测器】线阵相机中的 TDI 技术

【探测器】线阵相机中的 TDI 技术 1.背景2.TDI相机3.场景应用 1.背景 TDI 即Time Delay Integration时间延迟积分。 TDI相机是线阵相机的一种特殊类型&#xff0c;带有独特的时间延迟积分&#xff08;TDI&#xff09;技术。 换句话说&#xff0c;TDI相机是线阵相机的一个高级版…

点评项目-6-缓存更新策略、缓存穿透、雪崩

缓存更新策略 使用 redis 缓存记录的信息&#xff0c;有可能在数据库被信息被修改导致信息不一致&#xff0c;使用缓存更新来解决这个问题 缓存更新策略主要有三种&#xff1a; 1.内存淘汰(redis默认开启) 2.超时剔除(给key添加TTL时间) 3.主动更新(编写业务逻辑) 主动更新策…

vite学习教程02、vite+vue2配置环境变量

文章目录 前言1、安装依赖2、配置环境变量3、应用环境变量4、运行和构建项目资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝3W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容&#xff1…

Linux使用Docker部署Paperless-ngx结合内网穿透打造无纸化远程办公

文章目录 前言1. 部署Paperless-ngx2. 本地访问Paperless-ngx3. Linux安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 本文主要介绍如何在Linux系统本地部署Paperless-ngx开源文档管理系统&#xff0c;并结合cpolar内网穿透工具解决本地部署…

又被特斯拉演了?继续“画饼式”发布Robotaxi,产业链静观其变

9月底的暴涨后&#xff0c;A股资产正经历回调&#xff0c;科技板块变现参差。不过&#xff0c;无人驾驶领域的预期依然很强。 10月10日科技股全线调整之际&#xff0c;无人驾驶板块盘中的巨幅震荡拉升就是典型的预热动作。东箭科技、天龙股份等多只智能驾驶个股涨停。核心驱动…

【STM32开发之寄存器版】(九)-模数转换ADC

一、前言 本次DEMO目标&#xff1a; 本文将使用STM32F103ZET6的ADC1通道1来采样外部电压值&#xff0c;并使用串口在上位机XCOM上打印出电压值。 二、模数转换原理与基本概念 2.1 ADC基本概念 模数转换器&#xff08;ADC&#xff0c;Analog-to-Digital Converter&#xff09;是…

与ZoomEye功能类似的搜索引擎还有哪些?(渗透课作业)

与ZoomEye功能类似的搜索引擎有&#xff1a; Shodan&#xff1a;被誉为“物联网的搜索引擎”&#xff0c;专注于扫描和索引连接到互联网的各种设备&#xff0c;如智能家居设备、工业控制系统、摄像头、数据库等。它提供全球互联网设备的可视化视图&#xff0c;帮助用户了解网络…

xss-labs靶场第一关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、注入点寻找 2、使用hackbar进行payload测试 3、绕过结果 四、源代码分析 五、结论 一、测试环境 1、系统环境 渗透机&#xff1a;本机(127.0.0.1) 靶 机&#xff1a;本机(127.0.0.…

AI时代大厂AI项目管理学习路线

AI时代避免被裁员&#xff0c;大厂AI项目管理学习路线主要包括&#xff1a; 1、AI项目管理基础技能。 2、项目管理AI技术知识。 3、数据分析与决策。 4、AI项目管理工具。 5、AI项目管理知识扩展。 01 AI项目管理基础技能。 AI项目管理基础技能构成了项目管理的骨架&…

# linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(九)--网络设置与文件上传下载

linux从入门到精通-从基础学起&#xff0c;逐步提升&#xff0c;探索linux奥秘&#xff08;九&#xff09;–网络设置与文件上传下载 一、网络设置 1、首先知道网卡配置文件位置&#xff1a;/etc/sysconfig/network-scripts [rootlocalhost test1]# ls /etc/sysconfig/netwo…

【Java SE 题库】递归的魅力之--> 汉诺塔问题

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. 题目 2. 分析 2.1 图解 2.2 代码解析 3. 完整代码 3.1 运行截图 4. 小结 1. 题目 汉诺塔问题是一个经典的递归问题&#xff0c;源自一个古老的印度传…