开始

把这块封装成一个组件
image.png
封装之前,先把数写成数组的形式。
image.png
评论和分享 数字就可以
image.png
用户点一次就变成黄色。顶和踩 只能是一次。
image.png
顶和踩的数量
image.png
image.png
image.png
播放次数和时长
image.png

  1. list:[
  2. {
  3. userpic:"../../static/demo/userpic/12.jpg",
  4. username:"昵称",
  5. isguanzhu:false,
  6. title:"我是标题",
  7. type:"img", // img:图文,video:视频
  8. titlepic:"../../static/demo/datapic/11.jpg",
  9. infonum:{
  10. index:0,//0:没有操作,1:顶,2:踩;
  11. dingnum:11,
  12. cainum:11,
  13. },
  14. commentnum:10,
  15. sharenum:10,
  16. },
  17. {
  18. userpic:"../../static/demo/userpic/12.jpg",
  19. username:"昵称",
  20. isguanzhu:true,
  21. title:"我是标题",
  22. type:"video", // img:图文,video:视频
  23. titlepic:"../../static/demo/datapic/11.jpg",
  24. playnum:"20w",
  25. long:"2:47",
  26. infonum:{
  27. index:1,//0:没有操作,1:顶,2:踩;
  28. dingnum:11,
  29. cainum:11,
  30. },
  31. commentnum:10,
  32. sharenum:10,
  33. }
  34. ]

剪切放到block块里面。注意最外层还是要套一层view
image.png

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

替换对应的字段
image.png
image.png
是否关注
image.png
标题和主图
image.png
视频用template包裹起来。 判断类型是否是视频。如果是才显示视频。
image.png
顶和踩
image.png
评论数和转发数
image.png
增加一个选中的样式
image.png

image.png

  1. .index-list4 .active,.index-list4 .active>view{
  2. color: #c5f61c;
  3. }

image.png
关注改用v-show
image.png

  1. <view class="u-f-ac" v-show="item.isguanzhu">
  2. <view class="icon iconfont icon-zengjia"></view>关注
  3. </view>

image.png

image.png

image.png

  1. :class="{'active':(item.infonum.index==1)}"
  2. :class="{'active':(item.infonum.index==2)}"

image.png

开始封装组件

新建组件
image.png
把它移动到index目录下
image.png

image.png
把我们之前的代码 复制过来。注意复制的是class=index-list开始的。
image.png
css也复制进来。

然后定义props属性
image.png

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

引入组件
image.png

  1. import indexList from '@/components/index/index-list.vue';

注册组件
image.png

  1. components: {
  2. indexList
  3. },

使用组件
image.png
加一个索引的属性
image.png

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

image.png

image.png
封装的组件完整代码 index-list

css限制作用域

打包后css可能会有重复。
直接scoped表示这个组件内的css只能给当前这个组件使用。
image.png

最终代码

