微信小程序开发实战教程之手势解锁


Posted in Javascript onNovember 18, 2016

微信小程序开发实战教程之手势解锁

代码:https://github.com/jsongo/wx-gesture-lock

这个手势解锁的demo使用了https://github.com/lvming6816077/H5lock 这个项目的算法和主逻辑,整合到微信小程序来,修改了很多地方的语法来适配小程序,去掉了window、document等函数,同时也添加了新的机制来解耦界面的操作和第三方库,这个下面会介绍到。

不过可惜的是,这个demo也只能在开发工具上玩玩,到真机上测试的时候,手指一滑动,页面会跟着滚动,手势没法使用。

下面我们从这个例子中,来分析两个可以学习的点。

1、引入第三方库

我们上面提到的H5lock这个库,是个大神写的、专给H5用的一个功能。我们对它进行了一翻修改,把它引入到小程序上来了。

这里讨论下如何把第三方js库引入到小程序来,分以下几个步骤:

(1)模块化

小程序代码中,只能通过module.exports来导出的模块才能被引用,所以第一步,我们要对代码进行第一个改造,做exports导出:

module.exports = {
...
}
如果要在被引入的时候,执行一些操作,可以用以下两种方式:
//// mylib.js
module.exports = (function() {
// 这里写上你要执行的代码
…
return xxx; //返回你要导出的方法,如果多个就写成一个map
})();
…
//// 其它文件中这么引用和执行:
let MyLib = require('mylib.js');
let lib = Mylib();
lib.xxx(); // 执行
或es6中的class:
//// mylib.js
module.exports = class {
constructor() { // 
// 这里写上你要执行的代码
}
// 其它方法
xxx() { 
...
}
}
…
//// 其它文件中这么引用和执行:
let MyLib = require('mylib.js');
let lib = new Mylib(); // 用new来生成类的对象
lib.xxx(); // 执行

(2)对第三方库中的一些函数进行改造

小程序不支持以下几个函数或api:

window
document
frames
self
location
navigator
localStorage
history
caches
screen
alert
confirm
prompt
XMLHttpRequest
WebSocket

跟以上相关的代码一个个搜索出来,并想办法替换掉。

最常见的一般是document操作,第三方库主要是用它来引用dom,并对它进行设置或修改。这个可以通过下面第2点会讲的解耦技巧来巧妙地绕过。其它的就靠开发者自己去想了,这里没办法一一列出所有的情况。

本文的demo用的是class的方式来改造了第三方库。

2、一种解耦的方式

在小程序开发的时候,如果一个页面的js写得太长,甚至超过了上千行,那你就要考虑把这个文件分拆成几个。或者你写的逻辑代码,可以几个页面共用,那么你也是要把代码从这个页面的js里拆出来的。

这里就引出了一个比较显明的问题:在其它文件中,要修改页面上的数据,又不能耦合性太大,因为你的这段逻辑代码,在页面A中会引用到,在页面B中也会引用到,这样总不能把setData操作放到这个共用的文件里吧。

那有什么办法可以解耦呢?

这个时候,可能你会想到普通页面开发时,用到的trigger机制,可惜这个只能在dom上绑定。也或许你用过http://statejs.org/ 这个库,通过状态机的变化来触发某些特定的操作,这个方法非常巧妙,没接触过这个库的开发者,建议学习一下。

不过我们还不需要再引入一个库,这里,我们来写个简单的。简单到只有几行代码。

代码在这里:https://github.com/jsongo/wx-gesture-lock/blob/master/lib/event.js

module.exports = function(app) {
app && (app.trigger = function(eventType, data) {
var pages = getCurrentPages(),
curPage = pages[pages.length-1],
methodName = 'on' + eventType.charAt(0).toUpperCase() + eventType.substr(1),
callback = curPage[methodName];
callback && callback.call(curPage, data);
});
};

如何使用这个库?分析一下大概的过程,其实非常简单,就是给app添加一个trigger方法,当它被调用的时候,去查找当前页面是否在onXXX方法,有的话就调用。这个方法名,是通过eventType这个参数变形而成的,如app.trigger('textChange') ,则这里会去查找页面中是否有onTextChange方法。所以其实这个解耦方法,本质上,是定义了一种规范。

