@toc
随着(SPA)单页应用的不断普及,前后端开发分离,目前项目基本都使用前端路由,在项目使用期间页面不会重新加载。
<font color='red'>SEO:</font>一般指搜索引擎优化。
优点:
1、用户体验好,和后台网速没有关系,不需要每次都从服务器全部获取,界面展现快。
2、可以再浏览器中输入指定想要访问的url路径地址。
3、实现了前后端的分离,方便开发。有很多框架都带有路由功能模块。
缺点:
1、对SEO不是很友好
2、在浏览器前进和后退时候重新发送请求,没有合理缓存数据。
3、初始加载时候由于加载所有模块渲染,会慢一点。
前端路由目前主要有两种方法:
1)利用url的hash,就是常用的锚点(#)操作,类似页面中点击某小图标,返回页面顶部,JS通过hashChange事件来监听url的改变,IE7及以下需要轮询进行实现。一般常用框架的路由机制都是用的这种方法,例如Angualrjs自带的ngRoute和二次开发模块ui-router,react的react-route,vue-route…
2)利用HTML5的History模式,使url看起来类似普通网站,以”/”分割,没有”#”,但页面并没有跳转,不过使用这种模式需要服务器端的支持,服务器在接收到所有的请求后,都指向同一个html文件,通过historyAPI,监听popState事件,用pushState和replaceState来实现。
由于使用hash方法能够兼容低版本的IE浏览器,简单的的自己搭建前端路由。
举例:实现点击不同标签跳转不同页
<font color='red'>说明:</font>
<font color='red'>第一步:</font>定义函数
<font color='red'>第二步:</font>定义路由切换
<font color='red'>第三步:</font>定义dom配置#地址
<font color='red'>执行流程:</font>点击a标签 =》 根据#后面的路径调用路由切换Router.route =》 调用具体方法changePage()
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义路由</title>
<script>
function Router() {
this.routes = {};
this.currentUrl = '';
}
//route 存储路由更新时的回调到回调数组routes中,回调函数将负责对页面的更新
Router.prototype.route = function (path, callback) {
this.routes[path] = callback || function () { };
};
//refresh 执行当前url对应的回调函数,更新页面
Router.prototype.refresh = function () {
this.currentUrl = location.hash.slice(1) || '/';
this.routes[this.currentUrl]();
};
//init 监听浏览器 url hash 更新事件
Router.prototype.init = function () {
//load事件在当前页面加载时触发
window.addEventListener('load', this.refresh.bind(this), false);
//hashchange事件在当前页面URL中的hash值发生改变时触发
window.addEventListener('hashchange', this.refresh.bind(this), false);
};
window.Router = new Router();
window.Router.init();
</script>
<title></title>
</head>
<body>
<ul>
<li><a href="#/">首页</a></li>
<li><a href="#/home">主页</a></li>
<li><a href="#/detail">详情页</a></li>
</ul>
<div id="page"></div>
<script>
var body = document.querySelector('body');
//切换hash的事件
function changePage(page) {
document.querySelector('#page').innerHTML = page;
}
//切换
Router.route('/', function () {
changePage('这是首页');
});
Router.route('/home', function () {
changePage('这是主页');
});
Router.route('/detail', function () {
changePage('这是详情页');
});
</script>
</body>
</html>
vue-router是Vue官方提供的路由,用 Vue.js + vue-router 创建单页应用,是非常简单的。使用 Vue.js ,我们已经可以通过组合组件来组成应用程序,当你要把 vue-router 添加进来,我们需要做的是,将组件(components)映射到路由(routes),然后告诉 vue-router 在哪里渲染它们。
<font color='red'>使用说明:</font>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue-router</title>
<script src="../vue.js"></script>
<script type="text/javascript" src="https://unpkg.com/vue-router@3.0.0/dist/vue-router.js"></script>
</head>
<body>
<div id="app">
<h3>Hello App!</h3>
<p>
<!-- 使用 router-link 组件来导航. -->
<!-- 通过传入 `to` 属性指定链接. -->
<!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
<router-link to="/index">Go to index</router-link>
<router-link to="/news">Go to news</router-link>
</p>
<!-- 路由出口 -->
<!-- 路由匹配到的组件将渲染在这里 -->
<router-view></router-view>
</div>
<script>
// 1. 定义(路由)组件。
// 可以从其他文件 import 进来
const Index = { template: '<div>首页</div>' }
const News = { template: '<div>新闻页</div>' }
// 2. 定义路由
// 每个路由应该映射一个组件。 其中"component" 可以是
// 通过 Vue.extend() 创建的组件构造器,
// 或者,只是一个组件配置对象。
// 我们晚点再讨论嵌套路由。
const routes = [
{ path: '/index', component: Index },
{ path: '/news', component: News }
]
// 3. 创建 router 实例,然后传 `routes` 配置
// 你还可以传别的配置参数, 不过先这么简单着吧。
const router = new VueRouter({
routes // (缩写)相当于 routes: routes
})
// 4. 创建和挂载根实例。
// 记得要通过 router 配置参数注入路由,
// 从而让整个应用都有路由功能
const app = new Vue({
router
}).$mount('#app');
// 现在,应用已经启动了!
</script>
</body>
</html>
通过路由可以传递参数,在使用时用:参数名的形式定义路由参数
通过<font color='red'>\$route.params</font>获取路由参数:<font color='red'>/user/12</font>
通过<font color='red'>\$route.query</font>获取问号?后面查询参数:<font color='red'>name=cat</font>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue-router</title>
<script src="../vue.js"></script>
<script type="text/javascript" src="https://unpkg.com/vue-router@3.0.0/dist/vue-router.js"></script>
</head>
<body>
<div id="app">
<h3>Hello App!</h3>
<p>
<router-link to="/user/12?name=cat">User12</router-link>
</p>
<router-view></router-view>
</div>
<script>
// 1. 定义(路由)组件。
const User = { template: '<div>用户: {{ $route.params.id }}-{{ $route.query.name }}</div>' };
// 2. 定义动态路由
const routes = [
// 动态路径参数 以冒号开头
{ path: '/user/:id', component: User }
];
// 3. 创建 router 实例
const router = new VueRouter({
routes
});
// 4. 创建和挂载根实例
const app = new Vue({
router
}).$mount('#app');
// 现在,应用已经启动了!
</script>
</body>
</html>
vue 的一个插件库,专门用来实现 SPA 应用
1.后端路由:
1) 理解:value 是 function, 用于处理客户端提交的请求。
2) 工作过程:服务器接收到一个请求时, 根据请求路径找到匹配的函数来处理请求, 返回响应数据。
2.前端路由:
1) 理解:value 是 component,用于展示页面内容。
2) 工作过程:当浏览器的路径改变时, 对应的组件就会显示。
1.《vue2进阶篇:路由》第10章:vue-router,包括基础路由、嵌套路由、路由的query参数和params参数、命名路由、router-link的replace属性、编程式路由、缓存路由组件
5.vue2进阶篇:vue-router之路由的query参数
7.vue2进阶篇:vue-router之路由的params参数
8.vue2进阶篇:vue-router之路由的props配置
9.vue2进阶篇:vue-router之router-link的replace属性
12.vue2进阶篇:vue-router之两个新的生命周期钩子
13.vue2进阶篇:vue-router之使用“全局路由守卫”
14.vue2进阶篇:vue-router之“使用独享路由守卫”
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。