Vue路由实现SPA

一、SPA

1.SPA是什么

单页Web应用(single page application,SPA),就是只有一个Web页面的应用,是加载单个HTML页面,并在用户与应用程序交互时动态更新该页面的Web应用程序

  • 单页面应用程序:
    只有第一次会加载页面, 以后的每次请求, 仅仅是获取必要的数据.然后, 由页面中js解析获取的数据, 展示在页面中
  • 传统多页面应用程序:
    对于传统的多页面应用程序来说, 每次请求服务器返回的都是一个完整的页面

优势:

减少了请求体积,加快页面响应速度,降低了对服务器的压力
更好的用户体验,让用户在web app感受native app的流畅

2.SPA实现思路和技术点

  • 1.ajax
  • 2.锚点的使用(window.location.hash #)
  • 3.hashchange 事件 window.addEventListener(“hashchange”,function () {})
  • 4.监听锚点值变化的事件,根据不同的锚点值,请求相应的数据
  • 5.原本用作页面内部进行跳转,定位并展示相应的内容

二、路由

1.什么是路由

路由的本质就是一种对应关系,比如说我们在url地址中输入我们要访问的url地址之后,浏览器要去请求这个url地址对应的资源。
那么url地址和真实的资源之间就有一种对应的关系,就是路由。

路由分为前端路由后端路由

  • 1)后端路由是由服务器端进行实现,并完成资源的分发
  • 2)前端路由是依靠hash值(锚链接)的变化进行实现

后端路由性能相对前端路由来说较低,所以,我们主要学习的是前端路由

前端路由的基本概念:根据不同的事件来显示不同的页面内容,即事件与事件处理函数之间的对应关系
前端路由主要做的事情就是监听事件并分发执行事件处理函数

2.路由实现思路

  • 1、确保引入Vue.vue-router的js依赖
  • 2、首先需要定义组件(就是展示不同的页面效果)
  • 3、需要将不同的组件放入一个容器中(路由集合)
  • 4、将路由集合组装成路由器
  • 5、将路由挂载到Vue实例中
  • 6、定义锚点
  • 7、跳转

3.案例

 1、引入Vue vue-router的js依赖

<!-- 引入vue.js -->
<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
<!-- 引入vue-router.js(路由) -->
<script src="https://cdn.bootcdn.net/ajax/libs/vue-router/3.5.0/vue-router.js"></script>

2、创建自定义组件

const Home=Vue.extend({template:'<div><h1>首页</h1><div>首页内容区域</div></div>'});
const About=Vue.extend({template:'<div><h1>关于</h1><div>关于内容区域</div></div>'});

 这里使用的是const,最后面有const、let、var的区别

3.定义路由(路由及路线)

var routes=[
		{name:'Home',path:'/Home',component:Home},
		{name:'About',path:'/About',component:About},
];

4、将路由集合组装成路由器

var router=new VueRouter({routes:routes});

这里有两个routes它们是有区别的

  1. 前面的routes:是路由器中用来接收你定义的路由的属性
  2. 后面的routes:是你前面定义的路由

5、将路由挂载到Vue容器中

    var vm=new Vue({
			//el:'#zhq',
			router:router,
			data:function(){
				return{
					
				}
			},
			methods:{
				
			}
		}).$mount('#zhq');

6、定义锚点

<div>
     <!-- 视口 -->
     <router-view/>
</div>

7、跳转

 <div>
      <!-- 使用RouterLink组件导航. -->
      <!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
      <!-- 通过传入 `to` 属性指定链接. -->
      <router-link to="/Home">首页</router-link>
           <!-- replace 清除点击上一次之前的所有记录-->
           <!-- 配置首页默认显示的组件 把路由的路径改为/-->
           <!-- tag="" 设置路由的标签  -->
      <router-link  to="/About" replace >关于</router-link> 
</div>

8、做一个前进、后退、切换的功能

1.先在'zhq'的边界内添加按钮

<div>
	<button @click="goto">前进</button>
	<button @click="back">后退</button>
	<button @click="change">切换</button>
</div>

2.添加对应的方法

methods:{
	goto:function(){
		this.$router.go(1);
	},
	back:function(){
		this.$router.go(-1);
	},
	change:function(){
		this.$router.push('/Home');
	}
}