组件代码

  1. <template>
  2. <view class="index-list">
  3. <view class="index-list1 u-f-ac u-f-jsb">
  4. <view class="u-f-ac">
  5. <image :src="item.userpic" mode="widthFix" lazy-load></image>
  6. {{item.username}}
  7. </view>
  8. <view class="u-f-ac" v-show="item.isguanzhu">
  9. <view class="icon iconfont icon-zengjia"></view>关注
  10. </view>
  11. </view>
  12. <view class="index-list2">{{item.title}}</view>
  13. <view class="index-list3 u-f-ajc">
  14. <!-- 图片 -->
  15. <image :src="item.titlepic" mode="widthFix" lazy-load>
  16. </image>
  17. <!-- 视频 -->
  18. <template v-if="item.type=='video'">
  19. <view class="index-list-play icon iconfont icon-bofang"></view>
  20. <view class="index-list-playinfo">
  21. {{item.playnum}}播放 {{item.long}}
  22. </view>
  23. </template>
  24. </view>
  25. <view class="index-list4 u-f-ac u-f-jsb">
  26. <view class="u-f-ac">
  27. <view class="u-f-ac" :class="{'active':(item.infonum.index==1)}">
  28. <view class="icon iconfont icon-icon_xiaolian-mian"></view>
  29. {{item.infonum.dingnum}}
  30. </view>
  31. <view class="u-f-ac" :class="{'active':(item.infonum.index==2)}">
  32. <view class="icon iconfont icon-kulian"></view>
  33. {{item.infonum.cainum}}
  34. </view>
  35. </view>
  36. <view class="u-f-ac">
  37. <view class="u-f-ac">
  38. <view class="icon iconfont icon-pinglun1"></view>
  39. {{item.commentnum}}
  40. </view>
  41. <view class="u-f-ac">
  42. <view class="icon iconfont icon-zhuanfa"></view>
  43. {{item.sharenum}}
  44. </view>
  45. </view>
  46. </view>
  47. </view>
  48. </template>
  49. <script>
  50. export default {
  51. props: {
  52. item: Object,
  53. index: Number
  54. }
  55. }
  56. </script>
  57. <style scoped>
  58. .index-list {
  59. padding: 20upx;
  60. border-bottom: 1upx solid #EEEEEE;
  61. }
  62. .index-list1 {
  63. /* display: flex; */
  64. /* justify-content: space-between; */
  65. /* align-items: center; */
  66. }
  67. .index-list1>view:first-child {
  68. /* display: flex;
  69. align-items: center; */
  70. color: #999999;
  71. }
  72. .index-list1>view:first-child image {
  73. width: 95upx;
  74. height: 90upx;
  75. border-radius: 100%;
  76. margin-right: 10upx;
  77. }
  78. .index-list1>view:last-child {
  79. /* display: flex;
  80. align-items: center; */
  81. background: #F4F4F4;
  82. border-radius: 5upx;
  83. padding: 0 10upx;
  84. }
  85. .index-list2 {
  86. padding-top: 15upx;
  87. font-size: 32upx;
  88. }
  89. .index-list3 {
  90. position: relative;
  91. padding-top: 15upx;
  92. }
  93. .index-list3>image {
  94. width: 100%;
  95. border-radius: 20upx;
  96. }
  97. .index-list-play {
  98. position: absolute;
  99. font-size: 140upx;
  100. color: #FFFFFF;
  101. }
  102. .index-list-playinfo {
  103. position: absolute;
  104. background: rgba(51, 51, 51, 0.72);
  105. color: #FFFFFF;
  106. bottom: 8upx;
  107. right: 8upx;
  108. border-radius: 40upx;
  109. font-size: 22upx;
  110. padding: 0 12upx;
  111. }
  112. .index-list4 {
  113. padding: 15upx 0;
  114. /* display: flex; */
  115. /* justify-content: space-between; */
  116. /* align-items: center; */
  117. }
  118. .index-list4 view {
  119. color: #999999;
  120. }
  121. .index-list4>view:first-child {
  122. /* display: flex;
  123. align-items: center; */
  124. }
  125. .index-list4>view:last-child {
  126. /* display: flex;
  127. align-items: center; */
  128. }
  129. .index-list4>view>view {
  130. /* display: flex;
  131. align-items: center; */
  132. }
  133. .index-list4>view>view>view,
  134. .index-list4>view>view:first-child {
  135. margin-right: 10upx;
  136. }
  137. .index-list4 .active,.index-list4 .active>view{
  138. color: #c5f61c;
  139. }
  140. </style>

首页代码

  1. <template>
  2. <view>
  3. <block v-for="(item,index) in list" :key="index">
  4. <index-list :item="item" :index="index"></index-list>
  5. </block>
  6. </view>
  7. </template>
  8. <script>
  9. import indexList from '@/components/index/index-list.vue';
  10. export default {
  11. components: {
  12. indexList
  13. },
  14. data() {
  15. return {
  16. list: [{
  17. userpic: "../../static/demo/userpic/12.jpg",
  18. username: "昵称",
  19. isguanzhu: false,
  20. title: "我是标题",
  21. type: "img", // img:图文,video:视频
  22. titlepic: "../../static/demo/datapic/11.jpg",
  23. infonum: {
  24. index: 0, //0:没有操作,1:顶,2:踩;
  25. dingnum: 11,
  26. cainum: 11,
  27. },
  28. commentnum: 10,
  29. sharenum: 10,
  30. },
  31. {
  32. userpic: "../../static/demo/userpic/12.jpg",
  33. username: "昵称",
  34. isguanzhu: true,
  35. title: "我是标题",
  36. type: "video", // img:图文,video:视频
  37. titlepic: "../../static/demo/datapic/11.jpg",
  38. playnum: "20w",
  39. long: "2:47",
  40. infonum: {
  41. index: 1, //0:没有操作,1:顶,2:踩;
  42. dingnum: 11,
  43. cainum: 11,
  44. },
  45. commentnum: 10,
  46. sharenum: 10,
  47. }
  48. ]
  49. }
  50. },
  51. onLoad() {
  52. },
  53. methods: {
  54. }
  55. }
  56. </script>
  57. <style>
  58. </style>

结束