小程序实现列表点赞功能


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 相关文章推荐
JavaScript中“+=”的应用
Feb 02 Javascript
Extjs中常用表单介绍与应用
Jun 07 Javascript
document.addEventListener使用介绍
Mar 07 Javascript
web打印小结
Jan 11 Javascript
JS中type=&quot;button&quot;和type=&quot;submit&quot;的区别
Jul 04 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
Aug 10 Javascript
inquirer.js一个用户与命令行交互的工具详解
May 18 Javascript
vue进入页面时不在顶部,检测滚动返回顶部按钮问题及解决方法
Oct 30 Javascript
JS原型和原型链原理与用法实例详解
Feb 05 Javascript
Vue中多元素过渡特效的解决方案
Feb 05 Javascript
JavaScript计算出两个数的差值
Mar 19 Javascript
JavaScript实时更新当前的时间的示例代码
Jul 15 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
PHP4之真OO
2006/10/09 PHP
在PHP3中实现SESSION的功能(二)
2006/10/09 PHP
php 面向对象的一个例子
2011/04/12 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
2019/10/02 PHP
javascript 事件处理、鼠标拖动效果实现方法详解
2012/05/11 Javascript
javascript面向对象特性代码实例
2014/06/12 Javascript
javascript操纵OGNL标签示例代码
2014/06/16 Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
2016/07/09 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
完美解决input[type=number]无法显示非数字字符的问题
2017/02/28 Javascript
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
2017/08/25 Javascript
vue实现底部菜单功能
2018/07/24 Javascript
详解vue2.0 资源文件assets和static的区别
2018/11/27 Javascript
axios携带cookie配置详解(axios+koa)
2018/12/28 Javascript
使用VueCli3+TypeScript+Vuex一步步构建todoList的方法
2019/07/25 Javascript
VUE项目初建和常见问题总结
2019/09/12 Javascript
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
Python中os和shutil模块实用方法集锦
2014/05/13 Python
python实现一组典型数据格式转换
2018/12/15 Python
Python warning警告出现的原因及忽略方法
2020/01/31 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
戴尔马来西亚官网:Dell Malaysia
2020/05/02 全球购物
俄罗斯便宜的在线服装商店:GroupPrice
2020/04/10 全球购物
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
九年级历史教学反思
2014/01/27 职场文书
读群众路线心得体会
2014/03/07 职场文书
马智宇婚礼主持词
2014/03/22 职场文书
售后服务承诺书范文
2014/03/26 职场文书
完美的中文自荐信
2014/05/24 职场文书
党的群众路线教育实践活动个人整改方案
2014/10/25 职场文书
小学班主任经验交流材料
2014/12/16 职场文书
2014年党总支工作总结
2014/12/18 职场文书
Java并发编程之Executor接口的使用
2021/06/21 Java/Android
基于Python实现将列表数据生成折线图
2022/03/23 Python