小程序实现列表点赞功能


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 相关文章推荐
获取Javscript执行函数名称的方法
Dec 22 Javascript
JavaScript 中的事件教程
Apr 05 Javascript
JQuery的一些小应用收集
Mar 27 Javascript
浅谈JavaScript之事件绑定
Jul 08 Javascript
利用Javascript实现BMI计算器
Aug 16 Javascript
react.js CMS 删除功能的实现方法
Apr 17 Javascript
详解vuejs几种不同组件(页面)间传值的方式
Jun 01 Javascript
详解VUE里子组件如何获取父组件动态变化的值
Dec 26 Javascript
javascript实现自由编辑图片代码详解
Jun 21 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
Jul 29 Javascript
如何基于jQuery实现五角星评分
Sep 02 jQuery
js加减乘除精确运算方法实例代码
Jan 17 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
php读取3389的脚本
2014/05/06 PHP
PHP之uniqid()函数用法
2014/11/03 PHP
PHP PDO fetch 模式各种参数的输出结果一览
2015/01/07 PHP
PHP利用APC模块实现文件上传进度条的方法
2015/01/26 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
Javascript实例教程(19) 使用HoTMetal(6)
2006/12/23 Javascript
lyhucSelect基于Jquery的Select数据联动插件
2011/03/29 Javascript
window.showModalDialog()返回值的学习心得总结
2014/01/07 Javascript
jQuery实现左右切换焦点图
2015/04/03 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
Bootstrap中CSS的使用方法
2016/02/17 Javascript
jQuery Dialog 取消右上角删除按钮事件
2016/09/07 Javascript
jQuery使用ajax_动力节点Java学院整理
2017/07/05 jQuery
利用ES6的Promise.all实现至少请求多长时间的实例
2017/08/28 Javascript
JS去掉字符串中所有的逗号
2017/10/18 Javascript
vue解决跨域路由冲突问题思路解析
2017/11/03 Javascript
如何使用JavaScript实现栈与队列
2019/06/24 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
2019/09/03 jQuery
vue实现计步器功能
2019/11/01 Javascript
ES6 Symbol在对象中的作用实例分析
2020/06/06 Javascript
详谈python read readline readlines的区别
2017/09/22 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
python实现zabbix发送短信脚本
2018/09/17 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
2019/02/21 Python
Python下载网易云歌单歌曲的示例代码
2020/08/12 Python
德国、奥地利和瑞士最大的旅行和度假门户网站:HolidayCheck
2019/11/14 全球购物
JNI的定义
2012/11/25 面试题
ajax是什么及其工作原理
2012/02/08 面试题
Unix/Linux开发面试题
2016/08/16 面试题
大学生评语大全
2014/04/18 职场文书
新农村建设汇报材料
2014/08/15 职场文书
企业授权委托书范本
2014/09/22 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
整改报告怎么写
2014/11/06 职场文书
Redis 常见使用场景
2021/08/30 Redis
MongoDB连接数据库并创建数据等使用方法
2021/11/27 MongoDB