开始

官方的评论插件地址,最新版的uni-app代码上找不到这个组件的代码了。但是可以在uni.css内搜索到对应的css样式。
https://ext.dcloud.net.cn/plugin?id=43

本节开始

评论列表组件
image.png

image.png

image.png
我们引入的公共的样式 就已经有评论这个组件的样式了。
image.png
官方例子
image.png

  1. <view class="uni-comment">
  2. <view class="uni-comment-list">
  3. <view class="uni-comment-face">
  4. <image src="https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/uni@2x.png" mode="widthFix"></image>
  5. </view>
  6. <view class="uni-comment-body">
  7. <view class="uni-comment-top">
  8. <text>网友</text>
  9. </view>
  10. <view class="uni-comment-date">
  11. <text>08/10 08:12</text>
  12. </view>
  13. <view class="uni-comment-content">很酷的HBuilderX和uni-app,开发一次既能生成小程序,又能生成App</view>
  14. </view>
  15. </view>
  16. <view class="uni-comment-list">
  17. <view class="uni-comment-face">
  18. <image src="https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/uni@2x.png" mode="widthFix"></image>
  19. </view>
  20. <view class="uni-comment-body">
  21. <view class="uni-comment-top">
  22. <text>马克一天</text>
  23. </view>
  24. <view class="uni-comment-content">很强大,厉害了我的uni-app!</view>
  25. </view>
  26. </view>
  27. <view class="uni-comment-list">
  28. <view class="uni-comment-face">
  29. <image src="https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/uni@2x.png" mode="widthFix"></image>
  30. </view>
  31. <view class="uni-comment-body">
  32. <view class="uni-comment-top">
  33. <text>今生缘</text>
  34. </view>
  35. <view class="uni-comment-content">好牛逼的感觉,是不是小程序、App、移动端都互通了?</view>
  36. <view class="uni-comment-date">
  37. <text>08/10 07:55</text>
  38. </view>
  39. </view>
  40. </view>
  41. <view class="uni-comment-list">
  42. <view class="uni-comment-face">
  43. <image src="https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/uni@2x.png" mode="widthFix"></image>
  44. </view>
  45. <view class="uni-comment-body">
  46. <view class="uni-comment-top">
  47. <text>小猫咪</text>
  48. </view>
  49. <view class="uni-comment-content">支持国产,支持DCloud!</view>
  50. <view class="uni-comment-date">
  51. <view>2天前</view>
  52. <view class="uni-comment-replay-btn">5回复</view>
  53. </view>
  54. </view>
  55. </view>
  56. </view>

官方例子 第四种才是我们想要的,保留第四种就可以了
image.png
保留下面的第四个
image.png

image.png
用官方默认的头像不显示,换成本地的头像就正常显示了。
image.png

对样式进行修改

image.png

  1. <view class="uni-comment u-comment">
  2. <view class="uni-comment-list">
  3. <view class="uni-comment-face">
  4. <image src="https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/uni@2x.png" mode="widthFix">
  5. </image>
  6. </view>
  7. <view class="uni-comment-body">
  8. <view class="uni-comment-top">
  9. <text>小猫咪</text>
  10. </view>
  11. <view class="uni-comment-content">支持国产,支持DCloud!</view>
  12. <view class="uni-comment-date">
  13. <view>2天前</view>
  14. <view class="uni-comment-replay-btn">5回复</view>
  15. </view>
  16. </view>
  17. </view>
  18. </view>

左右两边加点间距
image.png

  1. .u-comment{
  2. padding: 0 20upx;
  3. }

评论可能是有多级的
image.png
一种思路是在评论里面嵌套评论。

我们用第二种思路,放在同一个级别,只不过class属性不同。
第二条评论加一个样式,表示是子节点
image.png

  1. u-comment-list-child

首先要加一个背景色,加内边距
image.png
内边距,背景色,底部加一个边框线
image.png

  1. .u-comment-list-child{
  2. padding: 20upx;
  3. background: #f4f4f4;
  4. border-bottom: 1upx solid;
  5. }

