当前位置:   article > 正文

2021-09-07 黑马移动端头条项目-day08_黑马头条项目第八天

黑马头条项目第八天

目录

文章评论模块-P136

一、展示文件评论列表

1.1 准备组件 

1.2 获取数据并展示

1.3 文章评论项

二、评论点赞

三、发布文章评论

3.1 准备弹出层

3.2 封装组件 

3.3 请求发布

3.4 发布成功处理

四、评论回复 

4.1 准备回复弹出层

4.2 处理点击回复按钮 

4.3 传递当前点击回复的评论项

4.4 展示评论回复列表 

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

4.6 发布回复


文章评论模块-P136

一、展示文件评论列表

1.1 准备组件 

新建article/components/cmment-list.vue组件 

article/index.vue注册组件

1.2 获取数据并展示

实现:

  • 请求获取数据 

  • 把数据放到列表中

  • 将本次的loading关闭

  • 判断是否有数据,若有则更新获取下一页数据的页码,若没有则将finished设置为true,不再触发加载更多

封装数据接口 api/comment.js

  1. // 文章评论相关请求模块
  2. import request from '@/utils/request'
  3. // 获取文章列表
  4. export const getComments = params => {
  5. return request({
  6. method: 'GET',
  7. url: '/app/v1_0/comments',
  8. params
  9. })
  10. }

cmment-list.vue组件中onLoad事件处理函数

  1. async onLoad() {
  2. // 1.请求获取数据
  3. const { data } = await getComments({
  4. //评论类型,a-对文章article的评论,c-对评论comment的回复
  5. type: "a",
  6. // 源id,文章id或评论id
  7. source: this.source,
  8. // 获取评论数据的偏移量,值为评论id,表示从此id的数据向后取,不传表示从第一页开始读取数据
  9. offset: this.offset,
  10. // 获取的评论数据个数,不传表示采用后端服务设定的默认每页数据量
  11. limit: this.limit
  12. });
  13. console.log(data);
  14. // 2. 把数据放到列表中
  15. const { results } = data.data;
  16. this.list.push(...results);
  17. // 3.将本次的loading关闭
  18. this.log = false;
  19. // 4.判断是否有数据
  20. if (results.length) {
  21. 若有则更新获取下一页数据的页码
  22. this.offset = data.data.last_id;
  23. } else {
  24. 若没有则将finished设置为true,不再触发加载更多
  25. this.finished = true;
  26. }
  27. }

补充:

需要请求不同源的资源,避开跨域限制:

  • JSONP
  • CORS
  • 服务器代理

1.3 文章评论项

新建article/components/cmment-item.vue组件 

cmment-list.vue中注册组件,并把comment传给cmment-item.vue组件,cmment-item.vue组件用props属性接收该对象

  1. <CommentItem
  2. :comment="comment"
  3. v-for="(comment, index) in list"
  4. :key="index"
  5. />

utils/dayjs.js 处理文章评论项的时间格式  

  1. // 文章评论项的时间,根据传的参数控制时间格式
  2. Vue.filter('datetime', (value, format) => {
  3. return dayjs(value).format(format)
  4. })

二、评论点赞

配置数据接口

  1. // 对评论事评论回复点赞
  2. export const addCommentLike = commentId => {
  3. return request({
  4. method: 'POST',
  5. url: '/app/v1_0/comment/likings',
  6. data: {
  7. target: commentId
  8. }
  9. })
  10. }
  11. // 取消对评论事评论回复点赞
  12. export const deleteCommentLike = commentId => {
  13. return request({
  14. method: 'DELETE',
  15. url: `/app/v1_0/article/likings/${commentId}`
  16. })
  17. }

