mobile-router.js

轻量级web端单页面框架
授权协议 MIT
开发语言 JavaScript
所属分类 Web应用开发、 响应式 Web 框架
软件类型 开源软件
地区 不详
投 递 者 杨甫
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

mobile-router.js 是轻量级web端单页面框架。

优势:

  •  使用简单、方便、轻量,基于 historywindow.onpopstate

  •   支持路由视图嵌套 (1.5.0+)。

  •  无依赖,可与其他框架(库)搭配自由使用,例如:jquery, zepto, iscroll等。

  • 任意选择字符串式模板引擎,当然最简单的就是自己拼接字符串了;同时支持异步(远程获取模板,或者去请求数据在前端构建模板);可配置是否缓存结果模板。

  • 考虑后端渲染首屏的情况,只需要按结构输出响应的片段即可,利于SEO,且可以实现前后端模板公用。

  • 自动缓存部分画面,可配置缓存数量,默认3个。

  • 每个路由都有对应的callback和onDestroy等配置方法,分别用于显示了对应画面后的回调以及当该画面销毁时回调。

  • 利用CSS animation控制动画转场(页面切换)效果,也可设置关闭动画效果。

  • “保留”浏览器原生hash功能,根据hash,可自由跳转到对应id元素位置。

  • 可配置enablePushState决定是否使用pushstate功能,默认启用;不启用的话,仅仅影响的是不产生历史,但是路由依旧好使的,也就是还是基于url的。

一些注意点:

  • 不管画面是否已缓存在页面中,只要切换回显示了,那么就会调用callback,而callback中大多数情况需要处理监听事件、操作DOM,这时候可根据this.cached来区分;当没有缓存在页面上时为false,或者缓存在页面上了,但是模板更新了,这时候也为false。

  • getTemplate配置方法,如果带有参数,那么该参数就是得到模板字符串后的回调函数,一定要回调的;如果没有参数,直接返回模板字符串即可。这样做,主要是为了考虑异步获取(render)模板的场景。

  • M.history的默认的 base path 是页面中base元素的href的值,如果没有,则默认是/;也可以在M.history.start()时传入。

  •  对于historywindow.onpopstate不支持或者支持不够好的浏览器来说,能够正常匹配对应route,也就是说能够正常调用route配置项中的getTemplate以及callback(onDestroy除外),其他功能都没有,点击链接直接刷新页面。这样就可以在不改变代码的情况下,适配了不支持的浏览器。当然这种情况也可以通过取得M.history.support来判断,如果不支持的话,可以在调用M.history.start时设置参数enablePushState为false也可以,但不建议,因为没有历史记录了。

使用方法:

