项目是否适合移植到小程序上?
小程序由于微信提供了一些组件,在微信中的一些体验确实不错,对于开发来说,由数据驱动的开发模式也是挺爽的。
概要介绍
其实就是类似于 VUE REACT 的 MVVM 模式,专注于数据和逻辑。
小程序开发框架的目标是通过尽可能简单、高效的方式让开发者可以在微信中开发具有原生 APP 体验的服务。
框架提供了自己的视图层描述语言 WXML 和 WXSS,以及基于 JavaScript 的逻辑层框架,并在视图层与逻辑层间提供了数据传输和事件系统,可以让开发者可以方便的聚焦于数据与逻辑上。
模板层级
请求包装
用户会话处理
实践得到的经验
规则
1.目前打包后的文件不能超过 4M,否则不能上传到微信服务器。
小程序不支持的
1.不支持 sass 语法
2.不支持 window、document,不能使用相关的库,如 jQuery、PreventMoveOverScroll。
3.不支持直接使用 svg 标签开发。image 的 src 放远程 svg 可以,background-image 里也可以。
但是可以使用 canvas 标签(canvas坑:position absolute的层盖不住canvas),可以使用的库:wx-charts(有坑,放在 app.js 中然后在 page 中引用的话,找不到 ringChart 上面的函数,如 ringChart.addEventListener。要直接在 page 中引库。)。
4.不支持阻止默认事件,没有preventDefault。
5.没有br 标签。
6.不支持table 表格。
7.不能使用 来增大文字间距。
8.小程序的xxx.wxss 文件 font-face 的 url 不接受 http 地址作为参数,可以接受base64,因此可以先将字体文件下载后,转换为 base64,然后再引用。链接。
9.像素单位为 rpx
新特性
2.text 标签认 \n 换行,不能包裹
标签,会直接输出出来,有点类似textarea。
3.小程序中 :nth-child(n) 是从 0 开始的。
4.switch 标签。但是不能改变大小样式,像老radio 标签一样讨厌。
5.picker 标签。但是在开发者工具中选项不会循环,在安卓手机预览中选项会循环。
6.scroll-view 标签。有滚动条的盒子。要想在进入页面的时候自动滚动到某处,可以使用 scroll-view 的 scroll-into-view 属性,不过一定要在 scroll-view 存在后设置才会生效,尤其是通过 template 引用的时候,比如同时通过 setData 设置使用该 template 和 scroll-into-view 的值,并不会使滚动生效。
7.关于屏幕下拉露底:Android 不会,iPhone 会。可以通过配置解决:disableScroll Boolean false 设置为 true 则页面整体不能上下滚动;只在 page.json 中有效,无法在 app.json 中设置该项。链接。
模板的作用域:模板拥有自己的作用域,只能使用 data 传入的数据。
9.在功能按钮上使用catchtap 防止冒泡
10.hidden 参数,控制蒙版的利器
小窍门
1.关于下拉刷新
要在 page.json 中设置enablePullDownRefresh: true
onPullDownRefresh 内要手动stopPullDownRefresh,否则一直在点点点(loading)。
2.page的onload 函数中有参数 options 可以获取路径的 query
3.小程序的支付和微信的支付不是一个 appid,需要后端新开发下单接口
4.wxml 最好在开发者工具编辑(有提示)。js, wxss可以在熟悉的编辑器编辑。
5.小程序中如果赋予的新值是 undefined 的话,根本不会进行赋值,也不会覆盖之前的值。如:
app.setData({
isPaperCollected: finishedQuizList['id'+quizID] || false
})
6.通过多次使用 Object.assign({}) 解决data也模块化后 data 不能深层复制的问题。
Object.assign 不是深层复制。
7.在微信web开发者工具中一定要在动作->设置->勾上“不使用任何代理,勾选后直连网络”,否则老是报“
Failed to load resource: net::ERR_NAME_NOT_RESOLVED”的bug:链接
8.每一个小程序页面也可以使用 .json 文件来对本页面的窗口表现进行配置。 页面的配置比 app.json 全局配置简单得多,只是设置 app.json 中的 window 配置项的内容,页面中配置项会覆盖 app.json 的 window 中相同的配置项。页面的 .json 只能设置 window 相关的配置项,以决定本页面的窗口表现,所以无需写window这个键。链接。
9.data是在page中设置的,不是在 app.js 中的。不涉及渲染的可以不要放 data 里面。
10.Page.prototype.setData()变更数据同时更新页面数据。
setData 函数用于将数据从逻辑层发送到视图层,同时改变对应的 this.data 的值。直接修改 this.data 无效,无法改变页面的状态,还会造成数据不一致。单次设置的数据不能超过 1024kB,请尽量避免一次设置过多的数据。
11.wx:if是惰性的,如果在初始渲染条件为false,框架什么也不做,在条件第一次变成真的时候才开始局部渲染。
会话管理
微信的网络请求接口 wx.request() 没有携带 Cookies,这让传统基于 Cookies 实现的会话管理不再适用。为了让处理微信小程序的服务能够识别会话,我们会话管理使用weapp-session-client。这需要服务端的支持。基本原理是包装 wx.request 并在 Header 上使用特殊的字段跟踪。
使用时遇到的问题:
1.微信开发者工具报错:Uncaught ReferenceError: regeneratorRuntime is not defined
原因是 Generator 函数不被支持。
* 微信开发者工具关闭ES6转ES5
* 真正解决办法,提供 regeneratorRuntime链接1--链接2
2.题外话:善用 Promise
本项目后端处理会话管理时要求发送请求时不能使用相同的 X-WX-Code发送多次全部header数据,RawData、Signature等,否则报错。
所以使用 weapp-session-client 登录的时候要等login返回之后再发送其他的请求,
小程序加载后立即顺序执行 app.js 和 page.js 里面的配置,但是 wx request 是异步的,所以有可能 page 中的请求开始执行时 app.js 中的 login 还没结束,就会导致 bug。
可以使用个 promise 解决掉。
进阶
2.疑问:微信切换账号会不会销毁小程序
3.检查TLS版本的问题
http://www.dongcoder.com/detail-410653.html
解决方法:微信开发者工具勾选开发时不检查检查TLS版本或后端配置
4.蓝牙、震动的调用
5.蒙版处理
网友评论