总算学到路由了————vue3中路由介绍

news2024/12/25 9:07:45

基本创建步骤 

下载vue-router的依赖:npm install vue-router@4

创建好路由组件,放在pages/views里面

views 文件夹通常包含应用的页面。这些页面通常是与路由相对应的组件,代表应用的不同视图,components 文件夹通常包含可重用的组件。这些组件可以在多个视图中使用,通常是用于构建 UI 的小块)

在src下面创建一个router文件夹,新建index.ts或index.js

路径中加@与不加@的区别

路径的解析方式。

  1. import Son01 from '@/components/Son01.vue';

    • @ 是一个别名,通常在 Vue 项目中配置为指向 src 目录。
    • 这种写法使得导入路径更简洁且易于管理。比如,如果你想导入 src/components/Son01.vue,你可以使用 @/components/Son01.vue
    • 别名 @ 是在 vue.config.js 或 vite.config.js 等配置文件中进行配置的,确保在项目的构建工具中正确解析。
  2. import Son01 from './components/Son01.vue';

    • ./ 表示相对路径,是从当前文件所在目录开始计算的路径。
    • 这种写法依赖于当前文件的相对位置,路径会随着文件结构的改变而改变。对于较深的文件夹结构,这种写法可能变得不够直观和方便。

总结

  • 使用 @ 别名可以让路径更简洁,尤其是在大型项目中,路径管理和修改变得更容易
  • 使用相对路径则更直接,但当项目结构发生变化时,维护相对路径可能会比较麻烦
 // 先引入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
1. Hash模式
  • 定义:Hash模式使用URL中的哈希(#)部分来表示不同的路由。浏览器在处理哈希时不会重新加载页面。
  • 优点
    • 简单易用,兼容性好,支持所有浏览器。
    • 不需要服务器配置,直接在客户端处理。
  • 缺点
    • URL不够美观,包含#符号。
    • 不支持浏览器的历史记录管理(如前进、后退)。

示例http://example.com/#/home

2. History模式
  • 定义:History模式利用HTML5的History API来管理路由,允许使用正常的URL而不需要哈希。
  • 优点
    • URL更美观,用户体验更好。
    • 支持浏览器的历史记录管理。
  • 缺点
    • 需要服务器支持,必须配置服务器以处理所有路由请求。
    • 对旧版浏览器的支持较差。

示例http://example.com/home

由于上面index.ts里面的export default router,路由暴露。

接着在main.js里面去使用这个router

import { createApp } from 'vue'
import App from './App.vue'

// 引入路由器
import router from './router' // 默认会找该文件下的index

// 创建一个应用
const app = createApp(App)

//  使用路由
app.use(router)
// 挂在到整个app容器里面,index.html里面的id="app"
app.mount('#app')

至此,就完全搭建好了路由的环境,接下来就到App.vue里面去使用(style省略)

引入RouterView ,RouterLink,设置显示路由展示区,以及跳转

<script setup>

 <!-- 从vue-router引入RouterView ,RouterLink -->
 
import { RouterView ,RouterLink} from 'vue-router';
</script>
<template>
  <nav class="navbar">
    <div class="logo" style="display: inline-block;">
      <RouterLink to="/home"><img src="./相机图标.webp" alt="log" width="40px"></RouterLink>
    </div>
    <div class="links" style="display: inline-block;">
      <RouterLink to="/home">首页</RouterLink>
      <RouterLink to="/news">新闻</RouterLink>
      <RouterLink to="/about">关于</RouterLink>
    
 <!-- RouterLink标签相当于a标签,来跳转 -->
    </div>
  </nav>

 <!-- 路由展示区 -->
  <div>
    <RouterView></RouterView>
  </div>
</template>

to的两种写法:

  • :to="{path:/about} "   或   :to="{name:'guanyu'}"(在routes里加了name)   (v-bind和对象的形式)
  • to="/about"   

子级路由的引入

在index.ts里面的父级组件news加上children,同样添加路由属性

 {
    path: '/news',
    component: News,
    children:[
      {
        path:'detal', // 子级不写‘/’
        component:detail
      }
    ]
  },

news组件里引入import { RouterLink, RouterView } from 'vue-router';

注意:to="/news/detail"

 
       <!-- script里引入import { RouterLink, RouterView } from 'vue-router'; -->
<div>
        <ul>
          <li v-for="news in newsArticles" :key="news.id">
                <RouterLink to="/news/detail">{{ news.name }}</RouterLink>
                <span class="views">点击量:{{ news.views }}</span>
            </li>
        </ul>
    </div>
        <!-- 新闻展示区 -->
        <RouterView></RouterView>
    <div>

路由的传参

query参数

父级组件中向子组件传参:

  • 方法一
 <RouterLink :to="`/news/detail?title=${news.name}&content=${news.content}`">{{ news.name }}</RouterLink>
  • 方法二
  <RouterLink :to="{
                    path:'/news/detail', // 跳转到的子级组件
                    // name:"neirong",name参数也可以
                    query:{ // 向组件里传的参数
                        title:news.name,
                        content:news.content
                    }
                }">{{ news.name }}</RouterLink>

