小程序实现列表点赞功能


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 选择器引擎sizzle浅析
Feb 06 Javascript
用js一次改变多个input的readonly属性值的方法
Jun 11 Javascript
教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
Jul 23 Javascript
js实现格式化金额,字符,时间的方法
Feb 26 Javascript
JS表单验证的代码(常用)
Apr 08 Javascript
浅谈Vue组件及组件的注册方法
Aug 24 Javascript
vue实例中data使用return包裹的方法
Aug 27 Javascript
浅谈针对Vue相同路由不同参数的刷新问题
Sep 29 Javascript
JavaScript中关于base64的一些事
May 06 Javascript
微信小程序数据统计和错误统计的实现方法
Jun 26 Javascript
vue实现PC端分辨率适配操作
Aug 03 Javascript
详解uniapp的全局变量实现方式
Jan 11 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
索尼SONY ICF-SW7600GR电路分析与改良
2021/03/02 无线电
php 静态变量的初始化
2009/11/15 PHP
php魔术变量用法实例详解
2014/11/13 PHP
php字符串分割函数用法实例
2015/03/17 PHP
php实现的操作excel类详解
2016/01/15 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
JavaScript 面向对象的之私有成员和公开成员
2010/05/04 Javascript
深入解析JavaScript中的变量作用域
2013/12/06 Javascript
jQuery 设置 CSS 属性示例介绍
2014/01/16 Javascript
关于JS中setTimeout()无法调用带参函数问题的解决方法
2016/06/21 Javascript
关于JS变量和作用域详解
2016/07/28 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
2016/12/28 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
bootstrap fileinput组件整合Springmvc上传图片到本地磁盘
2017/05/11 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
2017/06/21 Javascript
JS实现图片手风琴效果
2020/04/17 Javascript
js禁止表单重复提交
2017/08/29 Javascript
JavaScript满天星导航栏实现方法
2018/03/08 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
vue实现按需加载组件及异步组件功能
2019/05/27 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
Django中url的反向查询的方法
2018/03/14 Python
Python实现找出数组中第2大数字的方法示例
2018/03/26 Python
使用Python AIML搭建聊天机器人的方法示例
2018/07/09 Python
实例讲解python中的协程
2018/10/08 Python
PyTorch搭建一维线性回归模型(二)
2019/05/22 Python
使用selenium和pyquery爬取京东商品列表过程解析
2019/08/15 Python
让IE6支持css3,让 IE7、IE8 都支持CSS3
2011/10/09 HTML / CSS
CSS3支持IE6, 7, and 8的边框border属性
2012/12/28 HTML / CSS
药物学专业学生的自我评价
2013/10/27 职场文书
工厂搬迁方案
2014/05/11 职场文书
2015大学生求职信范文
2015/03/20 职场文书
2016党员读书思廉心得体会
2016/01/23 职场文书
青年岗位能手事迹材料(2016推荐版)
2016/03/01 职场文书
vue实现书本翻页动画效果实例详解
2022/04/08 Vue.js
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers