Vue(九)——页面路由(1)

news2024/11/18 13:50:29

目录

路由的简介

路由基本使用

几个注意点

嵌套(多级)路由

路由的query参数

命名路由

路由的params参数

路由的props配置


路由的简介

        理解: 一个路由(route)就是一组映射关系(key - value),多个路由需要路由器(router)进行管理。

前端路由:key是路径,value是组件。

  1. 理解:value 是 component,用于展示页面内容
  2. 工作过程:当浏览器的路径改变时,对应的组件就会显示

        生活中的路由和路由器是为了完成多台设备的上网,而编码中的路由和路由器是完为了完成实现SPA应用的导航区与展示区的切换。

对SPA应用的理解

  1. 单页 Web 应用(single page web application,SPA)
  2. 整个应用只有一个完整的页面
  3. 点击页面中的导航链接不会刷新页面,只会做页面的局部更新
  4. 数据需要通过ajax请求获取

路由基本使用

提出如下需求:

将html粘贴到App.vue

 

        在main.js当中引入router之后可以使用一个全新的对象router。但不可像下图一样设置成字符串,需要自己去创建一个路由。

创建index.js专门用于创建整个应用的路由器 (routes为数组形式)

./router/index.js

// 该文件专门用于创建整个应用的路由器
import VueRouter from 'vue-router'
//引入组件
import About from '../components/About'
import Home from '../components/Home'

//创建并暴露一个路由器
export default new VueRouter({
	routes:[
		{
			path:'/about',
			component:About
		},
		{
			path:'/home',
			component:Home
		}
	]
})

 ./components/About.vue

<template>
	<h2>我是About的内容</h2>
</template>

<script>
	export default {
		name:'About'
	}
</script>

  ./components/Home.vue

<template>
	<h2>我是Home的内容</h2>
</template>

<script>
	export default {
		name:'Home'
	}
</script>

 App.vue

<template>
  <div>
    <div class="row">
      <div class="col-xs-offset-2 col-xs-8">
        <div class="page-header"><h2>Vue Router Demo</h2></div>
      </div>
    </div>
    <div class="row">
      <div class="col-xs-2 col-xs-offset-2">
        <div class="list-group">
					<!-- 原始html中我们使用a标签实现页面的跳转 -->
          <!-- <a class="list-group-item active" href="./about.html">About</a> -->
          <!-- <a class="list-group-item" href="./home.html">Home</a> -->

					<!-- Vue中借助router-link标签实现路由的切换 router-link会转成a标签-->
		  <router-link class="list-group-item" active-class="active" to="/about">About</router-link>
          <router-link class="list-group-item" active-class="active" to="/home">Home</router-link>
                    <!-- active-class为该元素被激活的样式-->
        </div>
      </div>
      <div class="col-xs-6">
        <div class="panel">
          <div class="panel-body">
						<!-- 指定组件的呈现位置 -->
            <router-view></router-view>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

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

1.下载vue-routernpm i vue-router

2.应用插件:Vue.use(VueRouter)

3.编写router配置项:

//引入VueRouter
   import VueRouter from 'vue-router'
   //引入Luyou 组件
   import About from '../components/About'
   import Home from '../components/Home'
   
   //创建router实例对象,去管理一组一组的路由规则
   const router = new VueRouter({
   	routes:[
   		{
   			path:'/about',
   			component:About
   		},
   		{
   			path:'/home',
   			component:Home
   		}
   	]
   })
   
   //暴露router
   export default router

4. 实现切换(active-class可配置高亮样式)

vue

<router-link active-class="active" to="/about">About</router-link>

5. 指定展示位置

vue

   <router-view></router-view>

几个注意点

        1.靠路由规则匹配出来由路由器渲染出来的组件叫做路由组件,如果自己亲自写的标签叫做一般组件,一般情况下会将他们分为不同的文件夹。

        2.不用的路由组件或者说当切换切走的路由组件其实是被销毁了

 

3.各个组件上都多了两个东西,route(路由的配置信息)和router(路由器)           (打印出vc)

每个组件route是不一样的而router是一样的

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

2. 通过切换,“隐藏”了的路由组件,默认是被销毁掉的,需要的时候再去挂载。

3. 每个组件都有自己的```$route```属性,里面存储着自己的路由信息。