父组件传完参数后,在子组件里展示

<template>
    <ul>
        <li>标题:{{ route.query.title }}</li>
        <li>内容:{{ route.query.content }}</li>
    </ul>
</template>
<script setup>
import { useRoute } from 'vue-router';
const route = useRoute()
console.log(route); // 这个route参数里面有父组件传过来的数据

</script>

params参数

在index.ts文件中改path值为:path:'detail/:Title/:Content'

为参数占位;如果有可传可不传的参数,就在参数后面加’?‘且对象数组中值为undefined

显示为:

children:[
      {
        name:"juti",
        path:'detail/:Title/:Content', // 这几个参数Title等之后传到子级组件
                                       // Detail里
        
       // path:'detail/:Title?/:Content'  如果有的参数可传可不传,就在参数后面加‘?’,
       // 然后使用params对象传参                            
        component:Detail
      }
    ]

 在父组件里面

<RouterLink :to="`/news/detail/${ news.name }/${ news.content }`">{{ news.name }}</RouterLink>

也可以通过params列表传对象,但path不能传,要改为传name,因为params只能和name一起用

             <RouterLink 
                :to="{
                    name:'juti', // 不能写path
                    params:{ // params不能传对象或数组
                        Title:news.name, // 没有标题原新闻对象数组里会写undefined
                        Content:news.content
                    }
                }">={{ news.name }}
            </RouterLink>

子组件中

<template>
    <ul>
        <li>标题:{{ route.params.Title }}</li>
        <li>内容:{{ route.params.Content }}</li>
    </ul>
</template>
<script setup>
    import { useRoute } from 'vue-router';
    const route = useRoute()
    console.log(route);
    
</script>

设置路由的props配置传参

在index.ts里面配置props

    {
        name:"juti",
        path:'detail/:Title?/:Content', // 子级不写‘/’
        component:Detail,
        props:true // 这样就可以在路由中进行props传参了
      }

在父组件里面保证是params参数,params就会是为props参数,这样在子组件里就可以不用useRoute(params和props一起打辅助

<template>
    <ul>
        <li>标题:{{ Title }}</li>
        <li>内容:{{ Content }}</li>
    </ul>
</template>
<script setup>
    // import { useRoute } from 'vue-router';
    // const route = useRoute()
    // console.log(route);
    defineProps(['Title', 'Content'])
</script>

replace和push

<RouterLink replace></RouterLink> // 直接在RouterLink标签里加
<RouterLink push></RouterLink>
  • push:会向浏览器的历史记录栈添加一个新的记录。这意味着如果你使用 push 导航到新路由,用户可以使用浏览器的“后退”按钮返回到之前的路由。
  • replace:不会向历史记录栈添加新记录,而是替换当前的路由记录。这意味着使用 replace 后,用户无法通过“后退”按钮【<=】返回到之前的路由。

编程式路由导航

即脱离RouterLink实现跳转。(比如跳出广告--->用onMounted:页面加载时打开小页面)

import { useRouter } from 'vue-router'; // 引入useRouter
const router = useRouter()
 // 以下是跳转函数
const checknews = (news) => {
    router.push({
                  name:'juti',
                  params:{
                  Title:news.name,
                  Content:news.content
                    }
                })
}

  <li v-for="news in newsArticles" :key="news.id">
          <button @click="checknews(news)">查看</button>
  </li>

重定向

即在routes数组里加上:

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

实现一进页面跳转到默认页面,即确定首页 

routes: [
    // 以下是路由规则
  {
    path: '/home',
    component: Home
  },
  {
    path: '/news',
    component: News,
    children:[
      {
        name:"juti",
        path:'detail/:Title?/:Content', // 子级不写‘/’
        component:Detail,
        props:true
      }
    ]
  },
  {
    name:'guanyu',
    path: '/about',
    component: About
  },
    // 下面是重定向
  {
    path:'/',
    redirect:'/home'
  }
  ]

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

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

相关文章

基于yolov8的行人过马路危险行为检测告警系统python源码+onnx模型+精美GUI界面

【算法介绍】 基于YOLOv8的行人过马路危险行为检测告警系统是一种高效、精准的智能交通监控解决方案。该系统利用YOLOv8这一前沿的目标检测算法&#xff0c;能够快速识别图像或视频中的行人&#xff0c;并准确判断其是否存在过马路时的危险行为&#xff0c;如玩手机、打电话等…

MySQL 查询数据库的数据总量

需求&#xff1a;查看MySQL数据库的数据总量&#xff0c;以MB为单位展示数据库占用的磁盘空间 实践&#xff1a; 登录到MySQL数据库服务器。 选择你想要查看数据总量的数据库&#xff1a; USE shield;运行查询以获取数据库的总大小&#xff1a; SELECT table_schema AS Datab…

抖音视频下载

对于特别喜欢的视频有时需要珍藏&#xff0c;下文方法可能会帮到你&#xff0c;但要注意尊重版权和遵守相关声明。 Edge浏览器打开抖音短视频&#xff0c;按F12&#xff0c;选择 网络&#xff1b;筛选条件?a&#xff1b;双击搜索结果打开视频&#xff1b;选择想要的视频&…

SpringBoot框架下的房产销售系统开发

第一章 绪 论 1.1背景及意义 房产销售也都将通过计算机进行整体智能化操作&#xff0c;对于房产销售系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如管理员&#xff1b;首页、个人中心、用户管理、销售经理管理、房源信息管理、房源类型管理、房子户型管理、交易订单管…

aspcms webshell漏洞复现

1.【ip】/admin_aspcms/login.asp访问后台&#xff0c;admin 123456 登录 2.点击【扩展功能】【幻灯片设置】点击【保存】开启代理进行抓包 3.在抓取的数据包中修改 slideTextStatus 字段的值为以下代码并进行发包 访问影响文件 字段值 1%25><%25Eval(Request (chr(65))…

FastAPI 中的错误处理:如何让错误信息更有价值

开头&#xff1a; 下面详细介绍如何在 FastAPI 中实现有效的错误处理策略。我们将讨论使用 HTTPException 来抛出带有详细描述的错误&#xff0c;定义 Pydantic 模型来结构化错误响应&#xff0c;以及如何通过自定义异常处理器来统一处理错误。此外&#xff0c;我们还将展示如…

LNMP的简单安装(ubuntu)

LNMP介绍 LNMP 是一种常见的开源软件组合&#xff0c;用于搭建高效的网站服务器环境。LNMP 代表以下四个组件&#xff1a; Linux&#xff1a;操作系统。Linux 是一种稳定、可靠、安全的开源操作系统&#xff0c;常用于服务器环境&#xff0c;特别是在企业级部署中。它负责底层…

深度学习张量变换操作利器 einops 基础实践

今天在一个项目调试的时候无意间报错&#xff1a; 以前其实并没有怎么多接触过einops&#xff0c;今天正好碰到了&#xff0c;就简单总结记录下。 解决上面的报错很简单&#xff0c;直接pip安装即可&#xff1a; einops 是一个用于操作张量的库&#xff0c;它提供了一种简洁且…

Ansys HFSS的边界条件与激励端口

本文将介绍HFSS边界条件、激励端口,然后重点介绍连接器信号完整性仿真应用最多的波端口(wave port)及其尺寸设置要点。 HFSS (电磁仿真)边界条件 HFSS中所谓的边界并非真正意义上的边界,边界条件是指定问题区域和对象边缘的场行为接口。在HFSS的背景下,边界的存在主要有两个…

【F的领地】项目拆解:科普类账号基础运营教程 | 学会使用工具 “偷懒” | 文字成片功能

初中同学&#xff0c;做了个科普类账号&#xff0c;半年转化了十几个&#xff0c;引发了我的兴趣。 账号也不做私域转化&#xff0c;而且就靠抖音橱窗…… 我这种天天和平台机制斗智斗勇的&#xff0c;看到能和平台同频的&#xff0c;不自然地感兴趣。 于是我就去问了一下细…

淘宝接连出招,电商平台开始卷营商环境了

文丨郭梦仪 商家苦“内卷”已久&#xff0c;电商平台终于出手了。 过去一年多时间里&#xff0c;商家先后被卷入到各种竞争中&#xff1a;拼绝对低价、仅退款&#xff0c;在带给消费者性价比更高的产品的同时&#xff0c;也成为一部分人薅羊毛的工具。 在某些平台上长时间的…

开发用户注册接口

用户表基本结构 用户头像存放在三方服务器&#xff0c;显示三方服务器地址 Java采访驼峰命名方法&#xff0c;数据库采用下划线命名法。 自动生成get、set方法的工具 lombok&#xff1a;在编译阶段&#xff0c;为实体类自动生成setter getter toString 使用步骤&#xff1…

在Spring官网查看Springboot与Java的版本对应关系

查看Spring Boot与Java的版本对应关系&#xff0c;可以按照以下步骤操作&#xff1a; 访问Spring官方网站&#xff0c;进入Spring Boot项目页面。可以通过点击菜单中的“Projects”&#xff0c;然后选择“Spring Boot”来访问。Spring | Home 在Spring Boot的LEARN页签中&…

什么是单元测试?怎么做?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是单元测试&#xff1f; 单元测试&#xff08;unit testing&#xff09;&#xff0c;是指对软件中的最小可测试单元进行检查和验证。至于“单元”的大小…

ip属地河北切换北京

我们知道&#xff0c;每当电脑或手机连接网络时&#xff0c;都会分配到一个网络IP地址&#xff0c;这个IP地址通常与设备所在的地区网络相关联。然而&#xff0c;出于业务或个人需求&#xff0c;有时我们需要将本机的IP地址切换到其他城市。例如要将IP属地河北切换北京&#xf…

点击 input 框显示弹窗,关闭弹窗给 input 赋值并进行必填校验

背景 在现代Web应用开发中&#xff0c;实现用户友好的输入交互是提升用户体验的关键之一。例如&#xff0c;在表单设计中&#xff0c;通过点击输入框触发弹窗来辅助用户输入&#xff0c;并在关闭弹窗时自动填充输入框并进行必要的校验&#xff0c;可以显著提高表单填写的便捷性…

Python 从入门到实战17(正则表达式操作)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了正则表达式的语法。今天进一步讨论一下正则表…

代码随想录训练营Day4 | 24. 两两交换链表中的节点 | 19.删除链表的倒数第N个节点 | 面试题 02.07. 链表相交 | 142.环形链表II

今日阅读文档&#xff1a;代码随想录 (programmercarl.com) Leetcode 24. 两两交换链表中的节点 题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只…

uview-plus 表单校验 相关字段有数据有值的情况下非空验证失败问题

你们好&#xff0c;我是金金金。 场景 uniapp编写h5及小程序&#xff0c;组件库用的uview-plus&#xff0c;在进行表单校验的过程中&#xff0c;数据回显 数量明明是有值的&#xff0c;还是依旧提示填写数量&#xff08;重新再次手动输入才能校验通过&#xff0c;明显是存在问题…

Python 课程6-Pandas 和 Matplotlib库

前言 在数据科学和数据分析领域&#xff0c;Pandas 和 Matplotlib 是两个最常用的 Python 库。Pandas 主要用于数据处理和分析&#xff0c;而 Matplotlib 则用于数据的可视化。它们的结合能够帮助我们快速、直观地展示数据的趋势和规律。在这篇详细的教程中&#xff0c;教程中将…