相较于原生将js、wxss、wxml、json配置分开,wepy采用单文件模式,很贴近vue语法,对es6、css预处理器等的支持效率提升很多,但是坑也是有很多,记录下避免重复踩坑浪费时间。
页面实例与组件实例继承要对应
在写组件时把组件写成继承自wepy.page,导致组件无法渲染
1  | // 页面继承自wepy.page  | 
Page页面实际上继承自Component组件,即Page也是组件。除扩展了页面所特有的config配置以及特有的页面生命周期函数之外,其它属性和方法与Component一致,但声明继承不能错。
1  | import wepy from 'wepy';  | 
props静态与动态传值
静态传值为父组件向子组件传递常量数据,因此只能传递String字符串类型
1  | <child title="mytitle"></child>  | 
动态传值像Vue,但是传的数据需要是在父组件声明过或者引用类型,不能直接传Boolean、Number等基础类型
1  | // 正确:  | 
同一页面重复引用同一组件相关问题
循环渲染使用
循环渲染组件时必须使用wepy特有的辅助标签<repeat>,而不是使用原生的wx:for
1  | <repeat for="{{list}}" key="index" index="index" item="item">  | 
重复引用需为每个组件声明ID
Wepy中的组件都是静态组件,是以组件ID作为唯一标识的,每一个ID都对应一个组件实例。
当页面引入两个相同ID的组件时,这两个组件共用同一个实例与数据,当其中一个组件数据变化时,另外一个也会一起变化。
这也是不同于vue的地方,当同一页面使用同一组件较多次时,这就很难受了。
如果需要避免这个问题,必须需要分配多个组件ID和实例:
1  | <template>  | 
组件内动态绑定class,且类名含”-“时,渲染会自动加上ID
1  | 
  | 
最终index.wpy会被渲染成wxml:
1  | <view>  | 
解决方法是不用横杠的类名,改用驼峰或单个单词等。
改组件名后,wepy报组件找不到错
改动组件名时wepy有时不会立即生成wxml,这时候看dist生成的wxml是没有文件或者文件不对,可删除dist中的对应wxml文件,手动触发wpy文件改动就可以了。
组件中引用组件时,最底层组件变动有时不会触发上层或上几层页面的热加载
不触发热加载很坑,应该是嵌套多层的原因,ctrl+c再run dev重新跑项目,不行就删了dist中的组件再重新编译。
异步函数中更新数据,必须手动调用$apply(),才会触发脏数据检查
wepy对原生API进行了promise处理,但也有一些问题
在原生API中往往是采用回调的形式:
1  | wx.showModal({  | 
在wepy中,配合polyfill可以使用async await处理异步函数;
在app.wpy入口文件中声明:
1  | export default class extends wepy.app {  | 
就可以使用await async了:
1  | async handleXx() {  | 
但是部分API还是有问题的,如getUpdateManager();
wepy.getUpdateManager()会返回一个promise,但无resolved,不是updateManager对象。
为此我在wepy github仓库提了一个issue,但是没有维护人员的回复,感觉wepy没人维护了…
解决方法是使用原生方法wx.getUpdateManager()
预先在data中声明值
在dom上使用值做判断时,该值一定要在data里先声明,否则值改变时,dom不会变化