黑马头条vue2.0项目实战(八)——文章评论

news2024/9/20 16:23:48

目录

1. 展示文章评论列表

1.1 准备组件

1.2 获取文章评论数据并展示

1.3 展示文章评论总数量

1.4 文章评论项

2. 评论点赞

3. 发布文章评论

3.1 准备弹出层

3.2 封装发布文章评论组件

3.3 请求发布

4. 评论回复

4.1 准备回复弹层

4.2 封装内容组件

4.3 处理头部

4.4 处理当前评论项

4.5 展示评论回复列表

4.6 解决弹层中组件内容不更新问题

4.7 发布回复


1. 展示文章评论列表

1.1 准备组件

为了更好的开发和维护,这里我们把文章评论单独封装到一个组件中来处理。

① 创建 src/views/article/components/article-comment.vue

② 在文章详情页面中加载注册文章评论子组件

③ 在文章详情页面的正文结束后面使用文章评论子组件

1.2 获取文章评论数据并展示

步骤:

  • 封装接口

  • 请求获取数据

  • 处理模板

实现:

① 在 api/comment.js 中添加封装请求方法

② 请求获取数据

  • List 列表组件步骤:
    • 请求获取数据
    • 将数据添加到列表中
    • 数据加载完毕,设置loading
    • 判断是否还有数据
      • 有,获取更新下一页的页码
      • 没有,设置加载状态为结束

③ 模板绑定

1.3 展示文章评论总数量

1.4 文章评论项

① 封装文章评论项子组件

② 在文章评论列表组件的内部使用

③ 模版绑定

2. 评论点赞

① 在 api/comment.js 中添加封装两个数据接口

② 然后给评论项中的点赞图标注册点击事件

③ 处理事件处理函数

  • button 组件的自带 loading 功能

3. 发布文章评论

3.1 准备弹出层

3.2 封装发布文章评论组件

3.3 请求发布

基本思路:

  • 找到数据接口
  • 封装请求方法
  • 注册发布点击事件
    • 请求发布
    • 成功:将发布的内容展示到列表中
    • 失败:提示失败

① 封装数据接口

② 给发布按钮点击事件

③ 事件处理函数

④ 发布成功处理

  •  清空文本框
  • 关闭发布评论的弹层
  • 将最新发布的评论展示到列表的顶部(兄弟组件之间传值,eventBus)
  • 更新文章评论的总数量

4. 评论回复

4.1 准备回复弹层

① 在详情页中使用弹层用来展示文章的回复

  • 在 data 中添加数据用来控制展示回复弹层的显示状态

  • 在详情页中添加使用弹层组件

② 当点击评论项组件中的回复按钮的时候展示弹层

  • comment-item.vue 组件中点击回复按钮的时候,对外发布自定义事件

  • 在详情页组件中使用的位置监听处理
  • 点击回复显示弹出层
  • 传递当前点击回复的评论项

  • 遇到的问题:
    • 把当前的评论对象传递给 reply-comment组件,把当前点击之后展示弹出层的值传递给爷爷组件,让爷爷组件展示回复评论弹出层,但是当一个事件中同时使用两次 $emit触发的其他组件中的事件,可能导致状态更新延迟。
    • 解决方案:只传递当前的评论对象,让控制显示弹出层的变量的状态卸载,$on 事件监听里。

4.2 封装内容组件

  • 标题 narbar 组件
  • 原始评论项,复用之前封装的 comment-item.vue 组件
  • 全部回复标题 cell 单元格组件
  • 回复评论列表,复用之前封装的 article-commment.vue 组件
  • 发表回复评论按钮 button 组件

4.3 处理头部

4.4 处理当前评论项

① 在 comment-item.vue 组件中点击回复按钮的时候把评论对象给传出来

② 在文章详情组件中接收处理

③ 在详情组件中将 currentComment 传递给 comment-reply.vue 组件

④ 在 comment-reply.vue 组件中声明接收

⑤ 在 comment-reply.vue 组件中展示当前评论,复用之前封装的comment-item组件

4.5 展示评论回复列表

基本思路:

  • 回复列表和文章的评论列表几乎是一样的

  • 重用把之前封装的评论列表

4.6 解决弹层中组件内容不更新问题