4. 整个应用只有一个router,可以通过组件的```$router```属性获取到。

嵌套(多级)路由

界面分为导航区和展示区,在展示区里还有导航区和展示区

把相应的结构粘贴到Home/About中的tempalte去

新建展示区的组件并把结构粘贴进来

以home为例,把子展示区用问号占位

        去index.js里制定路由规则,路由分为一级路由和二级路由等(多级路由),上一节写的都是一级路由,这个时候使用children配置项,这是一个数组,因为这也有可能有n多个子路由。注意子路由里的path不用再加斜杠,因为底层检测到children就会自动在地址加上斜杠。

在home里的导航标签改为router-link(),并在组件的呈现位置写上<router-view>标签

./pages/Home.vue

<template>
	<div>
		<h2>Home组件内容</h2>
		<div>
			<ul class="nav nav-tabs">
				<li>
					<router-link class="list-group-item" active-class="active" to="/home/news">News</router-link>
				</li>
				<li>
					<router-link class="list-group-item" active-class="active" to="/home/message">Message</router-link>
				</li>
			</ul>
			<router-view></router-view>
		</div>
	</div>
</template>

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

./pages/Message.vue

<template>
	<div>
		<ul>
			<li>
				<a href="/message1">message001</a>&nbsp;&nbsp;
			</li>
			<li>
				<a href="/message2">message002</a>&nbsp;&nbsp;
			</li>
			<li>
				<a href="/message/3">message003</a>&nbsp;&nbsp;
			</li>
		</ul>
	</div>
</template>

<script>
	export default {
		name:'Message'
	}
</script>

./pages/New.vue

<template>
	<ul>
		<li>news001</li>
		<li>news002</li>
		<li>news003</li>
	</ul>
</template>

<script>
	export default {
		name:'News'
	}
</script>

./router/index.js

// 该文件专门用于创建整个应用的路由器
import VueRouter from 'vue-router'
//引入组件
import About from '../pages/About'
import Home from '../pages/Home'
import News from '../pages/News'
import Message from '../pages/Message'

//创建并暴露一个路由器
export default new VueRouter({
	routes:[
		{
			path:'/about',
			component:About
		},
		{
			path:'/home',
			component:Home,
			children:[
				{
					path:'news',
					component:News,
				},
				{
					path:'message',
					component:Message,
				}
			]
		}
	]
})

1. 配置路由规则,使用children配置项

routes:[
   	{
   		path:'/about',
   		component:About,
   	},
   	{
   		path:'/home',
   		component:Home,
   		children:[ //通过children配置子级路由
   			{
   				path:'news', //此处一定不要写:/news
   				component:News
   			},
   			{
   				path:'message',//此处一定不要写:/message
   				component:Message
   			}
   		]
   	}
   ]

2. 跳转(要写完整路径)

 <router-link to="/home/news">News</router-link>

路由的query参数

        当点击消息001,就在Detail.vue显示001的细节信息,002、003也是如此。只需要设置一个detail组件,给Detail.vue组件传递参数即可。

编写detail组件

这个detail属于message中的子路由,引入detail之后添加子路由

更改导航标签为router-link和to属性,在需要呈现的地方写入<router-view></router-view>

此时跳转没有携带参数,所以结果是写死的

路由是可以携带两种参数的,一种叫query参数,如下所示,这样就可以将参数交给路由组件了

        那么detail组件如何接收呢?还记不记得$route,他是路由的配置信息,在detail中打印出来如下所示:

取数据接收参数如下所示,to的字符串写法

        可是666和你好啊是假数据,这时需要将变量传进去,但是直接在to属性里换上m.id会被解析成字符串,所以要在to属性前加冒号,还需要用倒引号包裹,模板字符串里面混着js变量要用${}包裹。

        前面加冒号。就会将双引号里的东西当作js来解析,解析发现写的是字符串还是模板字符串,而且里面还混着js变量。

此时参数完美传过来 

其实还有一种写法,to的对象写法

        对象里边写两个属性,一个是path,一个是query。path写到要跳转的组件,query写成一个对象并写明要携带的参数。效果同上。

 ./pages/Message.vue

