小程序实现列表点赞功能


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批量控制form禁用的代码
Aug 06 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
Sep 06 Javascript
javascript调试过程中找不到哪里出错的可能原因
Dec 16 Javascript
深入理解javascript构造函数和原型对象
Sep 23 Javascript
如何清除IE10+ input X 文本框的叉叉和密码输入框的眼睛图标
Dec 21 Javascript
JS前端加密算法示例
Dec 22 Javascript
微信小程序 后台登录(非微信账号)实例详解
Mar 31 Javascript
前端跨域的几种解决方式总结(推荐)
Aug 16 Javascript
javascript 面向对象实战思想分享
Sep 07 Javascript
实例详解Node.js 函数
Jun 10 Javascript
js实现登录时记住密码的方法分析
Apr 05 Javascript
JavaScript类的继承多种实现方法
May 30 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 常用函数库和一些实用小技巧
2009/01/01 PHP
php ci框架验证码实例分析
2013/06/26 PHP
php查询操作实现投票功能
2016/05/09 PHP
thinkphp跨库操作的简单代码实例
2016/09/22 PHP
PHP+JQUERY操作JSON实例
2017/03/23 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
php如何获取Http请求
2020/04/30 PHP
动态调用CSS文件的JS代码
2010/07/29 Javascript
javascript 广告后加载,加载完页面再加载广告
2010/11/25 Javascript
JavaScript排序算法之希尔排序的2个实例
2014/04/04 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
Vue.js每天必学之组件与组件间的通信
2016/09/08 Javascript
require.js+vue开发微信上传图片组件
2016/10/27 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
Vue 组件间的样式冲突污染
2017/08/31 Javascript
jQuery第一次运行页面默认触发点击事件的实例
2018/01/10 jQuery
javascript标准库(js的标准内置对象)总结
2018/05/26 Javascript
Vue核心概念Getter的使用方法
2019/01/18 Javascript
Vue+Vuex实现自动登录的知识点详解
2020/03/04 Javascript
Vant 在vue-cli 4.x中按需加载操作
2020/11/05 Javascript
利用JavaScript为句子加标题的3种方法示例
2021/01/05 Javascript
react项目从新建到部署的实现示例
2021/02/19 Javascript
[05:03]2018DOTA2亚洲邀请赛主赛事首日回顾
2018/04/04 DOTA
Python常见加密模块用法分析【MD5,sha,crypt模块】
2017/05/24 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
python mac下安装虚拟环境的图文教程
2019/04/12 Python
pycharm设置鼠标悬停查看方法设置
2019/07/29 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
2019/09/17 Python
python上传时包含boundary时的解决方法
2020/04/08 Python
Java中会存在内存泄漏吗,请简单描述
2016/12/22 面试题
大学毕业生自我鉴定
2013/11/05 职场文书
大学生入党思想汇报
2014/01/14 职场文书
安踏广告词改编版
2014/03/21 职场文书
寄语是什么意思
2014/04/10 职场文书
2014教师专业技术工作总结
2014/12/03 职场文书
详解Python为什么不用设计模式
2021/06/24 Python