小程序实现列表点赞功能


Posted in Javascript onNovember 02, 2018

最近在开发一个小程序,想添加一个点赞功能,那到底怎么实现呢?因为要和后台服务器同步数据,所以这个我想了好几天应该怎么实现点赞和取消点赞的逻辑,经过两天的实践调试,最终实现了。

思路如下:

1.找到对应文章列表的id

(我用的是 wx:for 列表渲染 加 template 模板来实现文章列表的,所以如果没找到对应的 id ,点赞时可能会出现点击一个列表,别的列表也会发生变化的事件)

2.在前端利用 wx.setStorageSync 保存对应的列表点赞的 id 的缓存

后面通过缓存判断该文章是否已经点过赞,避免重复点赞

3.点赞和取消点赞要有对应的数量上 +1 或 -1 的变化

4.后台服务器的数据同步变化

代码如下

//点赞处理函数(xx.js文件)
 zan: function (item_id) {
  var that = this;
  var show;//传递到数据库点赞的状态   
  var cookie_mid = wx.getStorageSync('zan')||[];//获取全部点赞的mid    
  var newmessage = [];

  for (var i = 0; i < that.data.item_list.length; i++) {
   if (that.data.item_list[i].id == item_id) {//遍历找到对应的id
    var num = that.data.item_list[i].like_num;//当前赞数
    var isshow; //点赞的状态

    if (cookie_mid.includes(item_id)) {//说明已经点过赞,取消赞  
     for (var j = 0; j < cookie_mid.length; j++) {
      if (cookie_mid[j] == item_id) {
       cookie_mid.splice(j, 1);//删除取消赞的mid 
      }      
     }
     --num;
     isshow = 0;//点赞的状态
     that.setData({
      [`item_list[${i}].like_num`]: num, //es6模板语法(反撇号字符)
      [`item_list[${i}].favor_img`]: "../../image/favor.png",
     })
     wx.setStorageSync('zan', cookie_mid);
     wx.showToast({
      title: "取消点赞!",
      icon: 'none'
     }) 
     //console.log("前端取消点赞"+isshow)

    } else {
     isshow = 1;//点赞的状态
     ++num;
     that.setData({
      [`item_list[${i}].like_num`]: num,//es6模板语法(反撇号字符)
      [`item_list[${i}].favor_img`]: "../../image/favor_press.png",
     })
     cookie_mid.unshift(item_id);//新增赞的mid
     wx.setStorageSync('zan', cookie_mid);
     wx.showToast({
      title: "点赞成功!",
      icon: 'none'
     })
     //console.log("前端点赞成功" + isshow)
    }
    //console.log(cookie_mid); 
    //点赞数据同步到数据库
    wx.request({
     url: 'https://xxx.xxxx.xxx/zan.php',
     method: 'POST',
     header: { 'Content-Type': 'application/x-www-form-urlencoded' },
     data: {
      id: item_id,
      show: isshow,
     },
     success: function (res) {
      //console.log("show:" +show)
      //console.log(res.data);
     }
    }) 
   }
  }
 },

/**
 * 点赞
 */
 favorclick: function (options){
  var item_id = options.currentTarget.dataset.id;//此处找到列表的id
  //console.log(item_id);//列表id
  this.zan(item_id);
 },

注意点:

1. splice() 和 unshif() 函数是对数组的某一元素的删除和在原本的基础上添加元素,详细用法可自行查找。

2. [item_list[${i}].like_num]: num, 是es6模板语法(注意是反撇号字符)因为常规写法 ‘item_list[i].like_num': num 在数组动态 setData 时会报如下错误

3. ++num 和 ?num 不要写成 num++ 和 num? , 我就犯了这个错误,导致点赞时数量变化总是出错,搞得我检查了 n 多次逻辑运算应该没错啊,头晕得很。(怪自己基础不够牢啊!!)
4. 模板列表渲染如何能找到id呢?在 .wxml 文件中加上 {{id}} 即可,前提是你 wx:for 的 data 中 包含 id 这个字段:

小程序实现列表点赞功能

.wxml文件中

小程序实现列表点赞功能

5.这样实现基本的点赞功能了,但是页面刷新后,点赞图标又恢复了原始样式,这就需要在刷新时进一步判断了。

6.参考自fengye002011博客的这篇文章

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
P3P Header解决Cookie跨域的问题
Mar 12 Javascript
Ajax清除浏览器js、css、图片缓存的方法
Aug 06 Javascript
Javascript类型转换的规则实例解析
Feb 23 Javascript
js获取json中key所对应的value值的简单方法
Jun 17 Javascript
js仿淘宝商品放大预览功能
Mar 15 Javascript
移动端效果之Swiper详解
Oct 09 Javascript
原生JS实现小小的音乐播放器
Oct 16 Javascript
详解如何实现一个简单的Node.js脚手架
Dec 04 Javascript
Angular4实现图片上传预览路径不安全的问题解决
Dec 25 Javascript
微信小程序如何获取手机验证码
Nov 04 Javascript
vue中多个倒计时实现代码实例
Mar 27 Javascript
javascript数据类型中的一些小知识点(推荐)
Apr 18 Javascript
Vue中的vue-resource示例详解
Nov 02 #Javascript
微信小程序实现列表页的点赞和取消点赞功能
Nov 02 #Javascript
React如何解决fetch跨域请求时session失效问题
Nov 02 #Javascript
element ui table 增加筛选的方法示例
Nov 02 #Javascript
Vue请求JSON Server服务器数据的实现方法
Nov 02 #Javascript
详解使用element-ui table组件的筛选功能的一个小坑
Nov 02 #Javascript
如何使用vuex实现兄弟组件通信
Nov 02 #Javascript
You might like
phpmyadmin的#1251问题
2006/11/25 PHP
让PHP显示Facebook的粉丝数量方法
2014/01/08 PHP
PHP中iconv函数转码时截断字符问题的解决方法
2015/01/21 PHP
php使用cookie保存登录用户名的方法
2015/01/26 PHP
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
浅谈关于JavaScript API设计的一些建议和准则
2015/06/24 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(一)
2016/05/17 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
微信小程序 教程之WXSS
2016/10/18 Javascript
详解AngularJS通过ocLazyLoad实现动态(懒)加载模块和依赖
2017/03/01 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
2017/03/30 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
深究AngularJS之ui-router详解
2017/06/13 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
用Python中的__slots__缓存资源以节省内存开销的方法
2015/04/02 Python
初步探究Python程序的执行原理
2015/04/11 Python
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
Python学习思维导图(必看篇)
2017/06/26 Python
基于Python闭包及其作用域详解
2017/08/28 Python
利用Hyperic调用Python实现进程守护
2018/01/02 Python
Django Rest framework之权限的实现示例
2018/12/17 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
如何用python批量调整视频声音
2020/12/22 Python
求职信范文英文版
2014/01/05 职场文书
男方父母婚礼答谢词
2014/01/25 职场文书
双十佳事迹材料
2014/01/29 职场文书
商务英语专业求职信
2014/06/26 职场文书
2014年幼师工作总结
2014/11/22 职场文书
2014年团工作总结
2014/11/27 职场文书
2014大学生学生会工作总结
2014/12/19 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
小学体育组工作总结2015
2015/07/21 职场文书
Vue深入理解插槽slot的使用
2022/08/05 Vue.js