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


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 弹出层注册页面等(asp.net后台)
Jun 17 Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
Oct 17 Javascript
js 获取class的元素的方法 以及创建方法getElementsByClassName
Mar 11 Javascript
分享我对JS插件开发的一些感想和心得
Feb 04 Javascript
javascript类型系统_正则表达式RegExp类型详解
Jun 24 Javascript
Yarn的安装与使用详细介绍
Oct 25 Javascript
Angular.js之作用域scope'@','=','&'实例详解
Feb 28 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
Jan 26 Javascript
解决vue打包之后静态资源图片失效的问题
Feb 21 Javascript
老生常谈JavaScript获取CSS样式的方法(兼容各浏览器)
Sep 19 Javascript
小程序云开发之用户注册登录
May 18 Javascript
Vue scoped及deep使用方法解析
Aug 01 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
php 删除数组元素
2009/01/16 PHP
php 空格,换行,跳格使用说明
2009/12/18 PHP
php递归创建和删除文件夹的代码小结
2012/04/13 PHP
php采用file_get_contents代替使用curl实例
2014/11/07 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
laravel解决迁移文件一次删除创建字段报错的问题
2019/10/24 PHP
解析URI与URL之间的区别与联系
2013/11/22 Javascript
JavaScript onkeypress事件入门实例(按下或按住一个键盘按键)
2014/10/17 Javascript
jQuery模拟原生态App上拉刷新下拉加载更多页面及原理
2015/08/10 Javascript
jQuery实现的淡入淡出二级菜单效果代码
2015/09/15 Javascript
jquery判断滚动条距离顶部的距离方法
2018/09/05 jQuery
vue forEach循环数组拿到自己想要的数据方法
2018/09/21 Javascript
详解angular2.x创建项目入门指令
2018/10/11 Javascript
JavaScript之实现一个简单的Vue示例
2019/01/17 Javascript
Vue CLI 2.x搭建vue(目录最全分析)
2019/02/27 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
javascript实现异形滚动轮播
2019/11/28 Javascript
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
举例介绍Python中的25个隐藏特性
2015/03/30 Python
Python单例模式实例详解
2017/03/01 Python
Python实现计算圆周率π的值到任意位的方法示例
2018/05/08 Python
Django框架的中的setting.py文件说明详解
2018/10/15 Python
python实现大学人员管理系统
2019/10/25 Python
Tensorflow获取张量Tensor的具体维数实例
2020/01/19 Python
为什么黑客都用python(123个黑客必备的Python工具)
2020/01/31 Python
美国畅销的跑步机品牌:ProForm
2017/02/06 全球购物
酒店前厅员工辞职信
2014/01/08 职场文书
银行领导证婚词
2014/01/11 职场文书
2014班子“三严三实”对照检查材料思想汇报
2014/09/18 职场文书
2014年收银工作总结
2014/11/13 职场文书
销售会议开幕词
2015/01/28 职场文书
公司经营目标责任书
2015/01/29 职场文书
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
这样写python注释让代码更加的优雅
2021/06/02 Python
JavaScript实现简单的音乐播放器
2022/08/14 Javascript