小程序框架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

首先是文档类:

WePY首页

WePY官方文档

小程序官方文档

WePY Github Issues

然后是一些要点:

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 从入门到放弃踩坑合集的更多相关文章

  1. 对小程序框架WePY的精简总结

    一.注意点 关闭ES6转ES5关闭上传代码时样式自动补全关闭代码压缩上传本地开发选择dist目录,dist目录也用在开发者工具上实时预览和调试WePY框架对应的开发目录为src二.代码规范 - 变量方 ...

  2. 微信小程序框架——wepy使后感

    更新:2018年1月10日15:32:22 在ios8及部分机型下会有样式混乱的问题,经查找,原因是缺少浏览器前缀,需要加prefix. 解决方案见链接:wepy-less-autoprefix 另外 ...

  3. 带坑使用微信小程序框架WePY组件化开发项目,附带第三方插件使用坑

    纯粹用来记录wepy及相关联内容,以防再犯~ 1. 接手的wepy项目版本是 1.7.2 ,so我没有初始化的过程.... 2. 安装wepy命令工具,npm install wepy-cli -g ...

  4. 微信小程序点击保存图片到本地相册——踩坑

    在微信小程序中要保存图片到本地相册,需要获取相册权限. 总之整个功能实现下来需要如下几个小程序的API:wx.getSetting,wx.authorize,wx.openSetting,wx.dow ...

  5. 认识WebStorm-小程序框架wepy

    WebStorm是一个功能强大的IDE,适用于JavaScript开发,适合使用Node.js进行复杂的客户端开发和服务器端开发. WebStorm具有对JavaScript,HTML, CSS及其现 ...

  6. 【WePY小程序框架实战四】-使用async&await异步请求数据

    [WePY小程序框架实战一]-创建项目 [WePY小程序框架实战二]-页面结构 [WePY小程序框架实战三]-组件传值 async await 是对promise的近一步优化,既解决了promise链 ...

  7. 【WePY小程序框架实战三】-组件传值

    [WePY小程序框架实战一]-创建项目 [WePY小程序框架实战二]-页面结构 父子组件传值 静态传值 静态传值为父组件向子组件传递常量数据,因此只能传递String字符串类型. 父组件 (paren ...

  8. 【WePY小程序框架实战二】-页面结构

    [WePY小程序框架实战一]-创建项目 项目结构 |-- dist |-- node_modules |-- src | |-- components |-- a.wpy |-- b.wpy |-- ...

  9. 零基础入门 实战mpvue2.0多端小程序框架

    第1章 课程快速预览(必看!!!)在这一章节中,老师讲带领你快速预览课程整体.其中,涉及到为什么要做这么一门实战课程.制作一个小程序的完整流程是怎么样的,以及如何做项目的技术选型. 第2章 30 分钟 ...

随机推荐

  1. Yolov4性能分析(上)

    Yolov4性能分析(上) 一.目录 实验测试 1) 测试介绍 2) Test 3) Train 二.   分析 1.实验测试 1. 1  实验测试方法 Yolov4训练train实验方法(Darkn ...

  2. 容斥+dp (一)

    ARC115 E AtCoder Problem Statement Given is a sequence of \(N\) integers \(A_1\),\(A_2\),...,\(A_N\) ...

  3. JUC 并发编程--04 常用的辅助类CountDownLatch , CyclicBarrier , Semaphore , 读写锁 , 阻塞队列,CompletableFuture(异步回调)

    CountDownLatch 相当于一个减法计数器, 构造方法指定一个数字,比如6, 一个线程执行一次,这个数字减1, 当变为0 的时候, await()方法,才开始往下执行,, 看这个例子 Cycl ...

  4. Netty 面试题 (史上最全、持续更新)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  5. Java双重循环

    在实际开发中我们常常遇到这样的问题,有A.B两个集合,这两个集合的某一个字段是相同的,要把A集合和B进行匹配,然后把A的值赋值给B例如: //上传图片 List<MultipartFile> ...

  6. Mybati-Plus的用法 记录

    参考文件下载地址:  https://files.cnblogs.com/files/bulter/MyBatis-Plus.zip --------------------------------- ...

  7. 源码学习之noop

    /** * Perform no operation. * Stubbing args to make Flow happy without leaving useless transpiled co ...

  8. Java并发之ReentrantLock源码解析(二)

    在了解如何加锁时候,我们再来了解如何解锁.可重入互斥锁ReentrantLock的解锁方法unlock()并不区分是公平锁还是非公平锁,Sync类并没有实现release(int arg)方法,这里会 ...

  9. Oracle数据泵导出数据库

    Oracle数据泵导出数据库 特别注意:如果后续要导入的数据库版本低,所有导出命令就需要在后面加一个version=指定版本. 例如从11g导出数据导入到10g,假设10g具体版本为10.2.0.1, ...

  10. Terraform插件Provider管理,搜索、定义、下载

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 简介 最近工作中用到了Terraform,权当学习记录一下,希望能帮助到其它人. Terraform系列文章如下: Ter ...