当前位置: 首页 > article >正文

uni-app收藏按钮组件实现⑬

文章目录

    • 二十一、收藏按钮组件实现
      • 一、前端处理
      • 二、云函数定义
      • 获取数据后前端处理

二十一、收藏按钮组件实现

一、前端处理

  1. 收藏图标点击事件内获取用户信息,及文章信息,传递到后端

    由于多个界面中都会用到 userInfo 对象,可将 userInfo 对象放在一个全局的 mixin 中进行封存,保证每个界面或组件内部都可以进行使用

    1. 定义 commonMixin 文件

      import { mapState } from "vuex";
      
      export default {
        install(Vue) {
          Vue.mixin({
            computed: {
              ...mapState(["userInfo"]),
            },
          });
        },
      };
      
    2. main.js 文件中对 common Mixing 文件进行使用

      // main.js
      import commonMixin from "./common/commonMixin.js";
      Vue.use(commonMixin);
      
  2. 将用户 ID 及文件 ID 作为参数传递给云函数

    1. 创建全局检测用户是否登录函数,供多个组件进行使用,commonMixin 中完成

      // commonMixin文件
      checkedIsLogin () {
                return new Promise(resolve => {
                  if (this.userInfo) {
                    resolve()
                  } else {
                    uni.navigateTo({
                      url: '/pages/userInfo/login/login'
                    })
                  }
                })
              }
      // saveLike组件
      await this.checkedIsLogin();
      
    2. 将文章信息传递到 saveLike 组件内部使用

      //listCard 组件
      <SaveLikes :item="item"></SaveLikes>
      // saveLike组件
       props: {
          item: Object
        }
      
    3. 发送数据到云服务器

      const res = await this.$http.upate_save_like({
        articleId: this.item._id,
        userId: this.userInfo._id,
      });
      

二、云函数定义

  1. 获取用户记录值

  2. 找到指定字段 article_likes_ids

  3. 通过 db.command 更新指令修改 article_likes_ids

    参考地址:https://uniapp.dcloud.io/uniCloud/cf-database?id=query-command

    • 当文章 id 存在,进行删除操作,使用 pull 方法 参考地址:https://uniapp.dcloud.io/uniCloud/cf-database?id=pull
    • 当文章 id 不存在,进行添加操作,使用 addToSet 方法 参考地址:https://uniapp.dcloud.io/uniCloud/cf-database?id=addtoset
  4. 处理完成,将 article_likes_ids 进行修改之后,重新存储

    "use strict";
    // 定义数据库引用
    const db = uniCloud.database();
    // 定义修改指令
    const dbCmd = db.command;
    
    exports.main = async (event, context) => {
      const { userId, articleId } = event;
      // 获取用户Ids集合
      const userInfo = await db.collection("user").doc(userId).get();
    
      const articleIds = userInfo.data[0].article_likes_ids;
      let returnMsg = null;
    
      let articleArr = null;
      // 如果包含删除收藏
      if (articleIds.includes(articleId)) {
        articleArr = dbCmd.pull(articleId);
        returnMsg = "取消收藏成功";
      } else {
        articleArr = dbCmd.addToSet(articleId);
        returnMsg = "添加收藏成功";
      }
    
      await db.collection("user").doc(userId).update({
        article_likes_ids: articleArr,
      });
    
      const updateUserInfo = await db.collection("user").doc(userId).get();
    
      //返回数据给客户端
      return {
        code: 0,
        data: {
          msg: returnMsg,
          newUserInfo: updateUserInfo.data[0],
        },
      };
    };
    

获取数据后前端处理

  1. 修改存储的用户信息 article_likes_ids 数组

    // saveLikes组件处理
    this.updateUserInfo({ ...this.userInfo, ...newUserInfo });
    
  2. 弹出提示信息

  3. 重新对保存状态 icon 图标赋值

    使用计算属性处理用户收藏保存状态

     computed: {
        isLike () {
          return this.userInfo && this.userInfo.article_likes_ids.includes(this.item._id)
        }
      }
    

http://www.kler.cn/a/393636.html

相关文章:

  • Diffusion Policy——斯坦福机器人UMI所用的扩散策略:从原理到其编码实现(含Diff-Control、ControlNet详解)
  • SpringBoot参数注解
  • Elasticsearch 实战应用:高效搜索与数据分析
  • @ComponentScan:Spring Boot中的自动装配大师
  • 大数据开发面试宝典
  • Java的dto,和多表的调用
  • WebAPI性能监控-MiniProfiler与Swagger集成
  • 鸿蒙next版开发:相机开发-预览(ArkTS)
  • 什么是虚拟内存,为什么要使用虚拟内存,虚拟内存可能比物理内存大吗?
  • 递归搜索与回溯算法
  • Spring设计模式
  • Halcon3D gen_image_to_world_plane_map的理解和实用
  • github SSH连接(windows)
  • 关于我重生到21世纪学C语言这件事——指针详解(1)
  • 基于MATLAB的图片中文字的提取及识别
  • 使用Git进行项目管理
  • ApiSmart x Qwen2.5-Coder 开源旗舰编程模型媲美 GPT-4o, ApiSmart 实测!
  • C语言打印时间精确到毫秒
  • Docker运行一个fio工具镜像
  • 《TCP/IP网络编程》学习笔记 | Chapter 8:域名及网络地址
  • vue中setup语法糖的优点
  • 今日 AI 简报 | 开源 RAG 文本分块库、AI代理自动化软件开发框架、多模态统一生成框架、在线图像背景移除等
  • cursor+QT5.12.12
  • 无需云端!国产开源大语言模型llama.cpp本地实战
  • mysql时间时区修改、set global、配置文件-default-time-zone
  • Prettier - Code formatter插件使用(前端美化插件)