javaWeb Router

一、路由简介

1、什么是路由?

-   定义:路由就是根据不同的 URL 地址展示不同的内容或页面。

-   通俗理解:路由就像是一个地图,我们要去不同的地方,需要通过不同的路线进行导航。

2、路由的作用

-   单页应用程序(SPA)中,路由可以实现不同视图之间的无刷新切换,提升用户体验;

-   路由还可以实现页面的认证和权限控制,保护用户的隐私和安全;

-   路由还可以利用浏览器的前进与后退,帮助用户更好地回到之前访问过的页面

二、路由重定向

重定向的作用:将一个路由重定向到另一个路由上

router.js文件:

// 导入路由创建的相关方法

import {createRouter,createWebHashHistory} from 'vue-router'

// 导入vue组件

import Home from '../components/Home.vue'

import List from '../components/List.vue'

import Add from '../components/Add.vue'

import Update from '../components/Update.vue'

// 创建路由对象,声明路由规则

const router = createRouter({

    history: createWebHashHistory(),

    routes:[

        {

            path:'/',

            components:{

                default:Home,

                homeView:Home

            }      

        },

        {

            path:'/list',

            components:{

                listView : List

            }

        },

        {

            path:'/showAll',

            // 重定向

            redirect :'/list'

        },

        {

            path:'/add',

            components:{

                addView:Add

            }

        },

        {

            path:'/update',

            components:{

                updateView:Update

            }  

        },

    ]

})

// 对外暴露路由对象

export default router;

 

+ App.vue

```html

<script setup>

</script>

<template>

    <div>

      <h1>App页面</h1>

      <hr/>

        <!-- 路由的连接 -->

        <router-link to="/">home</router-link> <br>

        <router-link to="/list">list</router-link> <br>

        <router-link to="/showAll">showAll</router-link> <br>

        <router-link to="/add">add</router-link> <br>

        <router-link to="/update">update</router-link> <br>

      <hr/>

      <!-- 路由连接对应视图的展示位置 -->

      <hr>

      默认展示位置:<router-view></router-view>

      <hr>

      Home视图展示:<router-view name="homeView"></router-view>

      <hr>

      List视图展示:<router-view name="listView"></router-view>

      <hr>

      Add视图展示:<router-view name="addView"></router-view>

      <hr>

      Update视图展示:<router-view name="updateView"></router-view>

    </div>

</template>

<style scoped>

</style>

三、编程式路由

普通路由(声明式路由)

`<router-link to="/list">list页</router-link>  `这种路由,to中的内容目前是固定的,点击后只能切换/list对象组件

> 编程式路由

+ 通过useRouter,动态决定向那个组件切换的路由

+ 这里的 `useRouter` 方法返回的是一个 router 对象,你可以用它来做如导航到新页面、返回上一页面等操作。

+ App.vue

``` html

<script setup type="module">

  import {useRouter} from 'vue-router'

  import {ref} from 'vue'

  //创建动态路由对象

  let router = useRouter()

  let  routePath =ref('')

  let  showList= ()=>{

      // 编程式路由

      // 直接push一个路径

      router.push('/list')

      // 或者push一个带有path属性的对象

      //router.push({path:'/list'})

  }

</script>

<template>

    <div>

      <h1>App页面</h1>

      <hr/>

        <!-- 路由的连接 -->

        <router-link to="/">home</router-link> <br>

        <router-link to="/list">list</router-link> <br>

        <router-link to="/showAll">showAll</router-link> <br>

        <router-link to="/add">add</router-link> <br>

        <router-link to="/update">update</router-link> <br>

//以上to后固定了访问路径的都是声明式路由,不能动态修改

        <!-- 动态输入路径,点击按钮,触发单击事件的函数,在函数中通过编程式路由切换页面 -->

        <button @click="showList()">showList</button> <br>

      <hr/>

      <!-- 路由连接对应视图的展示位置 -->

      <hr>

      默认展示位置:<router-view></router-view>

      <hr>

      Home视图展示:<router-view name="homeView"></router-view>

      <hr>

      List视图展示:<router-view name="listView"></router-view>

      <hr>

      Add视图展示:<router-view name="addView"></router-view>

      <hr>

      Update视图展示:<router-view name="updateView"></router-view>

    </div>

</template>

<style scoped>

</style>

四、路由传参

1、路径参数

 在路径中使用一个动态字段来实现,我们称之为路径参数

    + 例如: 查看数据详情  `/showDetail/1`  ,`1`就是要查看详情的id,可以动态添值!

2、键值对参数

类似于get请求通过url传参,数据是键值对形式的

    例如:  查看数据详情`/showDetail?hid=1`,`hid=1`就是要传递的键值对参数

     在 Vue 3 和 Vue Router 4 中,可以使用  `useRoute` 这个函数从 Vue 的组合式 API 中获取路由对象。

    +  `useRoute` 方法返回的是当前的 route 对象,你可以用它来获取关于当前路由的信息,如当前的路径、查询参数等。

对比:useRouter方法返回的是一个router对象,可以用于导航新页面和返回上一个页面。

> 案例需求 : 切换到ShowDetail.vue组件时,向该组件通过路由传递参数

修改App.vue文件

``` html

<script setup type="module">

  import {useRouter} from 'vue-router'

  //创建动态路由对象

  let router = useRouter()

  //动态路由路径传参方法

  let showDetail= (id,language)=>{

      // 尝试使用拼接字符串方式传递路径参数

      //router.push(`showDetail/${id}/${languange}`)

      /*路径参数,需要使用params  */

      router.push({name:"showDetail",params:{id:id,language:language}})

  }

  let showDetail2= (id,language)=>{

      /*uri键值对参数,需要使用query */

      router.push({path:"/showDetail2",query:{id:id,language:language}})

  }

</script>

<template>

    <div>

      <h1>App页面</h1>

      <hr/>

      <!-- 路径参数   -->

      <router-link to="/showDetail/1/JAVA">showDetail路径传参显示JAVA</router-link>

      <button @click="showDetail(1,'JAVA')">showDetail动态路由路径传参显示JAVA</button>

      <hr/>

      <!-- 键值对参数 -->

      <router-link v-bind:to="{path:'/showDetail2',query:{id:1,language:'Java'}}">showDetail2键值对传参显示JAVA</router-link>

      <button @click="showDetail2(1,'JAVA')">showDetail2动态路由键值对传参显示JAVA</button>

      <hr>

      showDetail视图展示:<router-view name="showDetailView"></router-view>

      <hr>

      showDetail2视图展示:<router-view name="showDetailView2"></router-view>

    </div>

</template>

<style scoped>

</style>

```

+ 修改router.js增加路径参数占位符

``` javascript

// 导入路由创建的相关方法

import {createRouter,createWebHashHistory} from 'vue-router'

// 导入vue组件

import ShowDetail from '../components/ShowDetail.vue'

import ShowDetail2 from '../components/ShowDetail2.vue'

// 创建路由对象,声明路由规则

const router = createRouter({

    history: createWebHashHistory(),

    routes:[

       

        {

            /* 此处:id  :language作为路径的占位符 */

            path:'/showDetail/:id/:language',

            /* 动态路由传参时,根据该名字找到该路由 */

            name:'showDetail',

            components:{

                showDetailView:ShowDetail

            }  

        },

        {

            path:'/showDetail2',

            components:{

                showDetailView2:ShowDetail2

            }  

        },

    ]

})

// 对外暴露路由对象

export default router;

 

 

 

+ ShowDetail.vue 通过useRoute获取路径参数

``` html

<script setup type="module">

    import{useRoute} from 'vue-router'

    import { onUpdated,ref } from 'vue';

    // 获取当前的route对象

    let route =useRoute()

    let languageId = ref(0)

    let languageName = ref('')

    //  借助更新时生命周期,将数据更新进入响应式对象

    onUpdated (()=>{

        // 获取对象中的参数

        languageId.value=route.params.id

        languageName.value=route.params.language

        console.log(languageId.value)

        console.log(languageName.value)

    })

   

</script>

<template>

    <div>

        <h1>ShowDetail页面</h1>

        <h3>编号{{route.params.id}}:{{route.params.language}}是世界上最好的语言</h3>

        <h3>编号{{languageId}}:{{languageName}}是世界上最好的语言</h3>

    </div>

</template>

<style scoped>

</style>

```

-   ShowDetail2.vue通过useRoute获取键值对参数

```html

