前端路由的简单实现
概念
路由这个概念首先出现在后台。传统MVC架构的web开发,由后台设置路由规则,当用户发送请求时,后台根据设定的路由规则将数据渲染到模板中,并将模板返回给用户。因此,用户每进行一次请求就要刷新一次页面,十分影响交互体验。
ajax 的出现则有效解决了这一问题。ajax (asynchronous javascript and xml),浏览器提供的一种技术方案,采用异步加载数据的方式以实现页面局部刷新,极大提升了用户体验。
而异步交互体验的更高版本就是 SPA——单页应用,不仅页面交互无刷新,甚至页面跳转之间也可以无刷新。为了实现 SPA,因此便有了 前端路由 的概念。
实现
Angular,React,Vue 都有 前端路由 的概念,但是前端路由究竟是如何实现的呢?且看下面代码:
/** * Created by lonelydawn on 2018-04-03. * javascript version: ES 6 */ import homepage from '../views/homepage.html' import product from '../views/product.html' import server from '../views/server.html' let Router = function (config) { config = config || {} // 页面容器 let app = document.getElementById(config.el) || document.body let routes = Object.prototype.toString.call(config.routes) === '[object Array]' ? config.routes : [] // 加载页面 let load = function (route) { if (route) { let beforeLoad = route.beforeLoad || function () {} let afterLoad = route.afterLoad || function () {} beforeLoad() app.innerHTML = route.template afterLoad() } } // 根据 location 的 hash 属性实现页面切换 let redirect = function () { let url = window.location.hash.slice(1) || '/' for (let route of routes) { if (url === route.url) { load(route) return } } load(routes[0]) } // 添加路由规则 this.push = function (route) { if (Object.prototype.toString.call(route) === '[object Object]') { routes.push(route) } } // 更改页面容器 this.bind = function (el) { app = document.getElementById(el) || document.body } // event window.addEventListener('load', redirect, false) // 监控 hash 变化 window.addEventListener('hashchange', redirect, false) } // 创建路由对象 let router = new Router() router.bind('app') router.push({ url: '/', template: homepage }) router.push({ url: '/product', template: product }) router.push({ url: '/server', template: server })
示例
源代码
原文发布时间为:2018年04月03日
原文作者:lonelydawn
本文来源:开源中国 如需转载请联系原作者
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一入前端深似海,从此红尘是路人系列第十二弹之移动端模拟IOS虚拟按钮效果
用过苹果的大家都知道,苹果公司做了一个虚拟按钮,让页面上的挂件可被拖拽并吸附到屏幕边框处,降低挂件对用户的干扰。该效果如果用JavaScript进行实现又该如何实现呢,接下来我将分享给大家。首先上一张效果图 一、思路来源 首先体验过该虚拟按钮的都知道,它是根据距离屏幕边距进行一个位移判断的。当手从屏幕中放开的时候,对边距判断后进行动态效果操纵,这里动态我们将用到transform进行控制,代码也是纯原生JavaScript。这里我们也只是做一个移动效果的模拟,对于其中的一些功能并没有添加进来。 二、代码编写 1、html <div class="i-pendant" id="pendant"> <div class="drag"></div> </div> 2、css .i-pendant { width: 60px; height: 60px; border-radius: 5px; background: #999; position: fixed; top: 300px; right: 0; z-index: 90; -webki...
- 下一篇
java之压缩流(ZipOutputStream)
一、文件压缩,是很有必要的,我们在进行文件,传输过程中,很多时候都是,都是单个文件单个文件发送接收,但是当数据量特别大,或者文件数量比较多的时候,这个时候就可以考虑文件压缩。 二、优势:文件压缩过后,只需要进行一次文件的传输就可以了。减少频繁发送的问题。缺点:文件大小会变大,如果传输过程中断了,风险较大。 三、实现: /** * 提供给用户使用的基本压缩类 * @param srcPath * @param outPath * @throws IOException */ public static void compressFile(String srcPath, String outPath) throws IOException { //读取源文件 File srcFile = new File(srcPath); //判断输出路径是否正确 File outFile = new File(outPath); //如果只是路劲加入对应的压缩名称 if (outFile.isDirectory()) { //用"/"作文判断标准 if (outPath.endsWith(File.s...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS6,CentOS7官方镜像安装Oracle11G
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启