本文详细梳理了WePY框架在开发过程中与Vue的显著差异,涵盖组件ID唯一性导致的数据共享问题、循环渲染中props使用的限制、异步数据需手动调用$apply()刷新视图、事件处理机制的区别以及模板语法中{{}}运算和动态class绑定的特殊规则。旨在帮助开发者快速上手WePY,避免常见陷阱。
WePY框架概述
WePY框架在语法风格和功能特性上借鉴了Vue,但在实际使用中仍存在诸多差异。本文总结开发中遇到的典型问题供参考。首次使用WePY开发的开发者建议仔细阅读,以节省时间;开发过程中也可反复查阅以巩固记忆。
组件机制与数据共享
WePY中的组件机制
组件使用中存在的陷阱较多。
首先讨论组件间的数据共享。在Vue中,若希望所有子组件共享同一份数据,可将data定义为对象;若不希望共享,则可将data定义为函数并返回数据。
然而WePY中无法采用上述方式。文档指出,WePY中的组件均为静态组件,以组件ID作为唯一标识,每个ID对应一个组件实例。当页面引入多个相同ID的组件时,它们共用同一个实例与数据,任一组件数据变化会导致其他组件同步变化。因此,若同一页面引用多个同类组件,必须为每个组件定义不同的ID,例如:
import Child from '../components/child';
export default class Index extends wepy.page {
components = {
//为两个相同组件的不同实例分配不同的组件ID,从而避免数据同步变化的问题
child: Child,
anotherchild: Child
};
}
这种做法看似繁琐,但目前别无他法。
组件循环与传参限制
若页面仅引用两三个同类组件尚可接受,但若涉及循环渲染且数量未知,该如何处理?接下来讨论组件循环的问题。
WePY官方文档说明,当需要循环渲染WePY组件(类似于通过wx:for循环渲染原生wxml标签)时,必须使用WePY定义的辅助标签<repeat>。但不支持在repeat包裹的组件中使用props、computed、watch等特性。这意味着父组件无法直接通过props向子组件传参?
经实践发现,若props中的数据在template中可获取,但在method或event中却无法读取。最终的解决方案是使用wepy-redux(类似Vuex),将数据存储在store中实现。
异步数据与视图渲染
视图渲染与异步数据
获取异步数据后,需手动调用this.$apply()方法才能重新渲染视图,这一点务必注意。初期开发时使用页面data中的假数据可正常渲染,但切换为接口读取数据后视图无法更新,经排查发现需手动调用this.$apply(),而Vue无需此操作。
事件处理与传参优化
方法定义规则
在WePY中,页面的事件需定义在methods中,组件间的处理函数需写在events中,而自定义方法则需定义在与methods同级的位置。这与Vue将所有方法写在methods中不同。在events中定义的函数,无需在调用子组件时显式声明,子组件通过$emit会自动在events中寻找同名方法执行。
事件传参方式
WePY优化了原生小程序的事件传参形式。例如,若页面有一个获取循环index的方法getIndex,在原生中需额外定义data-index属性,并通过event.currentTarget.dataset.index获取。而在WePY中,可直接在事件中传递参数,但需使用{{}}包裹,如getIndex({{index}}),这也与Vue不同。
数据绑定与动态Class
数据绑定限制
这是小程序原生的限制,WePY无法规避。数据绑定使用{{}},但{{}}内仅支持简单运算,具体支持范围见官方文档。例如,实现列表选中样式切换的需求:通常思路是在选中时触发方法,将index赋值给currentActive,然后在{{}}中判断currentActive == index以应用active样式。但该写法无效,因为不支持此类复杂判断。最终解决方案是创建一个数组arr,选中时将对应位置置为true,在{{}}中判断arr[index]是否为true。结论是{{}}功能有限。
动态绑定class
WePY中需遵循小程序原生的绑定方式,与Vue不同。在Vue中,动态与非动态class需分开写,如<div class="class-a" :class="{true ? 'class-b': 'class-c'}"></div>。而在WePY中,动态与非动态class可合并书写,如<view class="class-a {{true ? 'class-b' : 'class-c'}}">。
Mixin混合机制详解
Mixin混合机制
WePY中的mixin分为两种情况。对于组件data、components、events及其他自定义方法,采用默认式混合:若组件中未定义,则使用mixin中的定义;若组件中已定义,则以组件定义为准,mixin定义不生效。对于methods及小程序页面事件,采用兼容式混合:只要定义就会生效,但先响应组件中定义的方法,再响应mixin中的方法。而Vue组件中methods若与mixin重名,仅采用组件中的事件。生命周期钩子函数则先响应mixin中的,再响应组件中的。
注:以上问题均基于WePY 1.7.2版本,祝开发顺利,少踩坑。
最后附上官方文档链接供参考:
小程序官方文档 WePY官方文档
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。