弹层组件:

  • 如果初始的条件是 false,则弹层的内容不会渲染

  • 程序运行期间,当条件变为 true 的时候,弹层才渲染了内容

  • 之后切换弹层的展示,弹层只是通过 CSS 控制隐藏和显示

弹层渲染出来以后就只是简单的切换显示和隐藏,里面的内容也不再重新渲染了,所以会导致我们的评论的回复列表不会动态更新了。解决办法就是在每次弹层显示的时候重新渲染组件。v-if是条件渲染, true渲染元素节点, false则不渲染元素节点。

4.7 发布回复

  • 复用之前封装的 post-comment.vue 组件

  • 解决无法直接修改属性的问题:

  • 说明:
    • vue 不可以直接修改 props 中的某个对象数据,但是可以定义在 data 中定义一个新的对象数据,让 data 的对象数据和 props 中的这个对象数据指向同一块内存空间, 这样就可以修改 data 中的数据,就可以修改 props 中的这个数据了。

  • 发布回复组件中需要使用 articleId,但是 articleId 是来自于文章详情组件,即文章详情组件是发布回复评论的组件的祖先。这种时候传值的方式只能是 eventBus 或者注入与依赖(provide inject)

  • 但是使用 eventBus 的话,一般是祖先组价中触发了某个事件才能在接收的后代组件中监听到。传递的值在视图中使用了的话,很可能导致视图更新不及时。
  • 所以最好就是采用依赖注入的形式。祖先组件中提供这个贡献的值,后代组件直接注入使用。

祖先组件:

后代组件:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2039734.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】创建和训练Transformer神经网络模型,将葡萄牙语翻译成英语

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1. 安装2. 数据处理2.1 下载数据集2.2 设置标记器2.3 使用tf.data设置数据管道 3. 测试数据集4. 定义组件4.1 嵌入和位置编码层4.2 添加并规范化4.3 基础注意力…

Android 12系统源码_多屏幕(二)模拟辅助设备功能开关实现原理

前言 上一篇我们通过为Android系统开启模拟辅助设备功能开关,最终实现了将一个Activity显示到多个屏幕的效果。 本篇文章我们具体来分析一下当我们开启模拟辅助设备功能开关的时候,Android系统做了什么哪些操作。 一、模拟辅助设备功能开关应用位置 …

Qt5编译qmqtt库使用MQTT协议连接华为云IOT完成数据上传与交互

一、前言 随着物联网技术的发展,越来越多的设备通过网络互相连接,形成了庞大的智能系统。这些系统能够收集、分析并响应各种数据,从而实现自动化控制和智能化管理。在这个背景下,MQTT 成为了一个广泛使用的轻量级消息传输协议,特别适用于资源受限的环境,如移动应用或远程…

WebSocket 实现:注解与原生方式对比

WebSocket 作为一种在单个长连接上进行全双工、双向通信的协议,已经成为现代Web应用中实现实时通信的重要技术。本文将探讨如何使用注解和原生方式来实现 WebSocket,并对这两种方法进行比较。 一、注解方式实现 WebSocket 在许多现代Java框架中&#x…

GBJ406-ASEMI无人机专用GBJ406

编辑:ll GBJ406-ASEMI无人机专用GBJ406 型号:GBJ406 品牌:ASEMI 封装:GBJ-4 批号:2024 现货:50000 最大重复峰值反向电压:600V 最大正向平均整流电流(Vdss):4A 功率(Pd)&am…

43.【C语言】指针(重难点)(F)

目录 15.二级指针 *定义 *演示 16.三级以及多级指针 *三级指针的定义 *多级指针的定义 17.指针数组 *定义 *代码 18.指针数组模拟二维数组 往期推荐 15.二级指针 *定义 之前讲的指针全是一级指针 int a 1; int *pa &a;//一级指针 如果写成 int a 1; int *pa &a…

MES生产执行系统源码,支持 SaaS 多租户,技术架构:springboot + vue-element-plus-admin

MES的定义与功能 MES是制造业中一种重要的管理信息系统,用于协调和监控整个生产过程。它通过收集、分析和处理各种生产数据,实现对生产流程的实时跟踪和监控,并为决策者提供准确的数据支持。MES涵盖了工厂运营、计划排程、质量管理、设备维护…