超出了屏幕的范围。
image.png
设置盒模型
image.png

  1. box-sizing: border-box;

这个时候就不会往旁边挤了。
image.png
空出来头像的宽度 70upx
image.png

  1. margin-left: 70upx;

uni.css内 评论组件头像的宽度是70upx
image.png
右边的宽度也超出了
image.png
这里的宽度属性设置了100%
image.png
我们把width改成auto。这样才不会超出范围。
image.png

  1. width: auto;

image.png

因为投屏可能有色差,所以这里先改成深一点的颜色
image.png

  1. background: #BBBBBB;

image.png
再复制一份 看看有无差别
image.png
发现有一点外边距。
image.png

这里加了外边距
image.png
我们改动外边距为0
image.png
image.png
把颜色改回来
image.png

  1. .u-comment-list-child{
  2. padding: 20upx;
  3. background: #F4F4F4;
  4. border-bottom: 1upx solid #EEEEEE;
  5. box-sizing: border-box;
  6. margin-left: 70upx;
  7. width: auto;
  8. margin: 0;
  9. }

再复制一份一级评论代码。样式没问题。
image.png

评论标题

image.png

  1. <view class="u-comment-title">最新评论</view>

上下左右都有内边距。字体要大一点。加粗
image.png

image.png

  1. .u-comment-title{
  2. padding: 20upx;
  3. font-size: 30upx;
  4. font-weight: bold;
  5. }

多加空格 1
image.png

image.png

构建数据结构

评论数和 数据
image.png
一级评论表示0
image.png

  1. comment: {
  2. count: 20,
  3. list: []
  4. }

image.png
fid为1表示子级别的评论
image.png

  1. comment: {
  2. count: 20,
  3. list: [
  4. // 一级评论
  5. {
  6. id: 1,
  7. fid: 0,
  8. userpic: "https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/uni@2x.png",
  9. username: "小猫咪",
  10. time: "1555400035",
  11. data: "支持国产,支持DCloud!",
  12. },
  13. // 子级评论
  14. {
  15. id: 2,
  16. fid: 1,
  17. userpic: "https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/uni@2x.png",
  18. username: "小猫咪",
  19. time: "1555400035",
  20. data: "支持国产,支持DCloud!",
  21. },
  22. {
  23. id: 3,
  24. fid: 1,
  25. userpic: "https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/uni@2x.png",
  26. username: "小猫咪",
  27. time: "1555400035",
  28. data: "支持国产,支持DCloud!",
  29. },
  30. {
  31. id: 4,
  32. fid: 0,
  33. userpic: "https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/uni@2x.png",
  34. username: "小猫咪",
  35. time: "1555400035",
  36. data: "支持国产,支持DCloud!",
  37. }
  38. ]
  39. }

把数组拿出来。因为要转换时间戳。
引入时间库
image.png

  1. import time from '../../common/time.js';

image.png
定义了初始化评论数据的方法

  1. // 获取评论
  2. getcomment() {
  3. let arr = [
  4. // 一级评论
  5. {
  6. id: 1,
  7. fid: 0,
  8. userpic: "https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/uni@2x.png",
  9. username: "小猫咪",
  10. time: "1555400035",
  11. data: "支持国产,支持DCloud!",
  12. },
  13. // 子级评论
  14. {
  15. id: 2,
  16. fid: 1,
  17. userpic: "https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/uni@2x.png",
  18. username: "小猫咪",
  19. time: "1555400035",
  20. data: "支持国产,支持DCloud!",
  21. },
  22. {
  23. id: 3,
  24. fid: 1,
  25. userpic: "https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/uni@2x.png",
  26. username: "小猫咪",
  27. time: "1555400035",
  28. data: "支持国产,支持DCloud!",
  29. },
  30. {
  31. id: 4,
  32. fid: 0,
  33. userpic: "https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/uni@2x.png",
  34. username: "小猫咪",
  35. time: "1555400035",
  36. data: "支持国产,支持DCloud!",
  37. },
  38. ];
  39. for (let i = 0; i < arr.length; i++) {
  40. arr[i].time = time.gettime.gettime(arr[i].time);
  41. }
  42. this.comment.list = arr;
  43. },

在onLoad事件上 调用这个方法去初始化数据。

  1. onLoad(e) {
  2. // console.log(e.detailDate);
  3. this.initdata(JSON.parse(e.detailDate));
  4. this.getcomment();
  5. },

image.png

  1. <view class="u-comment-title">最新评论 {{comment.count}}</view>

block循环
image.png

  1. <block v-for="(item,index) in comment.list" :key="index">

image.png

image.png

  1. <block v-for="(item,index) in comment.list" :key="index">
  2. <view class="uni-comment-list" :class="{'u-comment-list-child':item.fid>0}">
  3. <view class="uni-comment-face">
  4. <image :src="item.userpic" mode="widthFix">
  5. </image>
  6. </view>
  7. <view class="uni-comment-body">
  8. <view class="uni-comment-top">
  9. <text>{{item.username}}</text>
  10. </view>
  11. <view class="uni-comment-content">{{item.data}}</view>
  12. <view class="uni-comment-date">
  13. <view>{{item.time}}</view>
  14. <!-- <view class="uni-comment-replay-btn">5回复</view> -->
  15. </view>
  16. </view>
  17. </view>
  18. </block>

判断是否是子集
image.png

  1. <view class="uni-comment-list" :class="{'u-comment-list-child':item.fid>0}">

onload调用加载数据的方法
image.png

image.png

image.png

封装组件

image.png
最外层套一个view,光把block里面内容复制进来。
image.png

image.png

  1. <view class="uni-comment-list" :class="{'u-comment-list-child':item.fid>0}">
  2. <view class="uni-comment-face">
  3. <image :src="item.userpic" mode="widthFix">
  4. </image>
  5. </view>
  6. <view class="uni-comment-body">
  7. <view class="uni-comment-top">
  8. <text>{{item.username}}</text>
  9. </view>
  10. <view class="uni-comment-content">{{item.data}}</view>
  11. <view class="uni-comment-date">
  12. <view>{{item.time}}</view>
  13. <!-- <view class="uni-comment-replay-btn">5回复</view> -->
  14. </view>
  15. </view>
  16. </view>

image.png

这俩css放在这个里
image.png

  1. .u-comment-title {
  2. padding: 20upx;
  3. font-size: 30upx;
  4. font-weight: bold;
  5. }
  6. .u-comment {
  7. padding: 0 20upx;
  8. }

组件内
image.png

  1. .u-comment-list-child {
  2. padding: 20upx;
  3. background: #F4F4F4;
  4. border-bottom: 1upx solid #EEEEEE;
  5. box-sizing: border-box;
  6. margin-left: 70upx;
  7. width: auto;
  8. margin: 0;
  9. }

image.png

image.png

  1. <script>
  2. export default{
  3. props:{
  4. item: Object,
  5. index: Number
  6. }
  7. }
  8. </script>

引用组件
image.png

  1. import commentList from '@/components/detail/comment-list.vue';

image.png

  1. <comment-list :item="item" :index="index"></comment-list>

image.png

本节代码

comment-list.vue组件

  1. <template>
  2. <view class="uni-comment-list" :class="{'u-comment-list-child':item.fid>0}">
  3. <view class="uni-comment-face">
  4. <image :src="item.userpic" mode="widthFix">
  5. </image>
  6. </view>
  7. <view class="uni-comment-body">
  8. <view class="uni-comment-top">
  9. <text>{{item.username}}</text>
  10. </view>
  11. <view class="uni-comment-content">{{item.data}}</view>
  12. <view class="uni-comment-date">
  13. <view>{{item.time}}</view>
  14. <!-- <view class="uni-comment-replay-btn">5回复</view> -->
  15. </view>
  16. </view>
  17. </view>
  18. </template>
  19. <script>
  20. export default{
  21. props:{
  22. item: Object,
  23. index: Number
  24. }
  25. }
  26. </script>
  27. <style scoped>
  28. .u-comment-list-child {
  29. padding: 20upx;
  30. background: #F4F4F4;
  31. border-bottom: 1upx solid #EEEEEE;
  32. box-sizing: border-box;
  33. margin-left: 70upx;
  34. width: auto;
  35. margin: 0;
  36. }
  37. </style>

detail.vue页面

  1. <template>
  2. <view>
  3. <detail-info :item="detail"></detail-info>
  4. <view class="u-comment-title">最新评论 {{comment.count}}</view>
  5. <!-- 评论区 start -->
  6. <view class="uni-comment u-comment">
  7. <block v-for="(item,index) in comment.list" :key="index">
  8. <comment-list :item="item" :index="index"></comment-list>
  9. </block>
  10. </view>
  11. </view>
  12. </template>
  13. <script>
  14. import detailInfo from '@/components/detail/detail-info.vue';
  15. import time from '../../common/time.js';
  16. import commentList from '@/components/detail/comment-list.vue';
  17. export default {
  18. components: {
  19. detailInfo,
  20. commentList
  21. },
  22. data() {
  23. return {
  24. detail: {
  25. userpic: "../../static/demo/userpic/12.jpg",
  26. username: "哈哈",
  27. sex: 0, //0 男 1 女
  28. age: 25,
  29. isguanzhu: false,
  30. title: "我是标题",
  31. titlepic: "../../static/demo/datapic/13.jpg",
  32. morepic: ["../../static/demo/datapic/13.jpg", "../../static/demo/datapic/12.jpg"],
  33. video: false,
  34. share: false,
  35. path: "深圳 龙岗",
  36. sharenum: 20,
  37. commentnum: 30,
  38. goodnum: 20
  39. },
  40. comment: {
  41. count: 20,
  42. list: []
  43. }
  44. }
  45. },
  46. onLoad(e) {
  47. // console.log(e.detailDate);
  48. this.initdata(JSON.parse(e.detailDate));
  49. this.getcomment();
  50. },
  51. // 监听导航右边按钮
  52. onNavigationBarButtonTap(e) {
  53. // console.log(e);
  54. if (e.index == 0) {
  55. console.log("分享");
  56. }
  57. },
  58. methods: {
  59. // 获取评论
  60. getcomment() {
  61. let arr = [
  62. // 一级评论
  63. {
  64. id: 1,
  65. fid: 0,
  66. userpic: "../../static/demo/userpic/12.jpg",
  67. username: "小猫咪",
  68. time: "1555400035",
  69. data: "支持国产,支持DCloud!",
  70. },
  71. // 子级评论
  72. {
  73. id: 2,
  74. fid: 1,
  75. userpic: "../../static/demo/userpic/12.jpg",
  76. username: "小猫咪",
  77. time: "1555400035",
  78. data: "支持国产,支持DCloud!",
  79. },
  80. {
  81. id: 3,
  82. fid: 1,
  83. userpic: "../../static/demo/userpic/12.jpg",
  84. username: "小猫咪",
  85. time: "1555400035",
  86. data: "支持国产,支持DCloud!",
  87. },
  88. {
  89. id: 4,
  90. fid: 0,
  91. userpic: "../../static/demo/userpic/12.jpg",
  92. username: "小猫咪",
  93. time: "1555400035",
  94. data: "支持国产,支持DCloud!",
  95. },
  96. ];
  97. for (let i = 0; i < arr.length; i++) {
  98. arr[i].time = time.gettime.gettime(arr[i].time);
  99. }
  100. this.comment.list = arr;
  101. },
  102. // 初始化数据
  103. initdata(obj) {
  104. console.log('拿到标题:', obj);
  105. uni.setNavigationBarTitle({
  106. title: obj.title
  107. })
  108. }
  109. }
  110. }
  111. </script>
  112. <style>
  113. .u-comment-title {
  114. padding: 20upx;
  115. font-size: 30upx;
  116. font-weight: bold;
  117. }
  118. .u-comment {
  119. padding: 0 20upx;
  120. }
  121. </style>

结束