最近宅宅也是在给人做一款文章小程序,其中需要实现用户收藏文章,然后能显示在收藏页面的功能,也是在网上找了不少其他博主的文章,但是都达不到我想要的效果(要么用了云函数,要么超出了我的知识范围,要么本身存在一些bug)

于是宅宅自己写了一份,代码有些简单,没啥高深的技术,大佬们多多担待。

文章页面

首先来看效果(页面凑活看,不喜欢的话待会儿自己写个)

 wxml代码

<view style="display: flex;flex-direction:column;justify-content: center;align-items: center;"><image class = "image" src = "{{shouchangUrl1}}" bindtap="clickMe1"></image><view>收藏</view>
</view>

 wxss代码

page{background: #ffffff;
}.image{width: 100rpx;height: 100rpx;
}

样式上都很简单,上面的可以做个参考,具体想实现什么效果,按自己的喜好来。

最重要的是下面的js代码,后面我会做一些解读,分享我在操作过程中遇到的一些问题

js代码

const db = wx.cloud.database()
Page({data: {id:'',show1:'',shouchangUrl1: "../../images/shou0.png ",xuhao:'',shoucang:[]},onLoad: function (e) {this.setData({_id:e.id})var id = e.id;db.collection('note').doc(id).get().then(res => {console.log('获取到的收藏数组', res.data.shoucang)this.setData({shoucang:res.data.shoucang})wx.cloud.callFunction({name: 'get',complete: res => {console.log('云函数获取到的openid: ', res.result.openId)var shoucang = this.data.shoucang;var dianzan = this.data.dianzan;var daka = this.data.daka;var openid =  res.result.openId;if(shoucang.indexOf(openid)>-1){this.setData({shouchangUrl1: "../../images/shou1.png",show1:1})console.log('收藏存在')}else{this.setData({shouchangUrl1: "../../images/shou0.png",show1:0})console.log('收藏不存在')}}})})},//收藏clickMe1(){if(this.data.show1==0){wx.cloud.callFunction({name: 'get',complete: res => {console.log('云函数获取到的openid: ', res.result.openId)var openid = res.result.openId;var xuhao= this.data._idvar _ = db.commanddb.collection('note').doc(xuhao).update({data: {shoucang: _.addToSet(openid)}})}})this.setData({shouchangUrl1: "../../images/shou1.png",show1:1})}else{wx.cloud.callFunction({name: 'get',complete: res => {console.log('云函数获取到的openid: ', res.result.openId)var openid = res.result.openId;var xuhao= this.data._idvar _ = db.commanddb.collection('note').doc(xuhao).update({data: {shoucang: _.pull(openid)}})}})this.setData({shouchangUrl1: "../../images/shou0.png",show1:0})}
},})

实现上的原理很简单:首次加载时,从云开发数据库获取收藏数组,赋值到本地数组,然后通过get云函数获取当前用户的openid,通过indexOf判断收藏数组中是否存在当前用户的openid,有则显示已收藏赋值show为1,没有则显示未收藏赋值show为0。然后点击收藏按钮时候,通过if语句判断show,show为0,则向收藏数组中添加当前用户的openid(这里用的addToSet)否则删除指定收藏数组的openid(这里用的pull)

注意:由于上面的代码没有将openid赋值给变量,所以后面clickMe1又使用了get云函数,实际操作中可以将通过赋值变量省略此步骤(懒得改了,凑活看吧)

原理上了解了,但是实际上要考虑到代码运行的同步的问题,一开始的时候,我是将获取到openid和获取到收藏数组的方法是分开的,但是这样,可能出现你获取完收藏数组和data中的变量比对完了,但是openid才刚刚获取赋值给data变量的情况,这就导致对比数据不准确,一直为else的情况,最后采用了方法中的本来默认的异步执行解决了这个问题(当然也可以更改代码,通过promise来实现异步执行,但是我不太会。。。)

另外,起初的时候,我并没有打算通过本地对比数组,来确定当前用户是否收藏,而是使用微信文档给与的api,通过where去查询用户的openid是否存在shoucang数组,这样的话,一是更难处理方法同步的问题,二是使用where查询时遇到了一些关于字段类型的问题,懒得解决。在这里给大家说下,希望能给大家躲避一些坑。

收藏页面

文章收藏了怎么能没有收藏页面呢,下面是收藏页面的图片,页面简单,不喜欢可以自己改个哈

收藏页面的实现还是很简单的,条件查询就可以了,下面是代码:

wxml代码

<view class="cu-list menu"><view style="margin: 15rpx 0rpx;" class="cu-item " wx:for="{{shou}}" wx:key="index" bindtap="note" data-id="{{item._id}}" data-type="{{item.type}}"><view style="display: flex;align-items: center;justify-content: space-around;"><view style="width: 550rpx;" class="content padding-tb-sm"><view class="K_between"><text class="text-cut k_width">{{item.title ? item.title : '无标题'}}</text><!--<text catchtap  class="cuIcon-moreandroid" bindtap="mores" data-id="{{item._id}}" data-text="{{item.text}}"></text>--></view><view class="text-gray text-sm text-cut k_width">{{item.text}}</view></view></view></view></view>

wxss代码

.K_between{display:flex;justify-content:space-between
}
.k_width{width:700rpx;
}

js代码

// pages/shoucang/shoucang.js
const db = wx.cloud.database()
Page({/*** 页面的初始数据*/data: {title:'',shou:[]},/*** 生命周期函数--监听页面加载*/onLoad() {wx.cloud.callFunction({name: 'get',complete: res => {console.log('云函数获取到的openid: ', res.result.openId)var openid =  res.result.openId;db.collection('note').where({shoucang: openid}).get({success: res =>{console.log(res.data[0]);this.setData({shou:res.data})} })}
})},note: function (e) {wx.navigateTo({url: '../notexianshi/note?id=' + e.currentTarget.dataset.id})
},})

代码还是很简单的,关键在于查询发法,但是!!!!

要注意,有一部分是我懒的简单,这个代码实际使用中最多能显示20条,至于原因,不知道的可以查一下微信文档,如果对数目没有要求的可以使用这一小段代码,需要全部显示的,可以参考一下skip的分页用法。

好了,文章就分享到这啦,最后看一下效果吧

微信小程序云开发之收藏文章功能的简单实现相关推荐

  1. 微信小程序云开发CMS中WebHook功能的使用方法

    微信小程序云开发CMS中WebHook功能的使用方法 官方文档 Webhook 是什么呢,翻译过来就是网页钩子.它的用处是,当我们在CMS进行增添查改的操作后,会自动回调webhook函数,我们就可以 ...

  2. 微信小程序云开发实现收藏及收藏页面(带样式布局)

    第三个版本修改,应该没问题了 没找到完整的教程,自己琢磨着做了一个 一开始尝试用缓存数组做,但是一直搞不定取消收藏时删除对应的缓存数组数据,于是放弃. 又采用了数据库的方法,但是因为我收藏的不同表太多 ...

  3. 浅谈我对微信小程序云开发的认识与见解

    一.微信小程序云开发的优点 1.无需自建服务器 2.项目快速上线 3.轻轻松松获取用户凭证 二.微信小程序云开发的坑 1.基础版CDN流量太少 2.云数据库限制多 (1)小程序端读取限制 (2)云数据 ...

  4. 【小程序】微信小程序云开发笔记详细教程(建议收藏)

    1- 前言 1.1 微信云开发是什么? 微信云开发是微信团队联合腾讯云推出的专业的小程序开发服务. 开发者可以使用云开发快速开发小程序.小游戏.公众号网页等,并且原生打通微信开放能力. 开发者无需搭建 ...

  5. 技本功丨收藏!斜杠青年与你共探微信小程序云开发(下篇)

    2019年2月26日,人们为了一个杯子疯了一天. 星巴克猫爪杯,一场已经与猫无关了的"圣杯战争".网上的倒卖价格,已炒至近千元! 求而不得,舍而不能,得而不惜.这是人最大的悲哀.. ...

  6. 微信小程序云开发入门(二)-数据库详解

    微信小程序云开发入门(二)-数据库详解 接上一篇:微信小程序云开发入门(一) 摘要: 因为微信小程序云数据库有点类似传统的关系型数据库,但又有所不同.所以刚入手的时候会有点困扰,经过一段时间的学习和摸 ...

  7. 微信小程序云开发快速入门手册-告别切图仔的时刻到了

    文章很长,建议先收藏,有充分的时间再学习,没有小程序基础的,也阔以先收藏哦.   本文章会手把手带各位小伙伴入门微信小程序云开发,因为我还不是全栈工程师,所以不是特别清楚前后端分离模式下,后端工程师需 ...

  8. 记录我的第一篇博客,【新手向】微信小程序云开发

    [新手向]微信小程序云开发 前言 为什么要写博客 微信小程序开发 小程序云开发概述 准备 知识储备 组件库 开源框架 环境搭建 最后 前言 偶然看到自己以前写的代码 em-这一坨什么鬼,哈哈哈 所以我 ...

  9. 微信小程序云开发实战:网上商城(二)

    微信小程序云开发实战:网上商城(二) 主页面 入口页面 云函数与云数据库 代码实现 云端实现 小程序端实现 选择UI组件库 WeUI Vant 整合UI组件库 以扩展包的方式引入weui 接下来 主页 ...

最新文章

  1. 剑指offer:丑数
  2. abb样本-感应电机与发电机手册_防爆电机如何选?
  3. python三层装饰器-2020 python学习第十六天————三层装饰器与迭代器
  4. ClewareControl 2.4 发布,传感器控制程序
  5. Web页面布局方式小结
  6. 每天一道LeetCode-----有序数组循环右移n位后,寻找最小值,数组中可能包含重复元素
  7. 最近用.NET实现DHT爬虫,全.NET实现
  8. 用C语言实现:判断1000-2000年之间的闰年。
  9. PHP函数库06:PHP统计字符串里单词出现次数
  10. scrapy爬虫—获取script中的data数据
  11. 【校招VIP】产品项目分析之竞品分析
  12. Python制作局域网双人聊天软件(一)
  13. 架构真经深有体会、感触很深
  14. win10插入耳机还是外放
  15. OpenGL开发-第6章-纹理,让物体更漂亮
  16. 企业推进数字化转型零信任是必须?
  17. 图形学实验三 图形几何变换
  18. js中常用的Math函数方法
  19. EPICS记录参考--模拟输入记录(ai)
  20. python制作简单动画_把数据摇起来!用Python制作动画可视化效果!

热门文章

  1. c语言gets和getchar区别,C语言中 gets 和 getchar 有什么区别
  2. 数据治理的数据流程整合
  3. Hello 内存 cache 主存 外存
  4. 在wps中的ppt加入水印转成pdf后加入密码权限
  5. 矩阵快速幂: 网易2017实习生编程题 魔力手环
  6. 在egret中自制帧动画
  7. python创建数据库字数不限制_KindEditor设置字数限制
  8. 力扣 (LeetCode)-对称二叉树,树|刷题打卡
  9. exe4j将jar包转成exe文件
  10. sql超键 候选键 主键