小程序实现列表点赞功能


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 相关文章推荐
从零开始学习jQuery (八) 插播:jQuery实施方案
Feb 23 Javascript
HTML DOM的nodeType值介绍
Mar 31 Javascript
jqPlot 基于jquery的画图插件
Apr 26 Javascript
javascript开发技术大全-第1章javascript概述
Jul 03 Javascript
jquery form表单序列化为对象的示例代码
Mar 05 Javascript
JavaScript实现16进制颜色值转RGB的方法
Feb 09 Javascript
jquery仅用6行代码实现滑动门效果
Sep 07 Javascript
JS库之Highlight.js的用法详解
Sep 13 Javascript
vue 通过下拉框组件学习vue中的父子通讯
Dec 19 Javascript
js神秘的电报密码 哈弗曼编码实现
Sep 10 Javascript
Layui 解决表格异步调用后台分页的问题
Oct 26 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
Jun 04 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
星际争霸任务指南——虫族
2020/03/04 星际争霸
PHP编实现程动态图像的创建代码
2008/09/28 PHP
PHP输出缓冲控制Output Control系列函数详解
2015/07/02 PHP
php实现微信和支付宝支付的示例代码
2020/08/11 PHP
Array.prototype 的泛型应用分析
2010/04/30 Javascript
javascript中删除指定数组中指定的元素的代码
2011/02/12 Javascript
浅谈Javascript事件处理程序的几种方式
2012/06/27 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
JavaScript通过function定义对象并给对象添加toString()方法实例分析
2015/03/23 Javascript
移动手机APP手指滑动切换图片特效附源码下载
2015/11/30 Javascript
js与jquery分别实现tab标签页功能的方法
2016/11/18 Javascript
Vuejs实现购物车功能
2017/11/05 Javascript
原生JS实现的简单轮播图功能【适合新手】
2018/08/17 Javascript
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
2019/04/10 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
jQuery子选择器与可见性选择器实例分析
2019/06/28 jQuery
vue实现路由监听和参数监听
2019/10/29 Javascript
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
python根据unicode判断语言类型实例代码
2018/01/17 Python
nohup后台启动Python脚本,log不刷新的解决方法
2019/01/14 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
Tensorflow轻松实现XOR运算的方式
2020/02/03 Python
Python decorator拦截器代码实例解析
2020/04/04 Python
Python环境管理virtualenv&amp;virtualenvwrapper的配置详解
2020/07/01 Python
详解anaconda离线安装pytorchGPU版
2020/09/08 Python
英文简历中的自荐信范文
2013/12/14 职场文书
运动会通讯稿300字
2014/02/02 职场文书
股权转让协议书
2014/04/12 职场文书
父母对孩子说的话
2014/04/12 职场文书
企业贷款委托书格式
2014/09/12 职场文书
2015年校务公开工作总结
2015/05/26 职场文书
SQL Server表分区删除详情
2021/10/16 SQL Server