Vue3---基础10(路由)

写一个最基本的路由导航

下载、创建、使用路由

下载路由

npm i vue-router

创建路由

        先在 src 内去创建一个 router 文件夹

        在文件夹内创建一个 index 文件

        

        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'
import Mine from '@/components/Mine.vue'

// 创建路由器
const router = createRouter({
    history:createWebHistory(),
    routes: [
        {
            path:'/home',
            component:Home
        },
        {
            path:'/news',
            component:News
        },
        {
            path:'/about',
            component:About
        },
        {
            path:'/mine',
            component:Mine
        },

    ]
})

// 暴露 router 出去
export default router

使用路由

        在 mian.ts 文件内,去引入、注册路由

        mian.ts 代码

// 引入createApp用于创建应用
import { createApp } from 'vue'
// 引入App根组件
import App from './App.vue'
// 引入Router路由器
import router from './router'

// 创建一个应用
const app = createApp(App)
// 使用路由器
app.use(router)
// 挂载整个应用到容器中
app.mount('#app')

实现导航切换

        示例:

        在App.vue文件内,引入 RouterView, RouterLink 实现 路由跳转

        App.vue 代码

<template>
    <div class="app">
        <!-- 导航区 -->
        <div class="nav">
            <RouterLink to="/home" active-class="active">首页</RouterLink>
            <RouterLink to="/mine" active-class="active">我的</RouterLink>
        </div>
        <!-- 展示区 -->
        <div class="main">
            <RouterView></RouterView>
        </div>
    </div>
</template>

<script lang="ts" setup namae="App">
    import { RouterView, RouterLink } from 'vue-router'

</script>

        使用 RouterLink 标签去包裹要跳转的路径,类似于 a标签

        使用 to 去填写要跳转的具体路径                类似于 href=“”

        使用 RouterView ,让页面中展示跳转的内容

        active-class 是当前所在路由的css样式,类似于 active

        

注意的点

        1. 路由组件通常放在 pages 或 views 文件夹,一般组件通常放在 component 文件夹内

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

路由器工作模式

1. history 模式

        Vue2:        mode:'history'

        Vue3:        history:createWebHistory()

        React:       BrowserRouter

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

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

const router = createRouter({
    history:createWebHistory(),
    /******/
})

2. hash 模式

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

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

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

 to的两种写法

        第一种:字符串写法

        第二种:对象写法

// 第一种
<RouterLink to="/home" active-class="active">首页</RouterLink>
// 第二种    可以用path 也可以用name
<RouterLink :to="{path:'/home'}" active-class="active">首页</RouterLink>
<RouterLink :to="{name:'/shouye'}" active-class="active">首页</RouterLink>

嵌套路由

        就是在第一层路由的基础上加上它的子路由

        示例代码:

{
    name:'myNews',
    path:'/news',
    component:News,
    children:[
        {
            path:'detail',
            component:newsDetail,
        }
    ]
},

注意:children 内的 path 路径不需要带 '/'

路由传参

query传参

示例代码:

第一种方式

                父组件

<template>
  <div class="person">
    <!-- 导航区 -->
    <ul>
      <li v-for="item in newsList" :key="item.id">
        <!-- 第一种写法 -->
        <RouterLink active-class="active" :to=" `/news/detail?id=${item.id}&title=${item.title}&content=${item.content}`">{{ item.title }}</RouterLink> 
      </li>
    </ul>
    <!-- 展示区 -->
    <div class="news-content">
      <RouterView></RouterView>
    </div>
</div>
</template> 

<script lang="ts" setup name="news">
import { reactive } from 'vue'
import { RouterView,RouterLink } from 'vue-router'

let newsList = reactive([
  {id: '001', title: '歌手张杰在武汉连开三场演唱会!', content:'近日,歌手张杰将在武汉连开三场演唱会!'},
  {id: '002', title: '此为第二个新闻', content:'2222222222'},
  {id: '003', title: '此为第三个新闻', content:'3333333333'},
  {id: '004', title: '此为第四个新闻', content:'4444444444'},
])
</script>

                子组件

<script setup lang="ts">
  import { toRefs } from 'vue';
  import { useRoute } from 'vue-router'
  let route = useRoute()
  let { query } = toRefs(route)
</script>

<template>
  <ul class="news-list">
    <li>编号:{{ query.id }}</li>
    <li>标题:{{ query.title }}</li>
    <li>内容:{{ query.content }}</li>
  </ul>

</template>

第二种方式

                父组件

<template>
  <div class="person">
    <!-- 导航区 -->
    <ul>
      <li v-for="item in newsList" :key="item.id">
        <!-- 第二种写法 -->
        <RouterLink 
          :to="{
            path:'newsDetail',
            query: {
              id:item.id,
              title:item.title,
              content:item.content,
            }
          }">
        </RouterLink>
      </li>
    </ul>
    <!-- 展示区 -->
    <div class="news-content">
      <RouterView></RouterView>
    </div>
</div>
</template> 

<script lang="ts" setup name="news">
import { reactive } from 'vue'
import { RouterView,RouterLink } from 'vue-router'

let newsList = reactive([
  {id: '001', title: '歌手张杰在武汉连开三场演唱会!', content:'近日,歌手张杰将在武汉连开三场演唱会!'},
  {id: '002', title: '此为第二个新闻', content:'2222222222'},
  {id: '003', title: '此为第三个新闻', content:'3333333333'},
  {id: '004', title: '此为第四个新闻', content:'4444444444'},
])
</script>

        子组件

<script setup lang="ts">
  import { toRefs } from 'vue';
  import { useRoute } from 'vue-router'
  let route = useRoute()
  let { query } = toRefs(route)
  console.log('route', route);

</script>

<template>
  <ul class="news-list">
    <li>编号:{{ query.id }}</li>
    <li>标题:{{ query.title }}</li>
    <li>内容:{{ query.content }}</li>
  </ul>

</template>

        两种方式区别就是 前面讲到的 to的两种写法

第一种:是通过  ··  和 ? 去拼接字符串的,在路径后接上?去传递值

第二种:是通过  query 传递值

params传参

注意:

        使用 params 传参时,需要提前在规则中去占位     

        如果某个参数是不一定要传的,可以在规则中形参名后面加上 ? 表示非必传 

第一种

        父组件

<template>
  <div class="person">
    <!-- 导航区 -->
    <ul>
      <li v-for="item in newsList" :key="item.id">
        <!-- 第一种写法 -->
        <RouterLink active-class="active" :to=" `/news/detail/${item.id}/${item.title}/${item.content}`">{{ item.title }}</RouterLink>
      </li>
    </ul>
    <!-- 展示区 -->
    <div class="news-content">
      <RouterView></RouterView>
    </div>
</div>
</template> 

<script lang="ts" setup name="news">
import { reactive } from 'vue'
import { RouterView,RouterLink } from 'vue-router'

let newsList = reactive([
  {id: '001', title: '歌手张杰在武汉连开三场演唱会!', content:'近日,歌手张杰将在武汉连开三场演唱会!'},
  {id: '002', title: '此为第二个新闻', content:'2222222222'},
  {id: '003', title: '此为第三个新闻', content:'3333333333'},
  {id: '004', title: '此为第四个新闻', content:'4444444444'},
])
</script>

        子组件

<template>
  <ul class="news-list">
    <li>编号:{{ params.id }}</li>
    <li>标题:{{ params.title }}</li>
    <li>内容:{{ params.content }}</li>
  </ul>

</template>

<script setup lang="ts">
  import { toRefs } from 'vue';
  import { useRoute } from 'vue-router'
  let route = useRoute()
  let { params } = toRefs(route)
  console.log('route', route);

</script>

        router文件

// 创建路由器
const router = createRouter({
    history:createWebHistory(),
    routes: [
        ...
        {
            name:'myNews',
            path:'/news',
            component:News,
            children:[
                {
                    name: 'newsDetail',
                    path:'detail/:id/:title/:content',
                    component:newsDetail,
                }
            ]
        },
        ...
    ]
})

        使用字符串去跳转时,参数与参数之间是用  /  分割的

        

第二种

        父组件

<template>
  <div class="person">
    <!-- 导航区 -->
    <ul>
      <li v-for="item in newsList" :key="item.id">
        <!-- 第二种写法 -->
        <RouterLink 
          :to="{
            name:'newsDetail',
            params: {
              id:item.id,
              title:item.title,
              content:item.content,
            }
          }">
        </RouterLink>
      </li>
    </ul>
    <!-- 展示区 -->
    <div class="news-content">
      <RouterView></RouterView>
    </div>
</div>
</template> 

<script lang="ts" setup name="news">
import { reactive } from 'vue'
import { RouterView,RouterLink } from 'vue-router'

let newsList = reactive([
  {id: '001', title: '歌手张杰在武汉连开三场演唱会!', content:'近日,歌手张杰将在武汉连开三场演唱会!'},
  {id: '002', title: '此为第二个新闻', content:'2222222222'},
  {id: '003', title: '此为第三个新闻', content:'3333333333'},
  {id: '004', title: '此为第四个新闻', content:'4444444444'},
])
</script>

        params 传参时, to选择用对象写法,就要用name配置项,不能用 path ,不然会报错

props配置

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

router文件内代码:

// 创建路由器
const router = createRouter({
    history:createWebHistory(),
    routes: [
        ...
        {
            name:'myNews',
            path:'/news',
            component:News,
            children:[
                {
                    name: 'newsDetail',
                    path:'detail/:id/:title/:content',
                    component:newsDetail,
                    
                    // 第一种写法,将路由收到的所有 params 参数作为props传给路由组件
                    // props:true

                    // 第二种写法,函数写法,可以自己决定将什么作为 props 给路由组件
                    props(route) {
                        return route.query
                    }

                    // 第三种写法,对象写法,可以自己决定将什么作为 props 给路由组件
                    // props:{
                    //     id: 123,
                    //     title: 'props',
                    //     content: '内容~'
                    // }
                
                }
            ]
        },
        ...
    ]
})

组件内代码

<template>
  <ul class="news-list">
    <li>编号:{{ id }}</li>
    <li>标题:{{ title }}</li>
    <li>内容:{{ content }}</li>
  </ul>

</template>

<script setup lang="ts">
  import { defineProps } from 'vue';
  defineProps(['id', 'title', 'content'])

</script>

props配置有三种

第一种是  props:true,这种是只能传 params的值

第二种是函数写法,可以传递 params 也可以传递 query的值

第三种是对象写法,值只能写固定的,很少用

在组件内用 defineProps 属性,去接收值

格式:defineProps(['id', 'title', 'content'])

可以直接在模版内去使用 id  title等

replace属性

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

2. 浏览器的历史记录有两张写入方式:分别为 push 和 replace

        push 是追加历史记录(默认值)

        replace 是替换当前记录

3. 开启 replace 模式

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

        使用此属性可以覆盖记录,无法回跳

编程式导航

        脱离 <RouterLink>实现路由跳转

实现简单的跳转

<script lang="ts" setup name="home">
import { onMounted } from 'vue'
import { useRouter } from 'vue-router'

const router = useRouter()

onMounted(()=>{
    setTimeout(() => {
        router.push('/news')
    },2000)
})
</script>

        引入 useRouter,然后用常量接收,最后  .push 去跳转

携带参数跳转

<script lang="ts" setup name="news">
import { reactive } from 'vue'
import { RouterView,RouterLink, useRouter } from 'vue-router'

const router = useRouter()

interface NewsInter {
  id: string,
  title: string,
  content: string,
}

function showNewsDetail(item:NewsInter) {
  router.push({
    name:'newsDetail',
    params: {
      id:item.id,
      title:item.title,
      content:item.content,
    }
  })
}

</script>

路由重定向

实现原理:在路由文件,一级路由后加上重定向代码。如下 

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

就能实现 进入页面就能重定向到 home 页

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS使用自己的字体

在项目的根目录下的static文件夹中放置字体文件。在项目中使用这个字体&#xff0c;需要2个步骤。 一. 你需要在全局样式文件中引入它。 假设你的全局样式文件是App.vue或者App.vue中引入的App.scss文件&#xff0c;你可以像这样引入字体文件&#xff1a; font-face {font-fa…

深度学习体系结构——CNN, RNN, GAN, Transformers, Encoder-Decoder Architectures算法原理与应用

1. 卷积神经网络 卷积神经网络&#xff08;CNN&#xff09;是一种特别适用于处理具有网格结构的数据&#xff0c;如图像和视频的人工神经网络。可以将其视作一个由多层过滤器构成的系统&#xff0c;这些过滤器能够处理图像并从中提取出有助于进行预测的有意义特征。 设想你手…

MySQL中的存储过程详解(上篇)

使用语言 MySQL 使用工具 Navicat Premium 16 代码能力快速提升小方法&#xff0c;看完代码自己敲一遍&#xff0c;十分有用 拖动表名到查询文件中就可以直接把名字拉进来中括号&#xff0c;就代表可写可不写 目录 1.认识存储过程 1.1 存储过程的作用 1.2 存储过程简介…

C#基础|数据类型、变量

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 01 数据类型 数据类型是为了方便存储数据的&#xff0c;为了将数据按照不同的分类存储&#xff0c;所以引入数据类型。这个在PLC中已经很熟悉了。 数据类型的作用&#xff1a;就是为了更好地管理内存&#xff0c;为…

顺序表 (头删 尾删 清空)

//头删 | 1 #include "head.h" | 1 #ifndef ww87 void head_del(p lp) | 2 int main(int argc, const char *argv[]) …

[C++][算法基础]求最小生成树(Kruskal)

给定一个 n 个点 m 条边的无向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。 求最小生成树的树边权重之和&#xff0c;如果最小生成树不存在则输出 impossible。 给定一张边带权的无向图 G(V,E)&#xff0c;其中 V 表示图中点的集合&#xff0c;E 表示图…

民航电子数据库:[E14024]事务内变更操作次数超过最大许可值10000,可通过系统参数max_trans_modify适当调整限制

目录 一、场景二、异常情况三、原因四、排查五、解决 一、场景 1、对接民航电子数据 2、执行delete语句时报错 二、异常情况 三、原因 通过报错信息就可以看出&#xff0c;是系统参数max_trans_modify配置导致 当删除的数据量 > max_trans_modify时&#xff0c;删除就会…

Visual studio项目默认“Header Files”、“Source Files”等过滤器消失后展开的方法。

使用Visual Studio进行项目开发创建默认工程的解决方案资源管理器里查看项目文件&#xff0c;所有的文件是按照其所属的类型自动归类&#xff0c;例如&#xff1a;.h头文件自动划归到Header Files文件夹&#xff0c;.cpp文件自动划归到Source Files文件夹下&#xff0c;如下图所…

关于AG32 MCU的一些奇思妙想

1、AG32VF103的网口是100M还是10M&#xff1f; RE: 都是100M的。 2、用FPGA能不能再仿出一个网口&#xff1f;有些产品用到两个网口。 理论上可以&#xff0c;但是要考虑&#xff0c;一个是cpld实现难度&#xff0c;一个是需要的逻辑单元。因为mac逻辑多&#xff0c;内置的2KL…

Python Flask Web 框架-API接口开发_4

一、1、安装 Falsk 当前用户安装 pip3 install --user Flask 确认安装成功&#xff1a; 进入python交互模式看下Flask的介绍和版本&#xff1a; $ python3>>> import flask >>> print(flask.__doc__)flask~~~~~A microframework based on Werkzeug. Its …

快速掌握Spring监控(Spring Boot admin)

监控 监控可视化监控平台Admin底层逻辑info 自定义端点 监控 监控的作用&#xff1a; 监控服务状态是否宕机监控服务运行指标&#xff08;内存&#xff0c;虚拟机&#xff0c;线程&#xff0c;请求等&#xff09;监控日志管理服务&#xff08;服务下线&#xff09; 监控的实…

linux进阶篇:使用Apache搭建文件服务器目录

Linux服务搭建篇&#xff1a;使用Apache搭建文件服务器目录 一、关于文件服务器 ​ 在一个项目中&#xff0c;如果想把公共软件或者资料共享给项目组成员&#xff0c;可以搭建一个简易的文件服务器来实现&#xff0c;只要是在局域网内的成员都可以通过浏览器或者wget命令来下…

书生·浦语大模型全链路开源体系-第5课

书生浦语大模型全链路开源体系-第5课 书生浦语大模型全链路开源体系-第5课相关资源LMDeploy基础配置LMDeploy运行环境下载internlm2-chat-1_8b模型使用Transformer来直接运行InternLM2-Chat-1.8B模型使用LMDeploy以命令行方式与InternLM2-Chat-1.8B模型对话设置KV Cache最大占用…

wps使用Latex编辑公式没有Latex formula

wps使用Latex编辑公式没有Latex formula 1. 下载CTEX2. 下载LaTeXEE3. 配置Miktex4. 配置latexee5. 用管理员权限运行latexeqedit.exe6. wps插入latex公式 1. 下载CTEX 下载CTEX网址&#xff0c;我下载的下图这个&#xff0c;下载完了之后运行exe文件安装ctex。 2. 下载LaTe…

视频国标学习

总体介绍 GB/T28181协议&#xff0c;全名叫《安全防范视频监控联网系统信息传输、交换、控制技术要求》&#xff0c;是由中国国家标准委员会发布的一种国家级的标准。它主要对视频监控系统的各个方面做了明确的规定&#xff0c;使得不同厂商生产的视频监控设备能够相互连通&am…

【C++】<入门>C++入门基础知识

C入门 1. 入门0. 本节知识点熟悉目的1. C关键字&#xff08;C98&#xff09; 2. 命名空间2.1 命名空间定义2.2 命名空间使用 3. C输入&输出4. 缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.1 函数重载概念5.2 C支持函数重载的原理--名字修饰&#xff08;name Ma…

IntelliJ IDEA 2023中文--让编程更高效、更智能

IntelliJ IDEA 2023是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为Java开发者打造。它以其智能、高效和人性化的特点&#xff0c;帮助开发者更快、更好地编写代码。IntelliJ IDEA 2023支持多种语言和框架&#xff0c;包括Java、Kotlin、Spring等&am…

SpringCloud之LoadBalancer负载均衡器的简单使用

SpringCloud之LoadBalancer负载均衡器的简单使用 loadbalancer用于对提供服务的集群做一个节点的选取规则。 如图所示&#xff0c;load balancer集成在调用方 示例 创建loadbalance-base模块,并引入相关依赖 <dependencies><dependency><groupId>org.spr…

Unity笔记之下拉刷新列表

这样的效果&#xff1b; 代码&#xff1a; using System; using System.Collections; using System.Collections.Generic; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public class ScrollRectUpdateView : Mon…

解锁创意无限,体验全新Adobe Illustrator 2021 for mac/Win中文版

在数字化创意的浪潮中&#xff0c;Adobe Illustrator 2021中文版无疑是设计师们的得力助手。这款软件集高效、便捷、创新于一体&#xff0c;无论是Mac还是Windows用户&#xff0c;都能在其中找到属于自己的创意空间。 Adobe Illustrator 2021中文版延续了其强大的矢量图形处理…