有问题请教老师

有问题请教老师

问题描述:

老师你好,关于阅读文章中点击收藏按钮的逻辑,有三个疑问。下面贴出了代码。 这一段代码是在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类型就进入这个判断。发现是可以实现的,但是一开始的判断条件也是可以的,所以有了第二个疑问。还是说我哪里理解得不对呢?请老师帮忙看一下。


相关截图:


http://img1.sycdn.imooc.com//climg/6069d12c094f200318570312.jpg

第三个问题:这张图片是我打印了一下,不存在于storgae缓存中的属性的值,一片空白,我也不知道是什么类型,undefined、null、、空字符串、还是什么值呢? ​



相关代码:

<!-- 原则:先静后动,先样式再数据 -->



<view class="container">


<image src="{{imgSrc}}" class="article-img"></image>


<view class="author-content">

<image class="author-img" src="{{avatar}}"></image>


<text class="author-name">{{author}}</text>


<text class="author-fabiaoyu">发表于</text>


<text class="author-time">{{dateTime}}</text>


</view>


<text class="article-title">
{{title}}

</text>



<view class="tool">

<view class="circle-img">

<image src="/images/icon/collection.png" bind:tap="onCollectionTap" wx:if="{{collected}}">

</image>


<image src="/images/icon/collection-anti.png" bind:tap="onCollectionTap" wx:if="{{!collected}}">

</image>


<image src="/images/icon/share.png">

</image>

</view>



</view>



<text class="article-content">

{{detail}}

</text>

</view>



相关代码:

var detailsStroage = wx.getStorageSync('collectedObj');

if(detailsStroage) {

var oneOfCollected = detailsStroage[idNum];

if(typeof oneOfCollected === 'boolean') {

this.setData({

collected: oneOfCollected

});

};


}else {

var obj = {};

obj[idNum] = false;

wx.setStorageSync('collectedObj', obj);

};


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,解答如下:

1、同学需要记住,只要是if语句的条件,都会隐式转换为布尔值。

2、typeof oneOfCollected是对oneOfCollected值的类型进行判断,在同学的代码中,如果为布尔值,条件成立,就会执行if语句中的代码,同学这样写也是可以的。

祝学习愉快~

好帮手慕言 2021-04-05 14:50:28

同学你好,解答如下:

1、collected默认是一个布尔值,如果为true,生效的是if语句,显示的是蓝色的收藏按钮(表示收藏),如果是false,生效的是else语句,显示的是灰色的收藏按钮(表示未收藏)

http://img1.sycdn.imooc.com//climg/606aaf9e09558d5101720062.jpg

另外:if的条件会隐式转换成布尔值。

​2、在老师所写的代码中,postCollected的值为false,是不会进入if判断的,使用的是collected的初始值,也就是fasle。

3、是一个空字符串,在视频中老师有教怎么查看,链接:https://class.imooc.com/lesson/1040#mid=24891(9分左右)

祝学习愉快~


  • 提问者 粉墨登场 #1

    第一个问题:也就是说如果绑定的数据没有发送,那么在标签上绑定的 wx:if="{{collected}}",collected这个数据值会自己进行隐式类型转换,那就是为false,所以显示的是灰色的图标。


    ​第二个问题:同样还是判断是否有缓存的这个对象,有的话进入一层if判断,接着再判断如果这个对象中的属性值为true,便使用this.setData()发送数据,如果不是true,反正wx:if="{{collected}}" 会自动隐式类型转换,所以还是为false,所以是没有被收藏,因此显示灰色的图标。 但是我自己写的判断 if(typeof oneOfCollected === 'boolean') 这个条件表达式的逻辑也是没有问题的吧?只是我先人为的进行显示类型判断,然后再判断数据。 所以核心点就是:因为小程序跟原生JS在有些地方不太一样,我之所以会有这几个疑问就是不知道wx:if="{{}}" 这个条件渲染指令会自己隐式类型转换。如果绑定的数据没有发送,隐式类型转换就为false,如果发送了,就以发送的数据值为准进行判断。 请问老师上面这些理解得应该正确了吧?

    2021-04-05 15:45:16
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
3.WebAPP开发与小程序
  • 参与学习           人
  • 提交作业       622    份
  • 解答问题       6815    个

微信带火了小程序,也让前端工程师有了更多的展现机会,本阶段带你从移动基础知识的学习到webAPP开发,及小程序开发,让你PC端与移动端两端通吃。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师