有问题请教老师

来源:2-9 使用缓存实现文字收藏的功能(2)

粉墨登场

2021-04-03 16:19:00

问题描述:

老师你好,当在阅读详情页面中点击一下收藏按钮时,颜色会变化,但是再次点击时,颜色不会变化,需要再次点击,颜色才会变化,我打开了storage,发现存储了一个布尔值的属性,该属性的值跟第一次点击时保存的值是一样的。说明是在点击事件中没有处理好,希望老师能看一下原因在哪里。


相关截图:

http://img.mukewang.com/climg/606824d009bc54c712190454.jpg


相关代码:


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



<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" wx:if="{{collected}}" bind:tap="onCollectionTap">

</image>


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

</image>


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

</image>

</view>



</view>



<text class="article-content">

{{detail}}

</text>

</view>


相关代码:


var postData = require('../../../data/posts-data');



// pages/posts/post-details/post-detail.js
Page({

/**
* 页面的初始数据

小程序总是会data对象中的属性来做数据绑定,这个动作我们称之为读取数据并绑定

但是这个读取数据并绑定这个动作的执行,是在onLoad函数执行之后发生的


*/
data: {

},



/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {

// 获取被点击的文章选项的索引值,保存在变量postId中
var postId = options.id;

this.data.currentPostId = postId;


// 发送初始化数据,使用扩展运算符三个点 ... 这样可以直接使用数据中的属性名而不需要再加上对象的名称
this.setData({ ...postData.postList[postId] });



// 从缓存中获取缓存的数据值 collectedObj
var postsCollected = wx.getStorageSync('collectedObj');


// 如果获取到的缓存数据值是有值的话,直接将其发送到初始化数据 data对象中去
if(postsCollected) {


var oneOfCollected = postsCollected[postId];


// 再做一层判断,如果取到的缓存对象中的属性值是有值的,再发送数据到data对象中
if(oneOfCollected) {


this.setData({

collected: oneOfCollected

});

};



// 否则,如果没有值的话,就创建一个空的对象,并且将该对象的属性设为false
}else {

var postsCollected = {};

postsCollected[postId] = false;

wx.setStorageSync('collectedObj', postsCollected);

};



},


// 收藏按钮的点击事件
onCollectionTap: function () {


// 获取缓存对象collectedObj
var postsCollected = wx.getStorageSync('collectedObj');


// 接着获取该对象中的属性值
var oneOfCollected = postsCollected[this.data.currentPostId];


// 将缓存对象中的值设置为取反之后的布尔值
oneOfCollected = !oneOfCollected;


// 更新缓存对象中的属性值
postsCollected[this.data.currentPostId] = oneOfCollected;


// 设置已经更新过的缓存对象为新的一个缓存对象
wx.setStorageSync('collectedObj', postsCollected);


// 将data对象中的属性currentPostId也更新一下
this.data.currentPostId = oneOfCollected;


// 最后发送数据到data对象中去,以重新渲染页面
this.setData({

collected: oneOfCollected

});


},



})


写回答

1回答

好帮手慕慕子

2021-04-03

同学你好,在你的另一个相同问题下,老师发现同学已经反馈自己发现并解决问题了,老师要给你一个大大的赞,真棒!!!祝学习愉快~

0

0 学习 · 6815 问题

查看课程