AI时代下的智慧体育, 用科技赋能体育创新

在科技飞速发展的今天,人工智能(AI)已成为推动各行各业创新的重要力量。体育,作为人类文明的重要组成部分,同样在AI的浪潮中迎来了新的变革机遇。AI时代下的智慧体育,不再局限于传统的运动模式,…

Spring Boot集成Devtools实现热更新?

1.什么Devtools? DevTools是开发者工具集,主要用于简化开发过程中的热部署问题。 热部署是指在开发过程中,当代码发生变化时,无需手动重启应用,系统能够自动检测并重新加载修改后的代码,大大提高了开发效率…

量化投资策略与技术学习PART2:量化选股之风格轮动

市场上的投资者是有偏好的,有时候偏好于价值股,有时候偏好于成长股,有时偏于大盘,有时又偏于小盘,由于投资者的这种不同的交易行为,形成了市场风格,本节主要研究如何判断市场风格,以…

MyBatis介绍(1)

前言 MyBatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。程序员直接编写原生态 sql,可以…

【java报错已解决】error: metadata-generation-failed

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路二、解决方法2.1 方法一:检查环境变量2.2 步骤二&…

嵌入式学习Day30---Linux软件编程---进程间的通信

目录 一、Linux操作ipc对象(内存文件)的命令 1.1.查看命令 1.ipcs 2.ipcs -q(查看信息队列) 3.ipcs -m(查看共享内存) 4.ipcs -s(查看信号灯) 1.2.删除命令 1.ipcrm -q id 2.ipc…

conda虚拟环境中pip的混淆

在conda的虚拟环境中&#xff0c;会在<PATH>\Anaconda\envs\<ENV_NAME>\Scripts目录下存在 pip.exe 和pip3.exe. 如果存在多个虚拟环境是&#xff0c;加上conda自带的python版本&#xff0c;系统中存在多个pip和pip3指令&#xff0c;在执行安装的时候&#xff0c;…

【AI 绘画】 文生图图生图(基于diffusers)

AI 绘画- 文生图&图生图&#xff08;基于diffusers&#xff09; 1. 效果展示 本次测试主要结果展示如下&#xff1a; SDXL文生图 可爱Lora 2. 基本原理 模型基本原理介绍如下 stable diffusion首先训练一个自编码器&#xff0c;学习将图像数据压缩为低维表示。通过使…

VINS-Fusion的点云转换成ego-planner能用的点云

背景 2013年智在飞翔比赛&#xff1a; RoboMaster | 无人飞行器智能感知技术竞赛https://www.robomaster.com/zh-CN/robo/drone?djifromnav_drone 用vins-fusion来定位&#xff0c;他自己会生成点云数据。 进一步用ego-planner来路径规划和避障&#xff0c;需要用到vins-f…

mpls静态lsp实验

实验需求 R1、R2和R3之间已经部署了IGP协议&#xff0c;故192.168.10.0/24与192.168.20.0/24网络之间已经能够互访。现要求通过配置 静态LSP&#xff0c;使得这两个网络之间能基于MPLS进行互访&#xff0c;标签分配如图 组网图 实验思路 1、R1、R2和R3之间已经部署了IGP协议…

非科班出身的你,如何转行AI算法工程师?

想从其他行业转行到算法工程师的人&#xff0c;无外乎以下几个原因&#xff1a; 现在工资太低工作没有前景对现在的工作没有热情对算法工程师很感兴趣 那么&#xff0c;如何成功转行&#xff1f;给大家整理一些学习方式。 1&#xff09;数据结构和算法&#xff1a;推荐大家使…

自动化测试系列:接口自动化测试框架--05通过邮件发送测试结果的封装

框架功能介绍 1.自动整理接口测试用例&#xff1a;只需使用抓包工具&#xff0c;将需要接口请求另存为HAR文件&#xff0c;执行har2excel.bat即可自动生成接口请求测试用例&#xff0c;同时将接口请求的host地址写入到配置文件&#xff08;测试用例仅生成正向用例&#xff0c;…

前端css线性渐变

background: linear-gradient(90deg,red,green); 1.支持多颜色渐变 2.支持多方向渐变 to left to top left 3.支持角度90deg <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA…