jjzjj

【vue2】对路由的理解

初映CY的前说 2024-04-19 原文

🥳博       主:初映CY的前说(前端领域)

🌞个人信条:想要变成得到,中间还有做到!

🤘本文核心:vue路由概念、路由写法、路由模式、路由重定向、路由跳转传参方式 

目录

 一、vue路由概念

1.概念:

2.初体验:

二、路由基础

1.路由模式        

2.路由写法

总结手动自动配置区别:

三、路由重定向与二级路

1.路由重定向

2.二级路由

 四、路由跳转传参

1.声明式导航:

2.编程式导航


 一、vue路由概念

1.概念:

确保我们在vue中实现页面跳转到我们所想的页面

2.初体验:

 可以看到当我们点击不同的组件的时候我们实现了路由的功能:在vue中实现页面的跳转

注意看,当我点击的时候上面地址栏中加载了不同的网页。下面我们来学习下路由的写法

二、路由基础

1.路由模式

路由两种模式

路由书写写法:

在index.js中的router对象中书写

const router = new VueRouter({
  mode: 'history',//默认是hash模式
})

hash模式:

路由例如: http://localhost:8080/#/home

history模式:

路由例如: http://localhost:8080/home


两种模式的区别:

  1. 外观:hash的url有个#符号,history没有,history外观更好看。
  2. 刷新:hash刷新会加载到地址栏对应的页面,history刷新浏览器会重新发起请求,如果服务端没有匹配当前的url,就会出现404页面。
  3. history模式以后上线需要服务器端支持, 否则找的是文件夹

 2.路由写法

 起步 | Vue RouterVue Router3官网介绍: 起步 | Vue Router

①手动配置(较少使用)

  1. 下载与导入vue-router
  2. 导入组件
  3. 创建routes路由规则(路径和页面一一对应)
  4. 创建路由对象
  5. 把路由对象挂载到App.vue
  6. 在页面写路由导航router-link (生成a标签)
  7. 在页面写路由出口router-view (生成占位盒子,用于显示页面内容)

下面开始我们相关文件的创建

1.创建我们的脚手架(此时没有选择Router):

 2.准备我们的App.vue文件:

<template>
  <div>
    <!-- 顶部导航栏 -->
    <div class="footer_wrap">
      <a href="#/find">发现音乐</a>
      <a href="#/my">我的音乐</a>
      <a href="#/friend">朋友</a>
    </div>
    <!-- 下面内容 -->
    <div class="top"></div>
  </div>
</template>

<script>
export default {
  methods: {}
}
</script>

<style scoped>
body,
html {
  margin: 0;
  padding: 0;
}
.footer_wrap {
  position: fixed;
  left: 0;
  top: 0;
  display: flex;
  width: 100%;
  text-align: center;
  background-color: #333;
  color: #ccc;
}
.footer_wrap a,
span {
  cursor: pointer;
  flex: 1;
  text-decoration: none;
  padding: 20px 0;
  line-height: 20px;
  background-color: #333;
  color: #ccc;
  border: 1px solid black;
}
.footer_wrap a:hover,
span:hover {
  background-color: #555;
}

.top {
  padding-top: 62px;
}

.footer_wrap .router-link-active {
  background-color: #000;
}
</style>

3.在src下面新建views文件夹并创建我们需要的.vue文件

3.1 find.vue

<template>
  <div>
    <div class="nav_main">
      <router-link to="/Ranking">排行</router-link>
      <router-link to="/Recommend">推荐</router-link>
      <router-link to="/SongList">歌单</router-link>
    </div>

    <div style="1px solid red;">
  <router-view></router-view>
    </div>
  </div>
</template>

<script>
export default {
  name: 'find',
}
</script>

<style scoped>
.nav_main {
  background-color: red;
  color: white;
  padding: 10px 0;
}
.nav_main a {
  text-align: center;
  text-decoration: none;
  color: white;
  font-size: 12px;
  margin: 7px 17px 0;
  padding: 0px 15px 2px 15px;
  height: 20px;
  display: inline-block;
  line-height: 20px;
  border-radius: 20px;
}
.nav_main a:hover {
  background-color: brown;
}
.nav_main .router-link-active{
  background-color: brown;
}
</style>

 3.2 my.vue

<template>
  <div>
    <img src="../assets/my.png" alt="" width="100%">
  </div>
</template>

<script>
export default {
  name: 'my',
};
</script>

<style scoped>

</style>

3.3 friend.vue

<template>
  <div>
    <ul>
      <li>这是当前页面 query 接收到的参数: 
        <span>姓名:{{ $route.query.name }}</span>  --
        <span>年龄:{{$route.query.age}}</span>  
       </li>
      <li>这是当前页面 params 接收到的参数: 
        <!-- <span>姓名:{{ $route.params.name }}</span> -- 
        <span>年龄:{{ $route.params.age }}</span>   -->
       </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'friend',
};
</script>

<style  scoped>

</style>

3.4 notfound.vue

<template>
  <div class="box">
    <h1>这是一个 404 页面</h1>
    <img src="../assets/404.png" alt="">
  </div>