M.router.init([
    {
        path: '/',
        cacheTemplate: false, // 针对于当前的route,是否缓存模板 animation: true, // 针对于当前的route,是否有动画 aniClass: 'slideup', // 针对于当前的route,动画类型(效果) getTemplate: function() { return '/index';
        }, onActive: function() { // 1.5.5+ 当路由被激活时调用,一般此时还没创建 `page-view` 元素 }, callback: function() { // 页面展示出来之后 if (this.cached) return; // 处理操作... }, onDestroy: function() { // 例如,处理一些解绑操作,销毁和DOM关联 }, onEnter: function(paramName) { // 1.5.3+ // 页面将要显示的时候 }, onLeave: function() { // 1.5.3+ // // 页面将要隐藏的时候 }
    },
    { // 支持 redirectTo 语法,可以是直接的 url 还可以是函数 (1.5.5+) path: '/redirectTo/:rtPath',
        redirectPushState: false, // 默认 true, 当激活redirectTo的时候是否启用`pushState` redirectTo: function(rtPath) { console.log('redirectTo', arguments, this); return '/' + rtPath;
        }
    },
    { // support redirectTo , string url or function (1.5.5+) // 如果当前的route配置有getTemplate的话,此时会表现的像正常的 // route一样依旧会创建`page-view`、会调用回调函数们、会做动画等。 // 当正常行为结束之后(route的callback被调用之后)会触发redirectTo的逻辑 path: '/contacts',
        getTemplate: contacts.getTemplate,
        onEnter: contacts.onEnter,
        onLeave: contacts.onLeave,
        callback: contacts.controller,
        onDestroy: contacts.onDestroy,

        redirectTo: '/contacts/list',
        redirectPushState: false,

        children: { // Nested routes & views! (1.5.0+) viewsSelector: '.content',
            cacheViewsNum: 1,
            routes: [
                { // all contacts path: '/list',
                    getTemplate: list.getTemplate,
                    onEnter: list.onEnter,
                    onLeave: list.onLeave,
                    callback: list.controller,
                    onDestroy: list.onDestroy }
            ]
        }
    },
    {
        path: '/m/:paramName',
        cacheTemplate: false, // 针对于当前的route,是否缓存模板 getTemplate: function(cb) { // 这里模拟异步得到模板内容 var that = this; // that.params 参数信息 // that.query query信息 setTimeout(function() { cb('/m/' + that.params.paramName);
            }, 200);
        }, callback: function(paramName) { if (this.cached) return; // 处理操作... }, onDestroy: function() { // 例如,处理一些解绑操作,销毁和DOM关联 }
    },
    { // 嵌套!!(1.5.0+) path: '/b/:bid', getTemplate: function(cb) { var path = this.path.substr(1); setTimeout(function() { var lis = ''; var t; for (var i = 1; i <= 4; i++) {
                    t = path + '/s' + i;
                    lis += '<li><a href="' + t + '">/' + t + '</a></li>'; // 或者:(这样的话 不会对地址栏有影响) // lis += '<li><a href="#" data-href="' + t + '">/' + t + '</a></li>'; } cb( '<ul class="nav">' + lis + '</ul>' );
            }, 200);
        }, callback: function() { console.log('callback:/b', this, arguments);
        }, onDestroy: function() { // 当前被销毁时调用 console.log('destroy:/b', this, arguments);
        },

        children: { /* 这些配置项 默认继承自 parent */ viewsSelector: '',
            viewClass: 'sub-view-b',
            maskClass: 'mask',
            showLoading: true,
            cacheViewsNum: 3,
            cacheTemplate: true,
            animation: true,
            aniClass: 'slide',

            routes: [
                {
                    path: '/:subB', // '/b/:bid' + '/:subB' /* 这里依旧可以设置 */ cacheTemplate: false, // 针对于当前的route,是否缓存模板 animation: true, // 针对于当前的route,是否有动画 aniClass: 'slideup', // 针对于当前的route,动画类型(效果) getTemplate: function(cb) { var that = this; setTimeout(function() { cb('<div>' + that.path + '<p>sub content</p></div>');
                        }, 200);
                    }, callback: function() { console.log('sub callback b', this, arguments);
                    }, onDestroy: function() { console.log('sub destroy b', this, arguments);
                    }
                }
            ]

        }
    }
], { /*是否缓存模板*/ cacheTemplate: true, /*views容器选择器 如果为空,或者没有符合元素,那么views的容器元素就为body了*/ viewsSelector: '', /*view的class 默认会有 page-view 的 class 这里配置的是其他增加的 class */ viewClass: 'page-view2 page-view3', /*是否有动画*/ animation: true, /*有动画的话,动画的类型*/ aniClass: 'slide', /*蒙层class 主要是显示loading时的蒙层*/ maskClass: 'mask', /*显示loading*/ showLoading: true, /*缓存view数*/ cacheViewsNum: 3 }); // 也可以通过这种形式添加 M.router.add('/ddd/{dddID:int}', function(dddID) { // 这是 callback 回调 }, {
    cacheTemplate: true, getTemplate: function() { return '/ddd/' + this.params.dddID;
    }, onDestroy: function() { // destroy }
}); /* 监听route change */ /* routeChangeStart 是刚开始的时候被触发,此时还没有调用getTemplate得到模板内容 */ M.router.on('routeChangeStart', function(currentRouteState) {

}); /*已经完成动画切换(如有动画效果的话)显示出来之后触发*/ M.router.on('routeChangeEnd', function(currentRouteState) {

}); // 开始 监听history M.history.start({ // base: '/', // base path // enablePushState: true // 启用pushstate });

