vue渲染页面的流程_微信小程序和Vue在数据传输及页面渲染机制的几点不同

本文探讨了微信小程序和Vue在数据传输及页面渲染机制上的不同点。小程序中,只有通过setData方法才能更新视图,而Vue中直接修改数据就能触发视图更新。此外,Vue对数组的变异方法进行了包裹,会自动更新视图。在数据传输上,小程序不做数据未更新检查,而Vue则会避免传输未改变的数据。需要注意的是,Vue要求在data中预定义视图所需属性,且相等数据不会触发更新,这可能导致某些情况下页面渲染不更新。为解决此问题,文中提供了一个处理输入限制的示例。
摘要由CSDN通过智能技术生成

最近使用了uni-app框架开发小程序,里面的数据传输及页面渲染是基于vue实现的,在使用的过程中,发现总结了微信小程序和vue同时作为MVVM框架的在数据传输及页面渲染机制的几点不同。

一、可触发视图更新的数据传输方式的不同

1、在小程序中,只有调用setData方法才会真正将数据传输至视图层,仅仅调用this.data.xx,是不会引起视图更新的。

2、在vue中,只要调用this.xx就可以触发视图层的更新。

此外,针对数组的更新检测,除了调用this.可以触发视图更新外,

vue 将被侦听的数组的变异方法进行了包裹,所以它们也将会触发视图更新,这些被包裹过的方法包括:

•push()

•pop()

•shift()

•unshift()

•splice()

•sort()

•reverse()

所以在调用了这些方法后,我们不需要再调用this.xx,即可实现视图层的更新。

二、数据传输机制的不同

2、小程序中只要是setData的值都会传输至视图层,不会做数据未更新的检查以及页面不需要数据的筛选排除,而且也不需要在data中预定义所有视图层所需要的属性值,未预定义的值调用setData也可以实现视图层的重新渲染。

vue中只要this.xx的数据与当前data中的数据相等或者视图层未使用的data数据,这些数据就不会进行传输,所以也不会触发重新渲染;此外如果是没有在data中预先定义的属性值,调用this.xx,也不会触发视图更新。

注:所以针对这一条,我们要注意以下几点:

1)因为 Vue 无法探测普通的新增属性,所以只要是视图层中用到的数据属性,一定要在data数据对象中预先定义。

2)this.xx的数据与当前data中的数据相等时不会传输数据触发视图更新。

针对这一条,在出现一些设置了值页面却未发生渲染时,可能是此原因,在这里我遇到的一个例子:

需求是:用户输入文本,需要限制最长可输入14个字,14个字不是限制输入14个字符而是这样定义的:要使输入的文本刚好占14个中文汉字的空间(这里:一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间),所以我需要处理英文两个字符算一个字的情况,于是就封装了一个求取当前字符串长度,如果字数多了就将多余的字符截掉,再将截取后的字符串传输回视图层显示。

这个操作之前在小程序端是完全可以实现的。

但是在vue中,当输入的字符超出了14的长度之后,因为截取出来的值都会与当前data中的值相等,所以不会进行数据传输,也不会更新页面。

以下是目前的替代方案:

titleChange(e) {//绑定的监听用户输入的事件

var that = this;

if (str != e.detail.value.trim()) {//如果截取的值与当前输入框中的文本不相等,则需要强制渲染

this.title = '';//先将title的值设置为空

setTimeout(function(){//添加一个延时函数,再将title的值设置为截取后的值

that.title = str;

})

} else {

this.title = str;

}

},

以上!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值