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