9、效果

两个页面可以相互切换

设置默认页面:

        把路径设置为/

设置标签:

        用tag属性设置

注:前进后退也可使用,但是‘关于’按钮设置了replace,就会清除点击上一次之前的所有记录

三、router-link中的相关属性

1.to

表示目标路由的链接
<router-link to="/home">Home</router-link><!-- 字符串 -->
<router-link v-bind:to="'home'">Home</router-link><!-- 使用 v-bind 的 JS 表达式 -->

2.replace

设置 replace 属性的话,当点击时,会调用 router.replace() 而不是 router.push(),导航后不会留下 history 记录。

<router-link :to="{ path: '/home'}" replace></router-link>
vue中导航中的后退-前进-编程式导航
      //代表着后退
      this.$router.go(-1)    
      //代表着前进
      this.$router.go(1)
      //切换到name为home的路由
      this.$router.push({    
       name:'home'
      });

3.append

设置 append 属性后,则在当前 (相对) 路径前添加基路径。例如,我们从 /a 导航到一个相对路径 b,如果没有配置 append,则路径为 /b,如果配了,则为 /a/b

<base herf="${pageContext.request.contextPath}/"/>
base标签作用于head标签之间在link和script标签中的href和src属性之前加入
<base href="/vue04/">
<script src="js/vue.js">

base中href+script标签中的src    /vue04/js/vue.js
<router-link :to="{ path: 'relative/path'}" append></router-link>

4.tag

<router-link to="/foo" tag="li">foo</router-link>
<!-- 渲染结果 -->
<li>foo</li>

5.active-class

 设置 链接激活时使用的 CSS 类名。可以通过以下代码来替代

6.exact-active-class

配置当链接被精确匹配的时候应该激活的 class。可以通过以下代码来替代。

7.event

声明可以用来触发导航的事件。可以是一个字符串或是一个包含字符串的数组。 

<router-link v-bind:to = "{ path: '/route1'}" event = "mouseover">Router Link 1</router-link>

四、const、var、let区别

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script>
			//1.var声明的变量会挂载在window上,而let和const声明的变量不会:
			var a = 100;
			console.log(a, window.a); // 100 100

			let b = 10;
			console.log(b, window.b); // 10 undefined

			const c = 1;
			console.log(c, window.c); // 1 undefined


			//2.var声明变量存在变量提升,let和const不存在变量提升
			//var
			console.log(a); // undefined  ===>  a已声明还没赋值,默认得到undefined值
			var a = 100;
			//let
			// 			console.log(b); // 报错:b is not defined  ===> 找不到b这个变量
			// 			let b = 10;
			//const
			// 			console.log(c); // 报错:c is not defined  ===> 找不到c这个变量
			// 			const c = 10;

			//3.let和const声明形成块作用域
			// 			 {
			// 				var a3 = 100;
			// 				let b3 = 10;
			// 			}
			// 
			// 			console.log(a3); // 100
			// 			console.log(b3) // 报错:b3 is not defined  ===> 找不到b3这个变量
			//const与let一样

			//4.同一作用域下let和const不能声明同名变量,而var可以
			{
				let l = 100;
				const c = 50;
				var v = 150;

				console.log(l)
				console.log(c)
				console.log(v)
				//再次赋值
				// 				let l = 10;
				// 				const c = 5;
				// 				var v = 15;
				// 
				// 				console.log(l)   控制台报错:Identifier 'l' has already been declared  ===> 标识符a已经被声明了。
				// 				console.log(c)
				// 				console.log(v)
			}

			//5.暂存死区
			// 			var a5 = 100;
			// 
			// 			{
			// 				a5 = 10;
			// 				//在当前块作用域中存在a5使用let/const声明的情况下,给a5赋值10时,只会在当前作用域找变量a5,
			// 				// 而这时,还未到声明时候,所以控制台Error:a5 is not defined
			// 				let a5 = 1;
			// 			}

// 			const:
// 			1、 一旦声明必须赋值, 不能使用null占位。,
// 			2、 声明后不能再修改
// 			3、 如果声明的是复合类型数据, 可以修改其属性
		</script>
	</body>
</html>

总结

  1. var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问。
  2. let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。
  3. const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值