<script setup type="module">

    import{useRoute} from 'vue-router'

    import { onUpdated,ref } from 'vue';

    // 获取当前的route对象

    let route =useRoute()

    let languageId = ref(0)

    let languageName = ref('')

    //  借助更新时生命周期,将数据更新进入响应式对象

    onUpdated (()=>{

        // 获取对象中的参数(通过query获取参数,此时参数是key-value形式的)

        console.log(route.query)

        console.log(languageId.value)

        console.log(languageName.value)

        languageId.value=route.query.id

        languageName.value=route.query.language

       

    })

   

</script>

<template>

    <div>

        <h1>ShowDetail2页面</h1>

        <h3>编号{{route.query.id}}:{{route.query.language}}是世界上最好的语言</h3>

        <h3>编号{{languageId}}:{{languageName}}是世界上最好的语言</h3>

    </div>

</template>

<style scoped>

</style>

五、路由守卫

在 Vue 3 中,路由守卫是用于在路由切换期间进行一些特定任务的回调函数。路由守卫可以用于许多任务,例如验证用户是否已登录、在路由切换前提供确认提示、请求数据等。Vue 3 为路由守卫提供了全面的支持,并提供了以下几种类型的路由守卫:

1.  全局前置守卫:在路由切换前被调用,可以用于验证用户是否已登录、中断导航、请求数据等。

2.  全局后置守卫:在路由切换之后被调用,可以用于处理数据、操作 DOM 、记录日志等。

3.  守卫代码的位置: 在router.js中

//全局前置路由守卫

router.beforeEach( (to,from,next) => {

    //to 是目标地包装对象  .path属性可以获取地址

    //from 是来源地包装对象 .path属性可以获取地址

      next是方法,不调用默认拦截! next() 放行,直接到达目标组件

    next('/地址')可以转发到其他地址,到达目标组件前会再次经过前置路由守卫

    console.log(to.path,from.path,next)

    //需要判断,注意避免无限重定向,所以一般需要写在分支条件下。

    if(to.path == '/index'){

        next()

    }else{

        next('/index')

    }

   

} )

//全局后置路由守卫

router.afterEach((to, from) => {

    console.log(`Navigate from ${from.path} to ${to.path}`);

});

> 登录案例,登录以后才可以进入home,否则必须进入login

+ 定义Login.vue

```html

<script setup>

    import {ref} from 'vue'

    import {useRouter} from 'vue-router'

    let username =ref('')

    let password =ref('')

    let router = useRouter();

    let login = () =>{

        console.log(username.value,password.value)

        if(username.value == 'root' & password.value == '123456'){

            router.push({path:'/home',query:{'username':username.value}})

            //登录成功利用前端存储机制,存储账号!

            localStorage.setItem('username',username.value)

            //sessionStorage.setItem('username',username)

        }else{

            alert('登录失败,账号或者密码错误!');

        }

    }

</script>

<template>

   

    <div>

        账号: <input type="text" v-model="username" placeholder="请输入账号!"><br>

        密码: <input type="password" v-model="password" placeholder="请输入密码!"><br>

        <button @click="login()">登录</button>

    </div>

</template>

<style scoped>

</style>

```

+ 定义Home.vue

```html

<script setup>

 import {ref} from 'vue'

 import {useRoute,useRouter} from 'vue-router'

 let route =useRoute()

 let router = useRouter()

 //  并不是每次进入home页时,都有用户名参数传入

 //let username = route.query.username

 let username =window.localStorage.getItem('username');

 let logout= ()=>{

    // 清除localStorge中的username

    //window.sessionStorage.removeItem('username')

    window.localStorage.removeItem('username')

    // 动态路由到登录页

    router.push("/login")

 }

</script>

<template>

    <div>

        <h1>Home页面</h1>

        <h3>欢迎{{username}}登录</h3>

        <button @click="logout">退出登录</button>

    </div>

</template>

<style scoped>

</style>

```

+ App.vue

```html

<script setup type="module">

 

</script>

<template>

    <div>

     

      <router-view></router-view>

     

    </div>

</template>

<style scoped>

</style>

```

+ 定义routers.js

``` javascript

// 导入路由创建的相关方法

import {createRouter,createWebHashHistory} from 'vue-router'

// 导入vue组件

import Home from '../components/Home.vue'

import Login from '../components/login.vue'

// 创建路由对象,声明路由规则

const router = createRouter({

    history: createWebHashHistory(),

    routes:[

        {

            path:'/home',

            component:Home

        },

        {

            path:'/',

            redirect:"/home"

        },

        {

            path:'/login',

            component:Login

        },

    ]

})

// 设置路由的全局前置守卫

router.beforeEach((to,from,next)=>{

    /*

    to 要去那

    from 从哪里来

    next 放行路由时需要调用的方法,不调用则不放行

    */

    console.log(`从哪里来:${from.path},到哪里去:${to.path}`)

    if(to.path == '/login'){

        //放行路由  注意放行不要形成循环  

        next()

    }else{

        //let username =window.sessionStorage.getItem('username');

        let username =window.localStorage.getItem('username');

        if(null != username){

            next()

        }else{

            next('/login')

        }

    }

})

// 设置路由的全局后置守卫

router.afterEach((to,from)=>{

    console.log(`从哪里来:${from.path},到哪里去:${to.path}`)

})

// 对外暴露路由对象

export default router;

```

+ 启动测试

```shell

npm run dev

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

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

相关文章

二层综合实验

拓扑图 实验要求 1.内网IP地址使用172.16.6.0/16分配 2.sw1和sW2之间互为备份 3.VRRP/STP/VLAN/Eth-trunk均使用 4.所有Pc均通过DHCP获取IP地址 5.ISP只能配置IP地址 6.所有电脑可以正常访问IsP路由器环回 实验思路 这是一个二层综合实验每当拿到一个实验看清楚要求之后都有…

PS 切割图片

选择矩形工具绘制矩形 选中全部矩形&#xff0c;旋转一下角度 鼠标选中最下面的黄色图片&#xff0c;按住 Ctrl 键&#xff0c; 再用鼠标点击矩形的缩略图&#xff0c;选中选区&#xff0c;再按下 ctrlj &#xff0c;复制选区。 同样操作弄好其他的矩形选区&#xff0c;再删除…

项目管理证书 PMP 的含金量高吗?

一、国内PMP的含金量 1. 行业认可度 高需求行业&#xff1a;IT、通信、建筑、制造、金融等行业对PMP认可度较高&#xff0c;尤其是跨国企业、大型国企&#xff08;如华为、阿里、腾讯、中建等&#xff09;常将PMP作为项目经理岗位的优先录用条件。 招聘门槛&#xff1a;部分企…

旅游CMS选型:WordPress、Joomla与Drupal对比

内容概要 在旅游行业数字化转型进程中&#xff0c;内容管理系统&#xff08;CMS&#xff09;的选择直接影响网站运营效率与用户体验。WordPress、Joomla和Drupal作为全球主流的开源CMS平台&#xff0c;其功能特性与行业适配性存在显著差异。本文将从旅游企业核心需求出发&…

LeetCode349两个数组的交集

思路&#xff1a; 这个题目是查找交集&#xff0c;考虑用哈希数组&#xff0c;c语言用数组建立哈希表来解题&#xff0c;题目限定了数组长度在1000以内&#xff0c;那么可以设定一个result数组用于存储交集 1.我们需要将nums1映射到哈希表中 2.遍历nums2查询哈希表中是否存在该…

安装教程:windows上安装oracle详细教程

文章目录 前言一、下载 Oracle 安装包二、安装步骤三、连接ORACLE可视化工具1.1 PL/SQL Developer1.2 navicat 结束语优质源码分享 windows上安装oracle详细教程&#xff0c;在Windows上安装Oracle数据库需遵循以下步骤&#xff1a;首先&#xff0c;从官网下载对应版本的Oracle…

4、网工软考—VLAN配置—hybird配置

1、实验环境搭建&#xff1a; 2、实验过程 SW1&#xff1a; 先创建vlan2和vlan3 [Huawei-Ethernet0/0/2]port link-type hybrid //hybird端口 [Huawei-Ethernet0/0/2]port hybrid pvid vlan 2 [Huawei-Ethernet0/0/2]port hybrid untagged vlan 10 //撕掉vlan10的标签 …

平台清洗行动:AI浏览器用户生存率高出传统方案17倍

平台清洗行动&#xff1a;AI 浏览器用户生存率高出传统方案 17 倍 在这个数字化时代&#xff0c;网络环境的复杂性不断增加&#xff0c;用户在浏览网页时面临着各种风险&#xff0c;包括恶意软件、钓鱼攻击和隐私泄露等。为了应对这些挑战&#xff0c;AI 浏览器应运而生&#…

【C++篇】C++入门基础(一)

&#x1f4ac; 欢迎讨论&#xff1a;在阅读过程中有任何疑问&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;如果你觉得这篇文章对你有帮助&#xff0c;记得点赞、收藏&#xff0c;并分享给更多对C感兴趣的…

MaskFormer语义分割算法测试

MaskFormer是一套基于transformer结构的语义分割代码。 链接地址&#xff1a; https://github.com/facebookresearch/MaskFormer/tree/main 测试用的数据集&#xff1a;ADE20k Dataset MIT Scene Parsing Benchmark 该数据集可通过上述链接下载&#xff0c;其中training含有…

javaWeb vue的简单语法

一、简介 两大核心优势&#xff1a; 声明式渲染&#xff1a;Vue 基于标准 HTML 拓展了一套模板语法&#xff0c;使得我们可以声明式地描述最终输出的 HTML 和 JavaScript 状态之间的关系。 响应性&#xff1a;Vue 会自动跟踪 JavaScript 状态并在其发生变化时响应式地更新 D…

vue create创建 Vue-router 工程

vue create创建 Vue-router 工程 参考 创建vue项目的两种方式&#xff1a;vue-create与vite https://www.cnblogs.com/reverse-x/p/16806534.html Vue2 脚手架 创建工程 测试程序 https://blog.csdn.net/wowocpp/article/details/146590400 在 上面的基础上 cd .\vue2-demo\…

CXL UIO Direct P2P学习

前言&#xff1a; 在CXL协议中&#xff0c;UIO&#xff08;Unordered Input/Output&#xff09; 是一种支持设备间直接通信&#xff08;Peer-to-Peer, P2P&#xff09;的机制&#xff0c;旨在绕过主机CPU或内存的干预&#xff0c;降低延迟并提升效率。以下是UIO的核心概念及UI…

口腔种植全流程AI导航系统及辅助诊疗与耗材智能化编程分析

一、系统架构与编程框架设计 口腔种植全流程人工智能导航系统的开发是一项高度复杂的多学科融合工程,其核心架构需在医学精准性、工程实时性与临床实用性之间实现平衡。系统设计以模块化分层架构为基础,结合高实时性数据流与多模态协同控制理念,覆盖从数据采集、智能决策到…

李宏毅机器学习笔记(1)—机器学习基本概念+深度学习基本概念

机器学习基本概念 1、获取模型 步骤 1.1、假定未知函数 带未知参数的函数 1.2、定义损失函数 真实值&#xff1a;label MAE MSE 几率分布&#xff0c;cross-entropy? 1.3、优化 单独考虑一个参数 让损失函数最小&#xff0c;找导数为零的点 单独考虑w&#xff0c;w…

专注自习室:番茄工作法实践

专注自习室&#xff1a;番茄工作法实践 我需要一个任务管理工具&#xff0c;但在网上找了很多都找不到合适的工具。市面上的大多数产品过于强调任务完成性&#xff0c;给我带来了很强的心理压力&#xff0c;这种压力最终反而降低了我的工作效率。于是我决定自己动手&#xff0…

【银河麒麟高级服务器操作系统 】虚拟机运行数据库存储异常现象分析及处理全流程

更多银河麒麟操作系统产品及技术讨论&#xff0c;欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer…

阿里云数据学习20250327

课堂链接&#xff1a;阿里云培训中心 (aliyun.com) 一、课堂问题 (一)课时3 1.支持字符集的含义是什么

使用QuickReporter将多张图片插入在word多行的表格中

之前有一位QuickReporter的用户提到过一个需求。他有大量的图片需要插入在word里面&#xff0c;他的想法是将图片放在一个文件夹内&#xff0c;按编号1,2,3,...编号&#xff0c;然后自动将这些图片从前到后插入到表格中。 这次偶然发现了该需求是可以实现的&#xff0c;且在当…

【大模型】激活函数之SwiGLU详解

文章目录 1. Swish基本定义主要特点代码实现 2. GLU (Gated Linear Unit)基本定义主要特点代码实现 3. SwiGLU基本定义主要特点代码实现 参考资料 SWiGLU是大模型常用的激活函数&#xff0c;是2020年谷歌提出的激活函数&#xff0c;它结合了Swish和GLU两者的特点。SwiGLU激活函…