首页在app.js里引入,并在onLaunch里调用:

var event = require('lib/event.js');
App({
onLaunch: function () {
event(this); // 在onLaunch里调用,传入的this就是app本身
},
globalData:{
}
});

然后在共用的抽离出来的文件中,在需要用到setData的地方,写成如下形式:

app.trigger('titleChanged', '请解锁');

接着在页面的js代码里,添加对这个trigger的响应:

Page({
…
onTitleChanged: function(newTitle) { // 文字变化的事件,自定义
this.setData({
title: newTitle
});
}
...
});

这三步做完就ok了。

以上所述是小编给大家介绍的微信小程序开发实战教程之手势解锁,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JQuery 确定css方框模型(盒模型Box Model)
Jan 22 Javascript
jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
Jul 28 Javascript
用js来刷新当前页面保留参数的具体实现
Dec 23 Javascript
jquery使用jxl插件导出excel示例
Apr 14 Javascript
两种方法实现在HTML页面加载完毕后运行某个js
Jun 16 Javascript
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
Oct 14 Javascript
Bootstrap 组件之按钮(二)
May 11 Javascript
AngularJS路由Ui-router模块用法示例
May 29 Javascript
微信小程序 获取二维码实例详解
Jun 23 Javascript
JS关于刷新页面的相关总结
May 09 Javascript
vue 实现cli3.0中使用proxy进行代理转发
Oct 30 Javascript
Vue开发环境跨域访问问题
Jan 22 Javascript
JavaScript之WebSocket技术详解
Nov 18 #Javascript
仿iframe效果Aajx文件上传实例
Nov 18 #Javascript
JavaScript之cookie技术详解
Nov 18 #Javascript
js前端解决跨域问题的8种方案(最新最全)
Nov 18 #Javascript
js前端实现多图图片上传预览的两个方法(推荐)
Nov 18 #Javascript
js实时获取窗口大小变化的实例代码
Nov 18 #Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
Nov 18 #Javascript
You might like
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
2011/07/18 PHP
浅析memcache启动以及telnet命令详解
2013/06/28 PHP
php bootstrap实现简单登录
2016/03/08 PHP
详解使用php调用微信接口上传永久素材
2017/04/11 PHP
PHP基于GD2函数库实现验证码功能示例
2019/01/27 PHP
php常用日期时间函数实例小结
2019/07/04 PHP
php扩展开发入门demo示例
2019/09/23 PHP
Javascript 函数对象的多重身份
2009/06/28 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
2015/12/31 Javascript
jquery UI Datepicker时间控件的使用及问题解决
2016/04/28 Javascript
jquery插件bootstrapValidator数据验证详解
2016/11/09 Javascript
gulp解决跨域的配置文件问题
2017/06/08 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
js中getBoundingClientRect的作用及兼容方案详解
2018/02/01 Javascript
vue2实现搜索结果中的搜索关键字高亮的代码
2018/08/29 Javascript
clipboard在vue中的使用的方法示例
2018/10/19 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
ES2020 已定稿,真实场景案例分析
2020/05/25 Javascript
js+canvas实现转盘效果(两个版本)
2020/09/13 Javascript
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
Python自动化运维_文件内容差异对比分析
2017/12/13 Python
Python实现的求解最小公倍数算法示例
2018/05/03 Python
PyQt5通信机制 信号与槽详解
2019/08/07 Python
Pytorch 中retain_graph的用法详解
2020/01/07 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
python里反向传播算法详解
2020/11/22 Python
新百伦折扣店:Joe’s New Balance Outlet
2016/08/20 全球购物
美国销售第一的智能手机和平板电脑保护壳:OtterBox
2017/12/21 全球购物
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
党员四风问题对照检查材料
2014/09/27 职场文书
医院领导班子整改方案
2014/10/01 职场文书
师范生见习报告
2014/10/31 职场文书
幼儿园欢迎词范文
2015/01/26 职场文书
2015年学校图书室工作总结
2015/05/19 职场文书
MySQL系列之十一 日志记录
2021/07/02 MySQL
JavaScript实现外溢动态爱心的效果的示例代码
2022/03/21 Javascript