小程序框架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 分钟 ...
随机推荐
- VB 老旧版本维护系列---迷之集合- ArrayList
迷之集合- ArrayList '定义一个字符串 Dim dataType_ImageStr As String = "2023,2091,2092,2096,2212" '将字符 ...
- 如何打造高性能的 Go 缓存库
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/531 文中代码位置: https://github.com/devY ...
- AJAX第二天笔记
AJAX day1 jquery中的ajax 拦截请求: $.ajaxPrefilter() jquery方法请求参数的本质: 无论我们填写的何种形式的参数,都会被jQuery转换成查询字符串形式传 ...
- Vue.js源码解析-Vue初始化流程
目录 前言 1. 初始化流程概述图.代码流程图 1.1 初始化流程概述 1.2 初始化代码执行流程图 2. 初始化相关代码分析 2.1 initGlobalAPI(Vue) 初始化Vue的全局静态AP ...
- Redis五种基础与三种高级数据结构解析
记得点赞+关注呦. 前言 在 Redis 最重要最基础就属 它丰富的数据结构了,Redis 之所以能脱颖而出很大原因是他数据结构丰富,可以支持多种场景.并且 Redis 的数据结构实现以及应用场景在面 ...
- redis为什么要提供pipeline功能
通常我们用redis做接口缓存后,查询接口的性能就能提升到ms级别: 但是redis是纯内存操作啊,总不至于要到ms吧,根据官方的 benchmark 单实例也是能抗 7w+ qps 也就是说单个re ...
- 安装Apache、Nginx和PHP-基于Centos7环境
使用的软件:putty或Xshell都可. 一.搭建Apache 1.编译安装 (1).安装编译器 yum install -y gcc (2)安装Opensll 查询官网得到OpenSSL下载网址h ...
- MVC,MVVM模式的理解
基本上,我们的产品就是通过接口从数据库中读取数据,然后将数据经过处理展示到用户看到的视图上.当然我们还可以从视图上读取用户的输入,然后通过接口写入到数据库.但是,如何将数据展示到视图上,又如何将用户的 ...
- 【原创】SystemVerilog中的多态和虚方法
封装可以隐藏实现细节,使代码模块化,继承可以扩展已经存在的代码模块,目的都是为了代码重用.多态是为了实现接口的重用.在SystemVerilog中,子类和父类之间多个子程序使用同一个名字的现象称为Sy ...
- Unity的AnimationCurve
转自:风宇冲Unity3D教程学院http://blog.sina.com.cn/s/blog_471132920101f8nv.html,本文有多处增删减改,详细内容请查看原文. 1.介绍 Anim ...