小程序实现列表点赞功能


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 相关文章推荐
js 动态选中下拉框
Nov 26 Javascript
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(上:事件篇)
Mar 24 Javascript
jQuery Ajax 仿AjaxPro.Utility.RegisterTypeForAjax辅助方法
Sep 27 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
Jun 05 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
Jun 20 Javascript
Vue.js实现无限加载与分页功能开发
Nov 03 Javascript
Vue仿支付宝支付功能
May 25 Javascript
vue项目中使用AES实现密码加密解密(ECB和CBC两种模式)
Aug 12 Javascript
vue 实现websocket发送消息并实时接收消息
Dec 09 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
Feb 09 Javascript
微信小程序吸底区域适配iPhoneX的实现
Apr 09 Javascript
js轮播图之旋转木马效果
Oct 13 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 遍历XP文件夹下所有文件
2008/11/27 PHP
分享一个PHP数据流应用的简单例子
2012/06/01 PHP
解析php中获取系统信息的方法
2013/06/25 PHP
thinkphp特殊标签用法概述
2014/11/24 PHP
不要小看注释掉的JS 引起的安全问题
2008/12/27 Javascript
JS 用6N±1法求素数 实例教程
2009/10/20 Javascript
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
使用postMesssage()实现跨域iframe页面间的信息传递方法
2016/03/29 Javascript
JSON字符串和对象相互转换实例分析
2016/06/16 Javascript
javascript 数组去重复(在线去重工具)
2016/12/17 Javascript
微信小程序自定义组件
2017/08/16 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
js实现录音上传功能
2019/11/22 Javascript
vue中keep-alive,include的缓存问题
2019/11/26 Javascript
在Vuex中Mutations修改状态操作
2020/07/24 Javascript
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
使用Python编写简单的画图板程序的示例教程
2015/12/08 Python
Python正则表达式教程之三:贪婪/非贪婪特性
2017/03/02 Python
Python中turtle库的使用实例
2019/09/09 Python
Python循环实现n的全排列功能
2019/09/16 Python
Jupyter加载文件的实现方法
2020/04/14 Python
CSS3的新特性介绍
2008/10/31 HTML / CSS
纽约现代艺术博物馆商店:MoMA STORE(室内家具和杂货商品)
2016/08/02 全球购物
美国花园雕像和家居装饰网上商店:Design Toscano
2019/03/09 全球购物
俄罗斯在线大型超市:ТутПросто
2021/01/08 全球购物
汽修专业学生自我鉴定
2013/11/16 职场文书
母亲七十大寿答谢词
2014/01/18 职场文书
怎样拟定创业计划书
2014/05/01 职场文书
争先创优心得体会
2014/09/12 职场文书
董事会决议范本
2015/07/01 职场文书
vue 实现上传组件
2021/05/31 Vue.js
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python
解决 Redis 秒杀超卖场景的高并发
2022/04/12 Redis
CentOS MySql8 远程连接实战
2022/04/19 MySQL