小程序框架WePY 从入门到放弃踩坑合集
小程序框架WePY 从入门到放弃踩坑合集
一点点介绍WePY
因为小程序的语法设计略迷,
所以x1 模块化起来并不方便,
所以x2 各厂就出了不少的框架用以方便小程序的开发,
腾讯看到别人家都出了框架了那看来我的小程序可能真的不太方便开发咯,那我也出一个吧
所以x3 WePY 就这么横空出世了。
那小鹅鹅 你早干嘛去了啊,为什么不把小程序设计的好用一点点!程序员好好玩是吧!
同样是仿原生应用你就不能学学人家Electron 把界面交给网页原生HTML 去处理么,搞一堆贼没用组件各种奇奇怪怪的问题。。
程序员何苦为难程序猿啊
不好意思激动了
上面 都是我吹的其实WePY 是最早的小程序框架之一
WePY 是一个开发风格类似Vue.js, 支持类似Props, Mixin, Computed, Slot 等特性的风格开发,
支持组件化/模块化,NPM 依赖,Promise/Async, ESnext, Less/Sass/Styus, Babel/Typescript 的一个小程序开发框架。
语法上类似Vue.js 多一点,作为一个React 党我并没有很喜欢,但可能Vue 党也不一定就喜欢。
毕竟它只是像,并没有很一样,开发起来跟做连连看似的跟Vue.js 各种行为不一致。。
闲话就说到这了,开始说正事。
那些要注意的点
此节内容参考 小色小魔 于 2018-03-20 发布在 Segmentfault 的文章 Wepy-小程序踩坑记
ALL CREDIT GOES TO HIM THANKS ALOT
首先是文档类:
然后是一些要点:
1. Data 及数据绑定
1.1 对于可能用到的所有数据要预先给值,即要先在data 中初始化;否则之后更新数据时将不会触发脏数据检查流程,也就不会触发页面重渲染。
1.2 更新数据时可以直接用 this.foo = bar, 不用微信原生的 this.setData 方法。
class Fn extends wepy.page {
data = {
foo: 1,
// bar: 2, 此处不声明 bar
}
someFunction() {
// 页面更新
this.foo = 10;
// 这不生效
this.bar = 20;
}
}
1.3 数据在模板中进行绑定时可以用 :foo=bar 的形式进行绑定。注意非字符类型的(比如说布尔值)及变量要加双大括号,否则当成字符串处理。其他的非绑定的,要直接显示的内容可直接用双大括号包住即可。双大括号内可进行简单的运算,但不支持JS 模板字符串或其他方法运算。
// Template
<component :name="{{myName}}"> // 绑定数据
// 正常:渲染内容
{{Greeting}}
// 正常:渲染内容
{{Greeting + 'World!'}}
// 报错:不支持 JS模板字符串
{{`${Greeting} World!`}}
// 报错:不支持 JS 方法调用
{{String(Greeting).trim()}}
</component>
// Script
class Foo extends wepy.page {
data = {
myName: 'WePY',
greetings: 'Hello',
}
}
1.4 操作方法用 @tap=function 的形式进行绑定。基本上所有微信原生的方法 bindFn=fn 都可以直接写成 @Fn=fn.
// Template
// 原生的 bindtap=fn
<view @tap="fn"></view>
// Script
class Foo extends wepy.page {
methods = {
fn: () => {},
}
}
2. Methods & Computed
2.1 class 中的methods 中只包含模板用的事件方法,其他的自定义方法应该与methods 本身平级,处于顶层。
// Template
<view @tap="fn"></view>
// Script
class Foo extends wepy.page {
methods = {
fn: () => {
this.doSomeThing();
},
}
doSomeThing: () => {}
}
2.2 模板事件提供了“方法后缀”作为语法糖以代替原生写法,有.default, .stop 和 .user 后缀,比较常用的是 .stop,相当于原生的 catch.
// Template
// .default 可不写
<view @tap="fn"></view>
// .stop 相当于 catch, 点击事件到此结束,不会向上层组件冒泡
<view @tap.stop="fn"></view>
2.3 此外还提供了computed 及watcher 基本与Vue.js 类似,就不介绍了~
3. Mixin & Components
3.1 Mixin 有后端编程的小伙伴应该会比较熟悉一点,可以将通用方法提供给不同地方使用。在这里它能直接读取共有的数据(比如说从Redux 里读取的内容等)但使用时要注意当Mixin 中用到了来自Redux 中的数据时,数据本身的connect 要在其具体引用到的页面里面定义,貌似Mixin 本身并不能将Redux 中的数据connect 进来。
3.2 Mixin 中的methods 中不能直接使用 this.foo = bar 去设置页面中的值,因为上下文不一致了不会生效。
3.3 Mixin 中的执行顺序与Vue.js 中的相反。Vue.js 中是先执行Mixin 中的函数, 再执行组件本身的函数。这里执行顺序相反。
补充:Vue.js 中对于钩子函数,会先执行Mixin 中的,再执行组件自身的;
Vue.js 中methods 如果和Mixin 同名,那么只会执行自身的方法。
3.4 组件在 import 时不要带后缀名:
// Good ;-)
import Xxx from '../xx';
// Damned :-(
import Xxx from '../xx.wpy';
3.5 最让人懊恼的东西来了—— WePY 中的组件。它是组件全是“单例”的,这意味着当你在同一个页面中去使同一个组件多次时,显示出来的那“多”个组件它绑定的内容都会被更新成最后一个,你不能给他们绑定到不同的内容上,你用组件时只能享受到样式上的优势,完全不知所想何物♂️
// Template
<view wx:for="{{list}}">
<comp :number.sync="{{item}}"></comp> // 你也不能这样做,因为它不接受变量
</view>
// Script
import Comp from '../Comp';
class Foo extends wepy.page {
data = {
list: [1, 2, 3, 4],
}
components = {
comp: Comp,
}
}
难受 = =||
3.6 对于原生及非原生组件,它的模板逻辑也总是“看上去不那么固定”的,比如说:
// 正确 - 省略为 true
<scroll-view scroll-y></scroll-view>
// 错误 - 布尔值不能带括号
<scroll-view scroll-y="{{true}}"></scroll-view>
// 正确 - 估计这里实际上可能 "true" 是被忽略了的
<scroll-view scroll-y="true"></scroll-view>
// 正确 - 但此时这个方法接受到的第一个参数为当前Class的实例,坑爹啊
<view @tap="toggleSomeThing"></view>
// 错误 - 布尔值要带括号
<view @tap="toggleSomeThing(true)"></view>
// 正确
<view @tap="toggleSomeThing({{true}})"></view>
3.7 还有一个偶发的情况是 wx:if 时,class 等其他属性偶发会被“忽略掉”。
// 正常
<view wx:if="{{something === 'foo'}}" class="foo">
// 偶尔会不正常,class 被忽略掉了
<view class="bar" wx:if="{{something === 'bar'}}">
所以总体上比较建议将条件先写出来,后面再加其他属性,或者直接用 block 标签去作为条件判断。
3.8 Page 继承自Component, 但Page 扩展了页面所特有的 config 配置以及特有的页面生命周期函数等;所以Component 和Page 之间基本一样,但Component 没有 onLoad 等生命周期。
4. This 及内定方法
4.1 更新数据时可以直接用 this.foo = bar, 不用微信原生的 this.setData 方法。
4.2 所有可能发生异步的地方修改数据后要手动促发脏数据检查流程,否则不会促发页面重渲染。
常见的地方有请求后更新,setTimeOut, getStorageSync 等等~
5. canvas & base64
Canvas 的相关操作和微信原生一样,参照 这里 即可:
ArrayBuffer 和 Base64 互转:
从 v1.1.0 (2017.03.31) 版本就有这两个 API 了,可以直接用:
wx.arrayBufferToBase64
wx.base64ToArrayBuffer
6. 其他,一点开发建议
6.1 小程序内部定义的实例API 都以 $ 开头,所以我们命名时也不应该以 $ 开头,以便区分。
6.2 同样的,如果用了Redux, 那么connect 进来的方法也会是通过 this.methods.fn() 的形式访问,建议也得区分开比较好,比如说页面及组件中的方法加bind 前缀。像这样:
// Redux Action
this.methods.function();
// Page Methods
this.methods.bindFunction();
开发中写的一些有用的 Snippets
跨页面通讯
这是小程序原生的代码,用于更新前一个页面中的Data 值
应用场景比如说有一个表单类的页面,其中的某个字段可以点到另外一个全屏的界面去编辑
改完了保存后会回到当前的页面中继续编辑其他的字段
// 获取当前页面栈的实例 <Array>
let crtPage = getCurrentPages();
// 得到上一个页面实例 <Object>
let prevPage = crtPage[crtPage.length - 2];
// 设置前一个页面中的数据
prevPage.setData({note: this.value});
/*
* 这个做法可以正常设置前一个页面中的Data 的值,
* 但如果那个页面中的那个Data 是用作Props 传给组件的话
* 组件中的值并不会跟着更新成新的值
*/
正则解析城市字符串,用于微信原生省市选择组件
因为有个项目的后端是保存的类似 "上海市上海市徐汇区" 的值
但微信的组件使用的value 却是类似 ['上海市', '上海市', '徐汇区'] 这样的数组
为了保证修改时能正确显示上次设置的内容所以就有了这么一个东西
/*
* Parse String to Wechat City Array
*
* @param:
* city <String>: '上海市上海市徐汇区'
*
* @return:
* <Array> ['上海市', '上海市', '徐汇区']
*/
const parseRegion = (city) => {
let str = city;
let region = [];
let reg = [
/\S[^省|市|区]+[省|市|区]/,
/\S[^市|区]+[市|区]/,
/\S[^市|区|县]+[市|区|县]/,
];
for (let r of reg) {
const rs = r.exec(str);
if (rs !== null) {
region.push(rs[0]);
str = str.replace(rs[0], '');
}
}
return region;
};
URL 参数序列化
用途:当小程序需要栏截操作时,临时保存传入的参数
// onLoad(op) { this.op = op; }
// reLaunch 时 url = some-url + '?' + this.serializer(this.op)
serializer = (data = {}) => (
Object.entries(data).map(
([key, value]) => (
value !== undefined
? `${key}=${encodeURIComponent(value)}`
: ''
)
)
.filter((item) => (item))
.join('&')
);
小程序框架WePY 从入门到放弃踩坑合集的更多相关文章
- 对小程序框架WePY的精简总结
一.注意点 关闭ES6转ES5关闭上传代码时样式自动补全关闭代码压缩上传本地开发选择dist目录,dist目录也用在开发者工具上实时预览和调试WePY框架对应的开发目录为src二.代码规范 - 变量方 ...
- 微信小程序框架——wepy使后感
更新:2018年1月10日15:32:22 在ios8及部分机型下会有样式混乱的问题,经查找,原因是缺少浏览器前缀,需要加prefix. 解决方案见链接:wepy-less-autoprefix 另外 ...
- 带坑使用微信小程序框架WePY组件化开发项目,附带第三方插件使用坑
纯粹用来记录wepy及相关联内容,以防再犯~ 1. 接手的wepy项目版本是 1.7.2 ,so我没有初始化的过程.... 2. 安装wepy命令工具,npm install wepy-cli -g ...
- 微信小程序点击保存图片到本地相册——踩坑
在微信小程序中要保存图片到本地相册,需要获取相册权限. 总之整个功能实现下来需要如下几个小程序的API:wx.getSetting,wx.authorize,wx.openSetting,wx.dow ...
- 认识WebStorm-小程序框架wepy
WebStorm是一个功能强大的IDE,适用于JavaScript开发,适合使用Node.js进行复杂的客户端开发和服务器端开发. WebStorm具有对JavaScript,HTML, CSS及其现 ...
- 【WePY小程序框架实战四】-使用async&await异步请求数据
[WePY小程序框架实战一]-创建项目 [WePY小程序框架实战二]-页面结构 [WePY小程序框架实战三]-组件传值 async await 是对promise的近一步优化,既解决了promise链 ...
- 【WePY小程序框架实战三】-组件传值
[WePY小程序框架实战一]-创建项目 [WePY小程序框架实战二]-页面结构 父子组件传值 静态传值 静态传值为父组件向子组件传递常量数据,因此只能传递String字符串类型. 父组件 (paren ...
- 【WePY小程序框架实战二】-页面结构
[WePY小程序框架实战一]-创建项目 项目结构 |-- dist |-- node_modules |-- src | |-- components |-- a.wpy |-- b.wpy |-- ...
- 零基础入门 实战mpvue2.0多端小程序框架
第1章 课程快速预览(必看!!!)在这一章节中,老师讲带领你快速预览课程整体.其中,涉及到为什么要做这么一门实战课程.制作一个小程序的完整流程是怎么样的,以及如何做项目的技术选型. 第2章 30 分钟 ...
随机推荐
- 从“信息化”到“智慧化”,GVS视声将如何赋能智慧医院?
4月23日-25日,2021年中华医院信息网络大会(CHINC)盛大举办,今年首次携手中国医院建筑与装备创新发展大会,同期同地亮相杭州国际博览中心,塑造了全新的"双引擎"品牌盛会. ...
- python 数据写入json文件时中文显示Unicode编码问题
一.问题描述 import json dir = { '春晓':'asfffa', '春眠不觉晓' : '处处闻啼鸟', '夜来风雨声' : 56789, 'asdga':'asdasda' } fp ...
- Pytest测试框架入门到精通(一)
Python测试框架之前一直用的是unittest+HTMLTestRunner,听到有人说Pytest很好用,所以这边给大家介绍一下Pytest的使用 pytest是一个非常成熟的全功能的Pytho ...
- 5000字长文,kurryluo 的自学编程之路
我是程序员.大众口中非科班的那种,带着高中时期对二进制的恐惧,在大学参加科研比赛后保研,再到和校友一起创业,现在在某大型互联网公司做前端开发,一路走来都是靠自己学习. 前端框架 VUE 的作者尤大说过 ...
- Shiro安全框架「快速入门」就这一篇
Shiro 简介 照例又去官网扒了扒介绍: Apache Shiro is a powerful and easy-to-use Java security framework that perfor ...
- Flask一分钟Mock一个API
如果安装了Python,并且安装了Flask: pip install flask 那么就可以在短短一分钟内Mock出来一个API,而且只需要用到一个文件. 彻底告别在线Mock网站无法指定请求方法, ...
- 剖析虚幻渲染体系(06)- UE5特辑Part 1(特性和Nanite)
目录 6.1 本篇概述 6.1.1 本篇内容 6.1.2 基础概念 6.2 UE5新特性 6.2.1 UE5编辑器 6.2.1.1 下载编辑器及资源 6.2.1.2 启动示例工程 6.2.1.3 编辑 ...
- hive学习笔记之三:内部表和外部表
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 《机器学习Python实现_10_10_集成学习_xgboost_原理介绍及回归树的简单实现》
一.简介 xgboost在集成学习中占有重要的一席之位,通常在各大竞赛中作为杀器使用,同时它在工业落地上也很方便,目前针对大数据领域也有各种分布式实现版本,比如xgboost4j-spark,xgbo ...
- Jenkins+SonarQube实现C#代码质量检查
环境准备 SonarQube 项目创建 jenkins Windows构建节点配置 安装与SonarQube服务端相同版本jdk 安装sonar-scanner 并配置环境变量 安装Visual St ...