关于配置

    animation、aniClass和cacheTemplate配置,依次取的是链接元素上的data-xxx->单个route规则中对一个的配置项->整体route配置规则中的配置。

examples中示例

  •  index.html: 基本使用,都是默认配置,主要是关于getTemplate的2中方式以及在链接元素加入data-rel=back(反方向动画)配置。

  •  index1.html: 在"/c"中利用data-href达到不更新浏览器地址切换示例,且演示了如何才能局部禁用动画切换效果。

  •  index2.html: 关闭动画示例。

  • index3.html: 不缓存模板示例。

  •  index4.html: 全局更改动画class示例。

  • index5.html: 局部更改动画class的两种方式示例。

  • index6.html: 局部更改缓存模板的两种方式示例。

  •  index7.html: M.history禁用掉pushstate示例。

  •  index8.html: 嵌套路由视图示例。

  • requirejs/: 使用 require.js 示例

后端渲染

    只需要在响应时加入对应的页面结构即可:

<div class="page-view">后端渲染内容</div>

    这是因为默认第一次初始化时,会查找页面上带有viewClass的元素,如果找到了,且innerHTML不为空,那么就不会再去调用getTemplate来得到模板内容了。

代码风格

    没有用空格,而是用的tab。

  • /*! * vue-router v3.1.2 * (c) 2019 Evan You * @license MIT */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof

  • 2021.8.12 坑50(vue-router4、addRoute()、router.options.routes未更新):进行动态权限获取菜单的设置,使用了addRoute()来添加路由,但是router.options.routes未更新,依然只有原来的路由列表值。 相关API简要介绍: addRoute(),添加一条新的路由记录到路由,文档: API 参考 | Vue Router (vu

  • 模式参数 在vue-router中是通过mode这一参数控制路由的实现模式的: const router = new VueRouter({ mode: 'history', routes: [...] }) 创建VueRouter的实例对象时,mode以构造函数参数的形式传入。带着问题阅读源码,我们就可以从VueRouter类的定义入手。一般插件对外暴露的类都是定义在源码src根目录下的

  • 1.router.config.js 这里存放了所有路由 import React from 'react' // import { Router, Route, IndexRoute, hashHistory, childRoutes/* , Redirect */ } from 'react-router' import {BrowserRouter as Router, Route, Swi

  • ui:antd mobile 路由:react-router-dom request请求:自带的fetch 项目创建 npx create-react-app my-app cd my-app npm start ui:antd mobile 安装 npm i antd-mobile 按需加载 一、安装customize-cra npm install react-app-rewired cus

  • 一、vue router 我们先看一下vueRouter这一个类的定义 export default class VueRouter { mode: string; // 传入的字符串参数,指示history类别 history: HashHistory | HTML5History | AbstractHistory; // 实际起作用的对象属性,必须是以上三个类的枚举 fall

  • 在本文中,我们将深入研究React Router v6,并介绍如何在React应用程序中使用它。 一、React Router v6的新特性React Router v6是React Router的最新版本,它提供了一些新的特性和改进。以下是React Router v6的一些主要特性: 改进的导航功能:React Router v6提供了一种新的导航方法,称为“useNavigate”。这个新的

  • 原文网址:Vue--Router--各个版本的事件监听_IT利刃出鞘的博客-CSDN博客 简介         本文介绍Vue-router各个版本的事件监听的区别。 问题引出         在学习vueRouter源码时发现,路由变化的监听是通过popstate或者hashchange来监听路由变化的。但在使用中发现,不同版本处理的效果不一致,比如:在3.1.6版本通过push等方法更新路由的

  • 进行登录-导入request工具函数-toast轻提示组件-mapMutations修改数据-this.$router.push() 跳转方法 toast轻提示组件:https://youzan.github.io/vant/#/zh-CN/toast 封装api src/api/user.js ——用户 相关的API调用 //注释js代码 /** *登录 *@param{string}mobil

  • 一、快速开始 返回目录 首先要创建一个 Web App #安装官方脚手架 create-react-app npm install -g create-react-app #创建项目 create-react-app demo-app #进入项目目录 cd demo-app #安装 react-router-dom npm install react-router-dom 示例1: 基础路由 返

  • /* @flow */ //用于判断是否是浏览器环境 import { inBrowser } from './dom' //保存滚动的位置(x,y). import { saveScrollPosition } from './scroll' // genStateKey 生成基于当前时间时间戳的key。 // setStateKey 更新key。 // getStateKey 获取key。

  • router的使用 this.$router.replace('/home'),无法前进后退。 this.$router.push('/home') 可以前进后退 // 路由的全局对象,包含所有的路由对象 console.log(this.$router) // 当前活跃对象 console.log(this.$route) // 点击函数中router携带参数 this.$router.rep

 相关资料
  • 本文向大家介绍前端轻量级MVC框架CanJS详解,包括了前端轻量级MVC框架CanJS详解的使用技巧和注意事项,需要的朋友参考一下 选择正确的库 创建一个JS APP没有好的工具是很有难度的,jQuery只是操作DOM的库,没有提供任何创建APP的基础,这就是为什么我们要一个类似CanJS的专门的库。 CanJS 是一个轻量级的MVC库,提供你创建一个JS APP所需的工具。 CanJS 是一个轻

  • 本文向大家介绍轻量级的Web框架Flask 中模块化应用的实现,包括了轻量级的Web框架Flask 中模块化应用的实现的使用技巧和注意事项,需要的朋友参考一下 Flask是一个轻量级的Web框架。虽然是轻量级的,但是对于组件一个大型的、模块化应用也是能够实现的,“蓝图”就是这样一种实现。对于模块化应用的实现,在Flask 0.2版本中进行了设计。本文暂时不对“蓝图”做详细的介绍,而是先从0.2版本

  • 本文向大家介绍轻量级javascript 框架Backbone使用指南,包括了轻量级javascript 框架Backbone使用指南的使用技巧和注意事项,需要的朋友参考一下 Backbone 是一款基于模型-视图-控制器 MVC 模式的轻量级javascript 框架 ,可以用来帮助开发人员创建单页Web应用。 借助Backbone 我们可以使用REST的方式来最小化客户端和服务器间的数据传输,

  • 问题内容: 是否有一个提供发布/订阅模式的Java轻量级框架? 一些理想的功能 支持泛型 向发布者注册多个订阅者 API主要是接口和一些有用的实现 完全不需要内存,持久性和事务保证。 我了解JMS,但这对我来说太过分了。发布/订阅的数据是文件系统扫描的结果,扫描结果被馈送到另一个组件进行处理,然后在将其馈给另一个组件之前进行处理,依此类推。 编辑:所有在同一过程中。bean的PropertyCha

  • 本文向大家介绍简单介绍Python的轻便web框架Bottle,包括了简单介绍Python的轻便web框架Bottle的使用技巧和注意事项,需要的朋友参考一下 基本映射 映射使用在根据不同URLs请求来产生相对应的返回内容.Bottle使用route() 修饰器来实现映射. 运行这个程序,访问http://localhost:8080/hello将会在浏览器里看到 "Hello World!".

  • 本文向大家介绍超好用轻量级MVC分页控件JPager.Net,包括了超好用轻量级MVC分页控件JPager.Net的使用技巧和注意事项,需要的朋友参考一下 JPager.Net  MVC好用的轻量级分页控件,好用到你无法想象,轻量到你无法想象。 JPager.Net  MVC好用的轻量级分页控件,实现非常简单,使用也非常简单。 JPager.Net  MVC好用的轻量级分页控件,代码精心推敲,经多