天天看点

小程序学习--observer函数的应用(组件中的业务)

需求是这样的 就是构建月份的组件中,月份小于10月的时候 显示的数字都是一个位数,需要转换成两位数,

比如8月份是8 ,那就要转换为08 ,同理可得 其他低于十月份的月份也是要这样做:

打开组件的js文件

接下来看下代码:

小程序学习--observer函数的应用(组件中的业务)

这个函数的意义在于,当我们改变值的时候,微信小程序会主动调用这个函数,往这个函数传值,也就是这三个参数:

newVal,oldVal,changedPath 代码的讲解都在注释中。

需要注意的是,我们通过判断月份的值选择加0,并赋值到一个变量中,再把这个变量赋值到渲染到页面的变量时候,

不能和properties下的对象名字相同,为什么?因为不能在observer函数中去改变属性值,会出现无限递归的现象,也就是死循环

在该文件的data部分增加一个值:——index

---------------------

小程序学习--observer函数的应用(组件中的业务)

先来感受一下代码,报错报的简直扎心。

小程序学习--observer函数的应用(组件中的业务)

总结下原因:observer函数是在data发生改变时小程序主动调用的,在observer函数内setData时又再次改变了properties的值,observer函数再次调用,不停的循环……无限递归调用……于是内存耗尽。

那么问题来了,为啥type为Number时不会发生内存泄漏?

本质上就是因为properties值根本没变。当外部改变index值为A(假如),触发observer函数时,函数内部将传进来的值进行拼串后,由于值的类型设置为Number,拼串后的值0A会按照数字解析成A,所以进入函数内部后这个值绕了一圈还是没变,所以不会无限递归调用observer.

解决办法:

看到内存泄漏、递归这些字眼是不是就怕怕的?莫方(说给自己听)。

既然observer内部改变properties内部数据会产生问题,那么,咱们就不改变呗!曲线救国。在data里设置一个变量_index,把拼串后的值给到_index就好啦!注意在wxml中也要把绑定的数据改为{{_index}}。完美~

代码如下:

小程序学习--observer函数的应用(组件中的业务)

最后!!!千万不要尝试在observer函数里改变properties的值!!!