Vue3学习02 路由

Vue3学习02 路由

  • 路由
    • 基本使用
    • 两个注意点
    • 路由器工作模式
    • to的两种写法
    • 【命名路由】
    • 【嵌套路由】
    • 路由传参
      • query参数
      • params参数
    • 路由规则的props配置
    • replace属性
    • 编程式导航
    • 重定向

路由

路由器检测到路由的变化,路径变化,对应的组件也变化

基本使用

想使用路由:

① 确定导航区、展示区

② 请来路由器 npm i vue-router

③ 指定路由的具体规则(什么路径、对应着什么组件)

​ 在 src 底下 创建一个文件夹 router/index.ts (vue3中是ts不是js)

④ 形成一个一个的 .vue 文件

  • 配置路由 src/router/index.ts
// 创建一个路由器 并暴露出去// 第一步 引入 createRouter
import {createRouter,createWebHistory} from 'vue-router'// 引入一个一个可能要呈现的组件
import Home from '@/components/Home.vue';
import News from '@/components/News.vue';
import About from '@/components/About.vue';// 第二步 创建路由器
const router = createRouter({history:createWebHistory(), // 路由器的工作模式routes: [{path: '/home',component: Home,},{path: '/news',component: News,},{path: '/about',component: About,}]
})export default router 
  • main.ts
import {createApp} from 'vue'
import App from './App.vue'// 引入路由器
import router from './router'// createApp(App).mount('#app')// 创建应用
const app = createApp(App)
// 使用路由器
app.use(router)
// 挂载
app.mount('#app')
  • app.vue :RouterLink、RouterView
<template><div class="app"><h2 class="title">Vue路由测试</h2><!-- 导航区 --><div class="navigate"><RouterLink to="/home" active-class="xiaozhupeiqi">首页</RouterLink><RouterLink to="/news" active-class="xiaozhupeiqi">新闻</RouterLink><RouterLink to="/about" active-class="xiaozhupeiqi">关于</RouterLink></div><!-- 展示区 --><div class="main-content"><RouterView></RouterView></div></div>
</template><script lang="ts" setup name="App"></script>

两个注意点

  1. 路由组件通常存放在pagesviews文件夹,一般组件通常存放在components文件夹。

  2. 通过点击导航,视觉效果上“消失” 了的路由组件,默认是被卸载掉的,需要的时候再去挂载

通过生命周期函数验证 onMounted 、onUnMounted

路由器工作模式

import {createRouter,createWebHistory,createWebHashHistory} from ‘vue-router’

  1. history模式

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

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

    const router = createRouter({history:createWebHistory(), //history模式/******/
    })
    
  2. hash模式

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

    缺点:URL带有#不太美观,且在SEO优化方面相对较差。

    const router = createRouter({history:createWebHashHistory(), //hash模式/******/
    })
    

to的两种写法

<!-- 第一种:to的字符串写法 -->
<router-link active-class="active" to="/home">主页</router-link><!-- 第二种:to的对象写法 -->
<router-link active-class="active" :to="{path:'/home'}">Home</router-link>

对象写法,to的前面必须加一个冒号,表示绑定,实际路径为 双引号内部的对象。如果不写绑定,就是字符串

【命名路由】

作用:可以简化路由跳转及传参(后面就讲)。

给路由规则命名:

routes:[{name:'zhuye', // 给路由命名path:'/home',component:Home},{name:'xinwen', // 给路由命名path:'/news',component:News,},{name:'guanyu', // 给路由命名path:'/about',component:About}
]

跳转路由:

<!--简化前:需要写完整的路径(to的字符串写法) -->
<router-link to="/about">跳转</router-link><!--简化后:直接通过名字跳转(to的对象写法配合name属性) -->
<router-link :to="{name:'guanyu'}">跳转</router-link>

【嵌套路由】

1、编写News的子路由:Detail.vue

2、配置路由规则,使用children配置项:

children配置项里面的路径 path 不加斜杠

const router = createRouter({history:createWebHistory(),routes:[{name:'zhuye',path:'/home',component:Home},{name:'xinwen',path:'/news',component:News,children:[{name:'xiang',path:'detail', //这里不写斜杠component:Detail}]},{name:'guanyu',path:'/about',component:About}]
})
export default router

3、跳转路由(记得要加完整路径):

<router-link to="/news/detail">xxxx</router-link>
<!-- 或 -->
<router-link :to="{path:'/news/detail'}">xxxx</router-link>

4、记得去Home组件中预留一个<router-view>

<template><div class="news"><nav class="news-list"><RouterLink v-for="news in newsList" :key="news.id" :to="{path:'/news/detail'}">{{news.name}}</RouterLink></nav><div class="news-detail"><RouterView/></div></div>
</template>

路由传参

route 路由:一组对应关系

router 路由器:管理路由

query参数

  • query写法(带问号):/news/detail?id=111&title=haha

  • query参数 有两种写法 是因为 to有两种写法

to的两种写法:

<RouterLink to="/news/detail">{{ news.title }}
</RouterLink><!-- to的对象写法,前面需要加冒号 -->
<RouterLink :to="{path: '/news/detail', //或者  name:'xiangqing'}">{{ news.title }}
</RouterLink>
  1. 传递参数

    ① to的字符串写法:配合模板字符串。to前面加一个冒号,表示它实际上的内容是双引号里面的字符串(模板字符串)

    ② to的对象写法

    <!-- 跳转并携带query参数(to的字符串写法) -->
    <li v-for="news in newsList" :key="news.id"><RouterLink :to="`/news/detail?id=${news.id}&title=${news.title}&content=${news.content}`">{{ news.title }}</RouterLink>
    </li><!-- 跳转并携带query参数(to的对象写法) -->
    <RouterLink :to="{//name:'xiangqing', //用name也可以跳转path:'/news/detail',query:{id:news.id,title:news.title,content:news.content}}"
    >{{news.title}}
    </RouterLink>
    
  2. 接收参数:

    这里 useRoute 是 hooks(usexxx 命名规则)

    import {useRoute} from 'vue-router'
    const route = useRoute()
    // 打印query参数
    console.log(route.query)
    

如果想解构 route.query,会失去响应式。从一个响应式对象身上解构属性,该属性必定丢失响应式。要使用 toRefs.

正确做法:

import {useRoute} from 'vue-router'
const route = useRoute()
// 打印query参数
let {query} = toRefs(route)

params参数

哈哈 嘿嘿 呼呼 是参数,但是vue会认为是路由规则。所以需要在路由中配置规则,告诉路由哪部分不算路径。

<RouterLink to="/news/detail/哈哈/嘿嘿/呼呼">{{ news.title }}</RouterLink>

1、配置规则

需要在 /router/index.ts中先配置规则

    {path: '/news',component: News,children: [{name:'xiangqing',path: 'detail/:id/:title/:content', //占位component: Detail}]}

数据content 可传可不传的写法:

path: 'detail/:id/:title/:content?'
表示content内容可传可不传

2、传递参数:

备注1:传递params参数时,若使用to的对象写法,必须使用name配置项,不能用path

备注2:传递params参数时,需要提前在规则中占位。

<li v-for="news in newsList" :key="news.id"><!-- 字符串写法 --><RouterLink :to="`/news/detail/${news.id}/${news.title}/${news.content}`">{{ news.title }}</RouterLink><!-- 对象写法 --><RouterLink :to="{name:'xiangqing',params:{id: news.id,title: news.title,content: news.content}  }">{{ news.title }}</RouterLink></li>

3、接收参数:

import {useRoute} from 'vue-router'
const route = useRoute()
// 打印params参数
console.log(route.params)

路由规则的props配置

  • /router/index.ts

作用:让路由组件更方便的收到参数(可以将路由参数作为props传给组件)

{name:'xiang',path:'detail/:id/:title/:content',component:Detail,// props的布尔值写法,作用:把收到了每一组【params参数】,作为props传给Detail组件// props:true// props的对象写法,作用:把对象中的每一组key-value作为props传给Detail组件// props:{a:1,b:2,c:3}, // props的函数写法,作用:把返回的对象中每一组key-value作为props传给Detail组件props(route){return route.query}
}

① 对应props的布尔值写法(把收到了每一组【params参数】,作为props传给Detail组件):

News.vue

<li v-for="news in newsList" :key="news.id"><!-- 字符串写法 --><RouterLink :to="`/news/detail/${news.id}/${news.title}/${news.content}`">{{ news.title }}</RouterLink>
</li>

Detail.vue

<template><ul class="news-list"><li>编号:{{ id }}</li><li>标题:{{ title }}</li><li>内容:{{ content }}</li></ul>
</template><script setup lang="ts" name="About">defineProps(['id','title','content'])
</script>

② 对应props的函数写法

{name:'xiang',path:'detail/:id/:title/:content',component:Detail,props(route){return route.query}
}

Detail.vue

<template><ul class="news-list"><li>编号:{{ id }}</li><li>标题:{{ title }}</li><li>内容:{{ content }}</li></ul>
</template><script setup lang="ts" name="About">defineProps(['id','title','content'])
</script>

之前在父组件Father.vue 中注册使用子组件Son.vue(一般组件),可以直接在父组件内传递参数,<Son a="123">于是在Son.vue中使用 defineProps接收参数。

但是如果是路由组件,其并不在父组件中注册,而是通过路由切换组件,这是就可以用到 本小节的路由规则的props配置。在路由组件中也用defineProps接收参数。

replace属性

  1. 作用:控制路由跳转时操作浏览器历史记录的模式。

  2. 浏览器的历史记录有两种写入方式:分别为pushreplace

    • push是追加历史记录(默认值)。
    • replace是替换当前记录。
  3. 开启replace模式:

    <RouterLink replace .......>News</RouterLink>
    

编程式导航

之前我们路由跳转的时候,使用的是routerlink和routerview。最终浏览器会把 RouterLink 标签变为认识的 a 标签。但如果我们想要点击按钮跳转,怎么实现?

什么叫编程式路由导航?脱离 routerlink 实现路由跳转。

路由组件的两个重要的属性:$route$router变成了两个hooks

import {useRoute,useRouter} from 'vue-router'const route = useRoute()
const router = useRouter()console.log(route.query)
console.log(route.parmas)
console.log(router.push)
console.log(router.replace)
  • 示例
import {useRouter} from 'vue-router'
const router = useRouter()
router.push('/news') 

这里的 push 写法,和routerlink中的to写法一样,有字符串写法、也有对象写法

router.push({path: '/news/detail',query: {id: news.id,title:news.title,content:news.content}
})

利用接口进行限制

  import {useRouter} from 'vue-router'const router = useRouter()// 利用接口进行限制interface NewsInter {id:string,title:string,content:string} function showNewsDetail(news:NewsInter) {router.push({name: 'xiangqing',query: {id: news.id,title: news.title,content: news.content}})}

注意,在vue2中,编程式路由导航重复跳转是报错的。vue3中不算错。

  • 使用场景

只有满足了某种条件之后,才会跳转路由。比如广告五秒之后跳转页面。

重定向

  1. 作用:将特定的路径,重新定向到已有路由。

  2. 具体编码:

    {path:'/',redirect:'/about'
    }
    

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

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

相关文章

Java后端搭建流程

目录 一、后端开发准备工作 1.下载 2.安装jdk &#xff0c;配置JAVA-HOME path 3.启动Tomcat 4.访问ip和端口 二、创建web项目 1.新建一个项目 2.发布web应用到服务器 &#xff08;1&#xff09;对LoginServlet继承HttpServlet &#xff08;2&#xff09;重写父类方法…

如何让视频流媒体平台免受网络攻击

在各国&#xff0c;流媒体服务已越来越受到大众的欢迎。有统计表明&#xff0c;目前视频流已占网络整体流量的80%以上。不过如您所见&#xff0c;近年来&#xff0c;数字威胁的不断增加&#xff0c;也让网络攻击逐年递增。单个视频用户受到的危险&#xff0c;往往会危及到整个服…

故障诊断 | 基于小波包结合卷积神经网络DWT-CNN实现电缆故障诊断算法研究附matlab代码

步骤 电缆故障诊断算法的实现步骤如下: 步骤1:数据预处理 首先,收集电缆的传感器数据。这些数据可以是电流、电压或其他与电缆状态相关的测量值。 对数据进行预处理,包括去除噪声、滤波和归一化等操作。 步骤2:小波包分解 使用小波包分解(Discrete Wavelet Packet Tr…

Vue 项目build打包发布到giteepages ,首页正常显示,其他路由页面报错404的解决方法

直接上解决方法&#xff1a; 打包之后dist上传之后&#xff0c;还要新创一个.spa文件&#xff0c;注意&#xff01;是 .spa 有个. 点&#xff0c;如下图 一般这样就可以开始部署了&#xff0c;然后开启giteepages服务。如果出现了首页正常显示&#xff0c;其他页面显示…

全新华为MateBook X Pro发布,将Ultra9放入980g超轻薄机身

2024年4月11日&#xff0c;在华为鸿蒙生态春季沟通会上全新的华为MateBook X Pro正式发布。该机以美学设计、创新科技以及智慧体验&#xff0c;追求重新定义Pro、重新定义旗舰&#xff0c;将颠覆消费者对传统轻薄本的认知。 华为MateBook X Pro追求极致轻薄与强大性能的完美结合…

【架构-10】DDOS(分布式拒绝服务攻击)

什么是分布式拒绝服务攻击&#xff1f; 分布式拒绝服务攻击&#xff08;Distributed Denial of Service&#xff0c;简称DDoS攻击&#xff09;是一种恶意行为&#xff0c;旨在通过同时向目标系统发送大量的请求或网络流量&#xff0c;以使该系统无法正常提供服务。与传统的拒绝…

Java安全管理器-SecurityManager

定义&#xff1a; SecurityManager是Java中的一个类&#xff0c;用于实现安全管理功能。它允许应用程序在运行时对安全策略进行动态管理&#xff0c;并控制哪些操作可以执行&#xff0c;哪些应该被拒绝。主要功能包括&#xff1a; 安全策略管理&#xff1a;SecurityManager允许…

D-LinkNAS 远程命令执行漏洞(CVE-2024-3273)RCE漏

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 D-LinkNAS是由D-Link公司制造的网络附加存储设备。…

SOLIDOWRKS怎么将中间格式的模具装配体转化为装配体格式

模具是工业生产中用于制作成型物品的工具&#xff0c;它由各种零件构成&#xff0c;可以通过改变所成型材料的物理状态来实现物品外形的加工。如果工程师已经有其他格式的模具装配体&#xff0c;但是又想将其他格式的模具装配体导入solidworks里面&#xff0c;并且将一个个实体…

数字人项目 ER-NeRF 的使用和部署详细教程

文章目录 1. ER-NeRF简介2. ER-NeRF部署3. 训练自己的数字人4. 生成数字人视频5. 其他数字人模型比较常见错误 1. ER-NeRF简介 ER-NeRF&#xff08;官方链接&#xff09;是一个Talking Portrait Synthesis&#xff08;对嘴型&#xff09;项目。即&#xff1a;给一段某人说话的…

Linux网络基础2(下)

传输层 再谈端口号端口号的划分netstatpidof UDP协议 UDP的特点UDP缓冲区UDP使用注意事项UDP报头的理解基于UDP的应用层协议 TCP协议 4位首部长度16位窗口大小确认应答机制32位序号和32位确认序号6个标记位超时重传机制连接管理机制流量控制快重传机制再谈序号延迟应答面相字节…

力扣经典150题第十五题:分发糖果

目录 力扣经典150题第十五题&#xff1a;分发糖果1. 题目描述2. 问题分析3. 解题思路4. 代码实现5. 时间复杂度分析6. 应用和扩展7. 总结8. 参考资料 力扣经典150题第十五题&#xff1a;分发糖果 1. 题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分…

知识图谱与人工智能:携手共进

知识图谱与人工智能&#xff1a;携手共进 一、引言&#xff1a;知识图谱与人工智能的融合 在这个数据驱动的时代&#xff0c;知识图谱与人工智能&#xff08;AI&#xff09;之间的融合不仅是技术发展的必然趋势&#xff0c;也是推动各行各业创新的关键。知识图谱&#xff0c;作…

游戏行业科普 (二)游戏是怎么做出来,怎么卖出去的?

游戏行业科普系列文章&#xff0c;大家可以关注起来&#xff0c;等我慢慢芬分享~~ 《蛋仔派对》 一、研运流程--游戏是怎么做出来的 一款游戏的开发和运营大体上可以分为预研立项、设计开发、测试调优、发行上线和成熟运营几个阶段。 1&#xff09;预研立项&#xff1a; 初始研…

贪心算法|56.合并区间

力扣题目链接 class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<vector<int>> result;if (intervals.size() 0) return result; // 区间集合为空直接返回// 排序的参数使用了lambda表达…

Nginx的基本使用

目录 介绍Nginx&#xff1a; 其优点有很多&#xff1a; 如何下载Nginx&#xff1a; 下载Nginx 启动Nginx ​编辑 如何用Nginx创建网站 Nginx自带的网站 分析网页 转变ip地址为自己的网页 换内容 换文件 介绍Nginx&#xff1a; Nginx是一个高性能的HTTP和反向代理w…

如何将普通maven项目转为maven-web项目

文件-项目结构&#xff08;File-->Project Structure &#xff09; 模块-->learn&#xff08;moudle-->learn&#xff09; 选中需要添加web的moudle&#xff0c;点击加号&#xff0c;我得是learn&#xff0c;单击选中后进行下如图操作&#xff1a; 编辑路径 结果如下…

相似图片分类 [华为]【并查集】

题目描述&#xff1a; 小明想要处理一批图片&#xff0c;将相似的图片分类&#xff0c;他首先对图片的特征采样&#xff0c;得到图片之间的相似度&#xff0c;然后 按照以下规则判断图片是否可以归为一类&#xff1a; 1&#xff09;相似度>0表示两张图片相似&#xff1b; 2…

请描述TensorFlow中的Saver对象及其用途。在TensorFlow中,如何保存和加载训练好的模型?

请描述TensorFlow中的Saver对象及其用途。 TensorFlow中的Saver对象是一个用于保存和加载模型参数的类。Saver对象在TensorFlow中扮演着至关重要的角色&#xff0c;尤其是在模型训练和部署的过程中。 Saver对象的主要用途如下&#xff1a; 模型保存&#xff1a;在训练神经网络…

Open CASCADE学习|BrepOffsetAPI_ThruSections无法放样成Solid

目录 1、边界线&#xff08;TopoDS_Wire&#xff09;不在一个平面上时&#xff0c;无法生成Solid 2、边界线&#xff08;TopoDS_Wire&#xff09;在一个平面上时&#xff0c;可以生成Solid 3、边界线&#xff08;TopoDS_Wire&#xff09;不在一个平面上时&#xff0c;添加To…