<template>
	<div>
		<ul>
			<li v-for="m in messageList" :key="m.id">
				<!-- 跳转路由并携带query参数,to的字符串写法 -->
				<!-- <router-link :to="`/home/message/detail?id=${m.id}&title=${m.title}`">{{m.title}}</router-link>&nbsp;&nbsp; -->

				<!-- 跳转路由并携带query参数,to的对象写法 -->
				<router-link :to="{
					path:'/home/message/detail',
					query:{
						id:m.id,
						title:m.title
					}
				}">
					{{m.title}}
				</router-link>
			
			</li>
		</ul>
		<hr>
		<router-view></router-view>
	</div>
</template>

<script>
	export default {
		name:'Message',
		data() {
			return {
				messageList:[
					{id:'001',title:'消息001'},
					{id:'002',title:'消息002'},
					{id:'003',title:'消息003'}
				]
			}
		},
	}
</script>

./router/index.js

// 该文件专门用于创建整个应用的路由器
import VueRouter from 'vue-router'
//引入组件
import About from '../pages/About'
import Home from '../pages/Home'
import News from '../pages/News'
import Message from '../pages/Message'
import Detail from '../pages/Detail'

//创建并暴露一个路由器
export default new VueRouter({
	routes:[
		{
			path:'/about',
			component:About
		},
		{
			path:'/home',
			component:Home,
			children:[
				{
					path:'news',
					component:News,
				},
				{
					path:'message',
					component:Message,
					children:[
						{
							path:'detail',
							component:Detail,
						}
					]
				}
			]
		}
	]
})

1. 传递参数

<!-- 跳转并携带query参数,to的字符串写法 -->
   <router-link :to="/home/message/detail?id=666&title=你好">跳转</router-link>
   				
   <!-- 跳转并携带query参数,to的对象写法 -->
   <router-link 
   	:to="{
   		path:'/home/message/detail',
   		query:{
   		   id:666,
               title:'你好'
   		}
   	}"
   >跳转</router-link>

2. 接收参数

   $route.query.id
   $route.query.title

命名路由

给路由命名只需要在js里添加name这个配置项即可,这个名字可以在跳转的时候简化编码。

在Message.vue里用name替换path(注意只在对象形式中这么用)

1. 作用:可以简化路由的跳转。

2. 如何使用

         1. 给路由命名:

    {
      	path:'/demo',
      	component:Demo,
      	children:[
      		{
      			path:'test',
      			component:Test,
      			children:[
      				{
                            name:'hello' //给路由命名
      					path:'welcome',
      					component:Hello,
      				}
      			]
      		}
      	]
      }

         2. 简化跳转:

      <!--简化前,需要写完整的路径 -->
      <router-link to="/demo/test/welcome">跳转</router-link>
      
      <!--简化后,直接通过名字跳转 -->
      <router-link :to="{name:'hello'}">跳转</router-link>
      
      <!--简化写法配合传递参数 -->
      <router-link 
      	:to="{
      		name:'hello',
      		query:{
      		   id:666,
                  title:'你好'
      		}
      	}"
      >跳转</router-link>

路由的params参数

路径直接携带参数

js里用占位符让vue知道detail是路由的层级,下一层级是id,再下一层级是title

结果发现参数在params里,并且key的名称和占位符是一致的

所以在取值的时候也要改变,如图所示

如果使用to的对象写法,只需将query改为params即可。

注意,如果携带params参数,那么不可以使用path,只能用name。

1. 配置路由,声明接收params参数

 {
   	path:'/home',
   	component:Home,
   	children:[
   		{
   			path:'news',
   			component:News
   		},
   		{
   			component:Message,
   			children:[
   				{
   					name:'xiangqing',
   					path:'detail/:id/:title', //使用占位符声明接收params参数
   					component:Detail
   				}
   			]
   		}
   	]
   }

2. 传递参数

        特别注意:路由携带params参数时,若使用to的对象写法,则不能使用path配置项,必须使用name配置!

   <!-- 跳转并携带params参数,to的字符串写法 -->
   <router-link :to="/home/message/detail/666/你好">跳转</router-link>
   				
   <!-- 跳转并携带params参数,to的对象写法 -->
   <router-link 
   	:to="{
   		name:'xiangqing',
   		params:{
   		   id:666,
               title:'你好'
   		}
   	}"
   >跳转</router-link>

3. 接收参数

   $route.params.id
   $route.params.title

路由的props配置

分清楚这个是路由的props而不是组件的props。