</template>

<script>
export default {
  name: 'notfound',
  data() {
    return {
  
    };
  },

};
</script>

<style scoped>
.box {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}
</style>

 4.准备图片素材(所有素材可私信博主获取)

 5.所有准备工作做完现在开始我们的文件配置

 1.下载与导入vue-router

  • npm i vue-router@3.6.5

  • 导入vue-router (在router/index.js中)

//index.js中导入
// 0.导入路由
import VueRouter from 'vue-router'
// 使用vue的插件,都需要调用Vue.use()
Vue.use(VueRouter)

2.导入组件

@符号代表 /src 文件夹的绝对路径,在脚手架中文件比较多的时候,使用这个@符号会更加的方便

 在router/index.js中导入

// 导入组件
import find from '@/views/find.vue'
import friend from '@/views/friend.vue'
import my from '@/views/my.vue'
import notfound from '@/views/notfound.vue'

3.创建路由规则

路由规则作用: 设置 url 和 组件 对应的规则

 在index.js中写入

// 路由规则
const routes = [
  { path: '/find', component: find },
  { path: '/friend', name: 'friend', component: friend },
  { path: '/my', component: my },
  { path: '/notfound', component: notfound },
]

4.创建路由对象

路由对象: 帮你管理这些路由规则

 在index.js中写入

// 创建路由对象
const router = new VueRouter({
  routes// (缩写) 相当于 routes: routes
})

 5.挂载路由到根组件

挂载到根组件作用:让你的整个应用都有路由功能

 在main.js中写入

// 挂载路由到根组件
new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

6.在页面写路由导航router-link

作用与a标签一样实现跳转,好处:当点击链接的时候自带一个专属类名 

在App.vue中我们将传统的a标签进行替换:

替换a标签原因:便于我们做专属效果 

 我们选中点击的超链接做触发效果:

 7在页面写路由出口router-view

占位盒子,用于渲染路由匹配到的组件

(<router-view> : 是vue内置的一个组件,会自动替换成路由匹配的组件 )

好了一个最最最基本的路由就被我们制作完成啦!下面我们来看看效果:

上述的操作有些许麻烦,下面我们来使用我们开发中常用的自动配置方法

②自动配置(推荐使用)

创建脚手架方式与手动配置类似,唯一不同是此处必须选择Router

对比手动模式:

 此刻:脚手架已经帮我们创建好了Router路由不需要我们下载与导入vue-router了

只需要写:

  1. 导入组件
  2. 配置路由规则
  3. 路由导航
  4. 路由出口

并且为了进一步的封装我们的配置信息,我们的配置代码将写在router/index.js下,不再是全部写在main.js下。

1.导入组件(index.js中)

import find from '@/views/find.vue'
import friend from '@/views/friend.vue'
import my from '@/views/my.vue'
import notfound from '@/views/notfound.vue'

2.配置路由规则(index.js中)

  { path: '/find', component: find },
  { path: '/friend', name: 'friend', component: friend },
  { path: '/my', component: my },
  { path: '/notfound', component: notfound }

 3.路由导航(直接cv我们之前的App.vue文件)

      <router-link to="/find">发现音乐</router-link>
      <router-link to="/my">我的音乐</router-link>
      <router-link to="/friend">朋友</router-link>

 4.路由出口(App.vue中

    <div class="top">
      <router-view></router-view>
    </div>

效果查看:


总结手动自动配置区别:

自动配置省去了一些固定不变的操作,我们不需要写繁琐且固定的代码,只需要写不同的代码。且代码书写的位置都给我们设置好了,我们直接遵守该规范书写代码即可


三、路由重定向与二级路由

1.路由重定向

路由重定向官方文档:重定向和别名 | Vue Router

  • 重定向应用场景: 页面输入根路径/ , 自动跳转到首页

  • 注意点 : 重定向只是修改路径, 还需要单独去设置路由匹配规则

重定向命令:

    {
    path: '/',
    /* 
    (1)重定向只是修改页面路径。  输入 / 会重定向到 /路径
    (2)只有component才会让vue去寻找路由匹配页面。所以设置了重定向,还需要单独设置匹配规则
    */
    redirect: "路径"
  },

1. 就拿我们刚才创建的举例:



 实现效果:当我在浏览器中打开的时候我没有输入任何路径,vue自动帮我们跳转到了 my.vue这个页面组件

 2.也可以利用重定向来设置当我们路径错误提示404页面:

实现效果:当我任意输入没有匹配的路径,自动帮我们跳转到了notfound.vue这个组件

2.二级路由

实现页面中存在第二级的跳转

写法(拿我们上述的案例实操,需要素材可私信博主喔):

①在index.js中引入

// 导入二级路由
import Ranking from '@/views/second/Ranking.vue'
import Recommend from '@/views/second/Recommend.vue'
import SongList from '@/views/second/SongList.vue'

②在需要引用的组件中使用:

//格式:
{
    path: '路径', component: 组件名, children: [
//此处填写二级路由的路径信息
]
}  
{
    path: '/find', component: find, children: [
      {path:'/',redirect:'/SongList'},
      { path: '/Ranking', component: Ranking },
      { path: '/Recommend', component: Recommend },
     { path: '/SongList', component: SongList }
    ]
  }

③写路由导航与出口

 查看效果:

 可以看到:当我们点击一级路由之后,我们还可以点击二级路由到我们的专属页面中


 四、路由跳转传参

有两种跳转传参方式:

  • 声明式导航
  • 编程式导航

1.声明式导航:

①query写法:

在路径中加参数信息即可

      <router-link to="/路径?参数名=参数值&参数名=参数值</router-link>

接收信息:

在触发的组件中书写{{ $route.query.属性名}}接收

 举个例子:

②params写法:

在index.jsx文件中写:参数名。在需要传递的路由路径中写参数值

接收信息:

在触发的组件中书写{{ $route.params.属性名}}接收

 

 实现效果:


2.编程式导航

①query写法:

结构:

      this.$router.push({
        path: '/路径',
        query: { 属性名: '属性值'}
      })

接收信息:

在触发的组件中书写{{ $route.query.属性名}}接收

举个例子:

 ②params写法

结构:

      this.$router.push({
        name: '我们注册路径的组件名',//写path获取不到值!!!
        query: { 属性名: '属性值'}
      })

 注意点:写path获取不到值,需要用name

接收信息:

在触发的组件中书写{{ $route.params.属性名}}接收


有关【vue2】对路由的理解的更多相关文章

  1. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  2. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  3. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  4. ruby - 易于初学者理解的 Ruby 库 - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭3年前。Improvethisquestion我正处于学习Ruby的阶段,我想查看一些小型库的源代码以了解它们是如何构建的。我不知道什么是小型图书馆,但希望SO能推荐一些易于理解的图书馆来学习。因此,如果有人知道一两个非常小的库,这是新手Rubyists学习的好例子,请推荐!我想使用Manveru'sInnatelib,因为它试图保持在2000LOC以下,但我还不熟悉其中经常使用的Ruby速记。也许大约100-5

  5. ruby - 无法理解 `puts{}.class` 和 `puts({}.class)` 之间的区别 - 2

    由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A

  6. ruby - 如何理解 Ruby 中的发送者和接收者? - 2

    我很难理解Ruby中sender和receiver的实际含义。它们一般是什么意思?到目前为止,我只是将它们理解为方法调用和获取其返回值的调用。但是,我知道我的理解还远远不够。谁能给我一个Ruby中发送者和接收者的具体解释? 最佳答案 面向对象中的一个核心概念是消息传递和早期概念化,这在很大程度上借鉴了计算的Actor模型。艾伦·凯(AlanKay)创造了面向对象一词并发明了最早的OO语言之一SmallTalk,他拥有voicedregretatusingatermwhichputthefocusonobjectsinsteadofo

  7. ruby-on-rails - Rails - 理解 application.js 和 application.css - 2

    rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http:

  8. (附源码)vue3.0+.NET6实现聊天室(实时聊天SignalR) - 2

    参考文章搭建文章gitte源码在线体验可以注册两个号来测试演示图:一.整体介绍  介绍SignalR一种通讯模型Hub(中心模型,或者叫集线器模型),调用这个模型写好的方法,去发送消息。  内容有:    ①:Hub模型的方法介绍    ②:服务器端代码介绍    ③:前端vue3安装并调用后端方法    ④:聊天室样例整体流程:1、进入网站->调用连接SignalR的方法2、与好友发送消息->调用SignalR的自定义方法 前端通过,signalR内置方法.invoke()  去请求接口3、监听接受方法(渲染消息)通过new signalR.HubConnectionBuilder().on

  9. ruby - 你如何理解 Ruby 中的这个三元条件? - 2

    我在某些代码中遇到了三元组,但我无法理解条件:str.split(/',\s*'/).mapdo|match|match[0]==?,?match:"somestring"end.join我确实理解我是在某些点上拆分字符串并将总结果转换为数组,然后依次处理数组的每个元素。除此之外,我不知道发生了什么。 最佳答案 一种(稍微)不那么令人困惑的写法是:str.split(/',\s*'/).mapdo|match|ifmatch[0]==?,matchelse"somestring"endend.join我认为多行三元语句很糟糕,尤其是

  10. ruby - 您如何将 S3 理解为 Ruby 中的分层目录结构? - 2

    有没有人成功地将S3存储桶读取为子文件夹?文件夹1--子文件夹2----文件3----文件4--文件1--文件2文件夹2--子文件夹3--文件5--文件6我的任务是读取文件夹1。我希望看到子文件夹2、文件1和文件2,但看不到文件3或文件4。现在,因为我将存储桶键限制为prefix=>'folder1/',你仍然会得到file3和4,因为它们在技术上具有folder1前缀。似乎真正做到这一点的唯一方法是吸收folder1下的所有键,然后使用字符串搜索从结果数组中实际排除file3和file4。有没有人有过这方面的经验?我知道像Transmit和Cyber​​duck这样的FTP风格的S3

随机推荐