onCommentLike事件处理函数

  1. async onCommentLike() {
  2. const commentId = this.comment.com_id.toString();
  3. if (this.comment.is_liking) {
  4. // 取消点赞
  5. await deleteCommentLike(commentId);
  6. this.comment.like_count--;
  7. } else {
  8. // 添加点赞
  9. await addCommentLike(commentId);
  10. this.comment.like_count++;
  11. }
  12. this.comment.is_liking = !this.comment.is_liking;
  13. }

三、发布文章评论

3.1 准备弹出层

  1. <!-- 发布评论 -->
  2. <van-popup v-model="isPostShow" position="bottom">1242 内容 </van-popup>

3.2 封装组件 

新建article/components/post-comment.vue组件

article/index.vue中注册组件

3.3 请求发布

封装数据接口

  1. // 发布评论,添加评论或评论回复
  2. export const addComment = data => {
  3. return request({
  4. method: 'POST',
  5. url: '/app/v1_0/comments',
  6. data
  7. })
  8. }

onPost事件处理函数 

  1. async onPost() {
  2. const { data } = await addComment({
  3. // 评论的目标id(评论文章即为文章id,对评论进行回复则为评论id)
  4. target: this.target.toString(),
  5. // 评论的内容
  6. content: this.message,
  7. // 文章id,对评论内容发表回复时需要传递此参数,表明所属文章id,对文章进行评论,不需要传此参数
  8. art_id: this.articleId ? this.articleId.toString() : null
  9. });
  10. console.log(data);
  11. }

3.4 发布成功处理

1.article/index.vue的发布评论事件函数onPostSuccess、comment-list.vue、post-comment.vue的的onPost事件函数等三个组件

2.article/index.vue父组件向comment-list.vue子组件传commentList数组里的数据

补充:

展示文章评论总数量  total_count

1.在comment-list.vue列表子组件发送自定义事件 this.$emit("update-total-count", data.data.total_count);

2.父组件监听接收数据

  1. <comment-list
  2. :source="articleId"
  3. :list="commentList"
  4. @update-total-count="totalCommentCount = $event"
  5. />

3.数据绑定并展示

  1. <!-- 评论 -->
  2. <van-icon name="chat-o" :info="totalCommentCount" color="#777" />

4.更新评论的总数量 this.totalCommentCount++;

四、评论回复 

4.1 准备回复弹出层

创建组件comment-reply.vue

  1. <!-- 评论回复 -->
  2. <van-popup v-model="isReplyShow" position="bottom">
  3. <comment-reply />
  4. </van-popup>

点击的时候展示弹出层

  1. onReplyClick(comment) {
  2. console.log("onReplyClick", comment);
  3. // 展示回复内容
  4. this.isReplyShow = true;
  5. }

4.2 处理点击回复按钮 

这里涉及到了子组件要传值给爷爷组件,要通过父组件作为桥梁。

下面是子组件发送一个自定义点击事件给父组件  @click="$emit('reply-click', comment)"

 父组件接收子组件的事件并继续向父组件的父组件,即爷爷组件传自定义事件  @reply-click="$emit('reply-click', $event)"

 爷爷组件接收父组件的事件 @reply-click="onReplyClick" 

为了测试是否传递事件成功,在爷爷组件的onReplyClick事件打印了下

4.3 传递当前点击回复的评论项

需求:点击“回复”按钮显示当前回复评论项的用户信息

1.点击"回复"拿到当前评论项的信息  this.replyComment = comment;

2.父组件index.vue将replyComment数据传给子组件comment-reply.vue  :comment="replyComment"

3.子组件接收数据,又加为当前评论项与之前写好的comment-item组件相同,直接复用组件

<comment-item :comment="comment" />

效果:

4.4 展示评论回复列表 

index.vue、comment-reply.vue、comment-list.vue

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

添加v-if属性:v-if="isReplyShow"

  1. <comment-reply
  2. v-if="isReplyShow"
  3. :comment="replyComment"
  4. @close="isReplyShow = false"
  5. />

4.6 发布回复

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/988041
推荐阅读
相关标签
  

闽ICP备14008679号