在js当中配置一个新的配置项props,他有三种写法:

1.值为对象,该对象中的所有key-value都会以props的形式传给Detail组件。

同时在detail中添加props属性声明接收。

这种方法不推荐因为数据是写死的。 

2.值为布尔值,若布尔值为真,就会把该路由组件收到的所有params参数,以props的形式传给Detail组件。

3.值为函数,该函数返回的对象(返回值)中每一组key-value都会通过props传给Detail组件

传入参数$route,用来获取query参数,在函数里封装成对象通过props传给Detail组件。

作用:让路由组件更方便的收到参数。

{
	name:'xiangqing',
	path:'detail/:id',
	component:Detail,

	//第一种写法:props值为对象,该对象中所有的key-value的组合最终都会通过props传给Detail组件
	// props:{a:900}

	//第二种写法:props值为布尔值,布尔值为true,则把路由收到的所有params参数通过props传给Detail组件
	// props:true
	
	//第三种写法:props值为函数,该函数返回的对象中每一组key-value都会通过props传给Detail组件
	props(route){
		return {
			id:route.query.id,
			title:route.query.title
		}
	}
}

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

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

相关文章

【毕业设计】深度学习身份证识别系统 - 机器视觉 python

文章目录0 前言1 实现方法1.1 原理1.1.1 字符定位1.1.2 字符识别1.1.3 深度学习算法介绍1.1.4 模型选择2 算法流程3 部分关键代码4 效果展示5 最后0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任…

第八章: 项目质量管理

一、规划质量管理 识别项目及其可交付成果的质量要求和标准&#xff0c;并书面描述项目将如何证明符合质量要求和标准的过程。主要作用为整个项目期间如何管理和核实质量提供指南和方向。 输入工具与技术输出 1.项目章程 2.项目管理计划 需求管理计划风险管理计划相关方参与计…

C++ opencv图像直方图

1.图像直方图概念 图像有很多基础概念&#xff0c;在我们学习的过程中因为一些原因无法涉及&#xff0c;但这并不代表它们不重要 今天&#xff0c;我们就来介绍一个概念——图像直方图 图像直方图&#xff0c;是图像处理中很重要的一个基础概念&#xff0c; 有很多的算法&…

用HTML+CSS做一个漂亮简单的旅游网站——旅游网页设计与实现(6页)HTML+CSS+JavaScript

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

(八)Java算法:堆排序(详细图解)

目录一、前言1.1、概念1.2、大根堆特点二、maven依赖三、流程解析3.1、初始建堆3.2、堆化第一步3.2、堆化第二步3.3、堆化第三步3.4、堆化第四步3.5、堆化第五步3.6、堆化第六步四、编码实现4.1、代码实现4.2、运行结果&#xff1a;扩展一、前言 1.1、概念 根据堆的结构可以分…

彩印图文版《Elasticsearch实战》文档,阿里内部共享,堪称精品

学习是一种基础性的能力。然而&#xff0c;“吾生也有涯&#xff0c;而知也无涯。”&#xff0c;如果学习不注意方法&#xff0c;则会“以有涯随无涯&#xff0c;殆矣”。 学习就像吃饭睡觉一样&#xff0c;是人的一种本能&#xff0c;人人都有学习的能力。我们在刚出生的时候…

Lesson1强化学习(RL)初印象 学习笔记

一、强化学习引入 ​ 人的智能可以遗传获得也可以通过后天学习&#xff1b;学习有两种&#xff0c;模仿前人的经验是一种学习&#xff1b;如果没有前人的经验可以学习&#xff0c;就需要和环境进行交互&#xff0c;得到反馈来学习。 #mermaid-svg-XUxguPj6VHcJMK3W {font-famil…

the account is locked

感谢阅读问题描述解决方案1.WinR打开命令行输入&#xff1a;sqlplus &#xff0c;或者使用sqlplus / as sysdba;无需输入密码。2.假设我们要解锁的账户是scott3.修改密码&#xff0c;从而避免再次被锁4.重启服务或者客户端&#xff08;看你是桌面版还是服务器版&#xff09;&am…

警惕,3D建模为什么选3dsMAX不选MAYA

