有问题请教老师
问题描述:
老师你好,关于阅读文章中点击收藏按钮的逻辑,有三个疑问。下面贴出了代码。 这一段代码是在onLoad事件中的代码,每次跳转到阅读页面时都会执行。先获取缓存中的一个对象,接着判断,是否有这个对象,有的话进入if判断,没有的话进入else判断。如果进入了else判断说明是第一次进入页面,还没有缓存过对象,因此声明一个空对象,并将该对象中的以当前页面的索引下标为属性名的属性值赋值为false。这里有第一个疑问:就是写在标签上的wx:if="{{collected}}" 是会自动隐式类型转换吗?因为进入了else判断是没有使用this.setData({}) 发送数据的,那么绑定数据的collected是undefiend还是null还是空字符串?但是不管是哪个,隐式类型转换都为false,因此显示的是灰色的图标。
第二个问题,如果已经缓存过对象了,进入if判断,再判断如果以当前页面索引下标的的属性值是有的,那么直接使用 this.setData({}) 发送数据,以此保持当前图标的状态。七月老师一开始的判断条件是 if(oneOfCollected) {} 那这里有了第二个疑问:这时的oneOfCollected,是布尔类型的值,进入if判断隐式类型转换,只有为true时才会进入这个判断,并且发送数据、绑定数据,可是这里的逻辑难道不是要以缓存在对象中的属性的值为准保持图标的状态吗? 因此我就改为了使用typeof 判断,只要是boolean类型就进入这个判断。发现是可以实现的,但是一开始的判断条件也是可以的,所以有了第二个疑问。还是说我哪里理解得不对呢?请老师帮忙看一下。
相关截图:
第三个问题:这张图片是我打印了一下,不存在于storgae缓存中的属性的值,一片空白,我也不知道是什么类型,undefined、null、、空字符串、还是什么值呢?
相关代码:
1 | <!-- 原则:先静后动,先样式再数据 --> < br >< br >< br >< br >< view class = "container" >< br >< br >< br > < image src = "{{imgSrc}}" class = "article-img" ></ image >< br >< br >< br > < view class = "author-content" >< br >< br > < image class = "author-img" src = "{{avatar}}" ></ image >< br >< br >< br > < text class = "author-name" >{{author}}</ text >< br >< br >< br > < text class = "author-fabiaoyu" >发表于</ text >< br >< br >< br > < text class = "author-time" >{{dateTime}}</ text >< br >< br >< br > </ view >< br >< br >< br > < text class = "article-title" >< br > {{title}}< br >< br > </ text >< br >< br >< br >< br > < view class = "tool" >< br >< br > < view class = "circle-img" >< br >< br > < image src = "/images/icon/collection.png" bind:tap = "onCollectionTap" wx:if = "{{collected}}" >< br >< br > </ image >< br >< br >< br > < image src = "/images/icon/collection-anti.png" bind:tap = "onCollectionTap" wx:if = "{{!collected}}" >< br >< br > </ image >< br >< br >< br > < image src = "/images/icon/share.png" >< br >< br > </ image >< br >< br > </ view >< br >< br >< br >< br > </ view >< br >< br >< br >< br > < text class = "article-content" >< br >< br > {{detail}}< br >< br > </ text >< br >< br ></ view >< br > |
相关代码:
1 | var detailsStroage = wx.getStorageSync( 'collectedObj' );<br><br> if (detailsStroage) {<br><br> var oneOfCollected = detailsStroage[idNum];<br><br> if ( typeof oneOfCollected === 'boolean' ) {<br><br> this .setData({<br><br> collected: oneOfCollected<br><br> });<br><br> };<br><br><br> } else {<br><br> var obj = {};<br><br> obj[idNum] = false ;<br><br> wx.setStorageSync( 'collectedObj' , obj);<br><br> };<br> |
正在回答
同学你好,解答如下:
1、同学需要记住,只要是if语句的条件,都会隐式转换为布尔值。
2、typeof oneOfCollected是对oneOfCollected值的类型进行判断,在同学的代码中,如果为布尔值,条件成立,就会执行if语句中的代码,同学这样写也是可以的。
祝学习愉快~
同学你好,解答如下:
1、collected默认是一个布尔值,如果为true,生效的是if语句,显示的是蓝色的收藏按钮(表示收藏),如果是false,生效的是else语句,显示的是灰色的收藏按钮(表示未收藏)
另外:if的条件会隐式转换成布尔值。
2、在老师所写的代码中,postCollected的值为false,是不会进入if判断的,使用的是collected的初始值,也就是fasle。
3、是一个空字符串,在视频中老师有教怎么查看,链接:https://class.imooc.com/lesson/1040#mid=24891(9分左右)
祝学习愉快~
- 参与学习 人
- 提交作业 622 份
- 解答问题 6815 个
微信带火了小程序,也让前端工程师有了更多的展现机会,本阶段带你从移动基础知识的学习到webAPP开发,及小程序开发,让你PC端与移动端两端通吃。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