如今现在的游戏建模都是次世代建模&#xff0c;3DMAX确实是主流软件之一&#xff0c;但是为什么说MAYA更好呢❓ 首先&#xff0c;两款软件都很适合用现代的建模&#xff0c;但是难度上有一定的差异❌ • 软件区别 &#x1f340;3DSMAX&#xff1a; 它是目前使用最广泛的3d软…

十、Mysql的DQL语句

Mysql的DQL语句十、Mysql的DQL语句select的查询一、查看系统参数二、select常用函数三、select的单表查询1、from子句2、where子句2.1 where配合等值查询2.2where配合比较操作符(> < > < <>)2.3where配合逻辑运算符(and or )2.4where配合模糊查询2.5where配合…

流量控制可靠传输机制停止-等待协议

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录链路层流量控制和传输层的流量控制区别停止-等待协议为什么要有停止等待协议无差错情况滑动窗口协议后退N帧协议GBN选择重传协议SR可靠传输流量控制&#x1f343;博主昵称&#xff1a;一拳必胜客 &#x1f3…

供应链全流程计划与排产解决方案核心功能概要

通过数字智能化运营实现将本增效至为重要。 许多企业的业务现状是销售、生产计划与市场不匹配&#xff0c;企业的运营效率低且成本高&#xff1a; 销售计划计划需要大量的人员进行沟通&#xff0c;销售预测的分析维度少、粒度粗&#xff0c;不仅效率低&#xff0c;且预测只是一…

【mycat】常用分片规则

一、 常用分片规则 1、取模 ​ 此规则为对分片字段求摸运算。也是水平分表最常用规则 2、分片枚举 ​ 通过在配置文件中配置可能的枚举 id&#xff0c;自己配置分片&#xff0c;本规则适用于特定的场景&#xff0c;比如有些业务需要按照省份或区县来做保存&#xff0c;而全…

Delphi Enterprise具有强大视觉设计功能

Delphi Enterprise具有强大视觉设计功能 Delphi可帮助您使用Object Pascal为Windows、Mac、Mobile、IoT和Linux构建和更新数据丰富、超连接、可视化的应用程序。Delphi Enterprise适用于构建客户端/服务器或多层应用程序、REST服务等的开发团队。 Delphi功能 单一代码库-用更少…

小程序在线客服完整实现

1、先注册公众号》小程序(需实名认证) 2、开发》测试》上传》审核发布》发布》使用 3、公众号(订阅号或服务号)与小程序(此为在线客服)通过同一主体绑定可以打通调用 建议 内测完成后再上传。如果多次上传demo会处罚的。 添加客服人员列表(授权)可以电脑、手机端均…

(免费分享)springboot论坛bbs系统

源码获取&#xff1a;关注文末gongzhonghao&#xff0c;输入010领取下载链接 开发工具&#xff1a;IDEA 数据库mysql5.7 技术&#xff1a;springbootjpashiroredislayui 前台截图&#xff1a; 后台截图&#xff1a; package com.qxczh.admin.service.impl;impor…

云南美食介绍 简单静态HTML网页作品 美食餐饮网站设计与实现 学生美食网站模板

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

A puma at large

New words and expressions puma n. 美洲狮 spot v. 看出,发现 evidence n. 证据 accumulate v. 积累,积聚 oblige v. 使……感到必须 hunt n. 追猎;寻找 blackberry n. 黑莓 Pumas are large, cat-like animals which are found in America. When reports came i…

点击化学PEG试剂巯基吡啶-PEG-叠氮,OPSS-PEG-azide,OPSS-PEG-N3

点击化学PEG试剂OPSS-PEG-azide&#xff08;OPSS-PEG-N3 &#xff09;化学试剂其中文名为巯基吡啶-聚乙二醇-叠氮&#xff0c;它所属分类为Azide PEG Orthopyridyl disulfide (OPSS) PEG。 其分子量均可定制&#xff0c;有&#xff1a;2K 巯基吡啶-PEG-叠氮、5k OPSS-PEG-N3、…

TCP/IP协议、UDP协议及网络基础概念

网络程序设计编写的是与其他计算机进行通信的程序。Java已经将网络程序所需要的东西封装成不同的类&#xff0c;用户只要创建这些类的对象&#xff0c;使用相应的方法&#xff0c;即使不具备有关的网络知识&#xff0c;也可以编写出高质量的网络通信程序。 1.局域网与因特网 …