【uni-app】懂你找图--首页图片详情模块

本文介绍了uni-app中图片详情模块的实现,包括封装超链接组件、使用moment.js处理时间格式、发送请求获取数据、封装手势滑动组件以及下载图片的功能。详细讨论了每个步骤的关键点,如组件间数据传递、用户信息与评论数据的动态渲染、滑动手势的逻辑实现及优化。同时,针对遇到的问题,如图片显示和专辑数据的处理,给出了相应的解决方案。
摘要由CSDN通过智能技术生成

接口文档

图片评论--ShowDoc

5.图片详情

5.1 封装超链接组件

1.缓存图片详情页面需要滑动的图片数组和图片索引

   1.1自定义组件并使用

  首先在src下新建公共组件文件夹components并在下面新建超链接组件文件goDetail,定义组件

<template>
  <!-- 定义组件 -->
  <view>
    组件
    <slot></slot>
  </view>
</template>


 然后返回需要用到组件的首页推荐页面引入并使用组件

<script>
// 引入组件
import goDetail from "@/components/goDetail";
export default {
// 声明
  components: {
    goDetail,
  },
</script>


//使用组件
<template>
  <view class="monthes_item" v-for="item in monthes.items" :key="item.id">
   <!-- 被<go-detail></go-detail>包住的地方替换插槽<slot></slot>位置 -->
       <go-detail>
            <image
              mode="aspectFill"
              :src="item.thumb + item.rule.replace('$<Height>', 360)"
            ></image>
        </go-detail>
   </view>
</template>

  1.2传递接收数据(图片数组和图片索引)

  首先给go-detail写一下属性

<template>
  <view class="monthes_item" v-for="(item,index) in monthes.items" :key="item.id">
       <go-detail :list="monthes.items" :index="index">
            <image
              mode="aspectFill"
              :src="item.thumb + item.rule.replace('$<Height>', 360)"
            ></image>
        </go-detail>
   </view>
</template>

 然后返回goDetail页接收数据

<script>
export default {
//接收数据
  props:{
      list:Array,
      index:Number
  },
  mounted(){
      console.log(this.list)
      console.log(this.index)
  }
};
</script>

2.跳转到图片的详情页面

首先在goDetail页面加一个点击事件


<template>
  <!-- 定义组件 -->
  <view @click="handleClick">
    <slot></slot>
  </view>
</template>

<script>
export default {
    //接收数据
  props:{
      list:Array,
      index:Number
  },
  mounted(){
    //   console.log(this.list)
    //   console.log(this.index)
  },
  methods:{
      handleClick(){
          // 1 将数据缓存下拉
          getApp().globalData.imgList=this.list;
          getApp().globalData.imgIndex=this.index;
         // 2 再实现点击跳转页面
         uni.navigateTo({
             url:"/pages/imgDetail/index"
         })
      }
  }
};
</script>

然后在page下新建图片详情页imgDetail

<template>
  <view>
      图片详情
  </view>
</template>

<script>
export default {
    onLoad(){
        console.log(getApp().globalData)
    }

};
</script>

 5.2 使用moment.js处理特殊时间格式

<template>
<view class="user_time">{
  {imgDetail.cnTime}}</view>
</template>

<script>
import moment from "moment";
// 设置语言为中文
moment.locale("zh-cn");
export default {

    onLoad(){
        console.log(getApp().globalData)
      
        // xxx年前的数据
        // atime的含义是秒,moment函数接收的是毫秒,所以乘1000
        this.imgDetail.cnTime=moment(this.imgDetail.atime*1000).fromNow();
    }

};
</script>

5.3 发送请求获取数据

1.用户信息

1.1获取用户信息数据 

<script>
import moment from "moment";
// 设置语言为中文
moment.locale("zh-cn");
export default {
    data(){
        return{
            // 图片信息对象 包含着用户头像等
            imgDetail:{}
        }
    },
    onLoad(){
        // console.log(getApp().globalData)
        // 解构
        const{imgList,imgIndex}=getApp().globalData;
        this.imgDetail=imgList[imgIndex];
         // xxx年前的数据
        // atime的含义是秒,moment函数接收的是毫秒,所以乘1000
        this.imgDetail.cnTime=moment(this.imgDetail.atime*1000).fromNow();
       
    }

};
</script>

1.2用户信息动态渲染 

<template>
  <view>
      <!-- 用户信息 开始 -->
      <view class="user_info">
          <view class="user_icon"><image :src="imgDetail.user.avatar" mode="widthFix"></image></view>
          <view class="user_desc">
              <view class="user_name">{
  {imgDetail.user.name}}</view>
              <view class="user_time">{
  {imgDetail.cnTime}}</view>
          </view>
      </view>
      <!-- 用户信息 结束 -->

      <!-- 高清大图 开始 -->
      <view class="high_img">
          <image mode="widthFix" :src="imgDetail.newThumb"></image>
      </view>
      <!-- 高清大图 结束 -->

      <!-- 点赞 开始 -->
      <view class="user_rank">
          <view class="rank">
              <text class="iconfont icondianzan">{
  {imgDetail.rank}}</text>
          </view>
          <view class="user_collect">
              <text class="iconfont iconshoucang">收藏</text>
          </view>
      </view>
      <!-- 点赞 结束 -->
  </view>
</template>

<script>
export default {

    onLoad(){
                         
      this.imgDetail.newThumb=imgDetail.thumb+imgDetail.rule.replace('$<Height>',360);
    }

};
</script>


<style lang="scss" scoped>
.user_info {
    display: flex;
    padding: 20rpx; 
  .user_icon {
      padding: 0 20rpx;
    image {
        width: 88px;
        border-radius: 50%;

    }
  }

  .user_desc {
    .user_name {
        color: #000;
        font-weight: 600;

    }

    .user_time {
        color: #ccc;
        font-size: 24rpx;
        padding: 10rpx 0;

    }
  }
}
.user_rank {
    display: flex;
    height: 80rpx;
    border-bottom: 5rpx solid #eee;
  .rank {
      flex: 1;
      display: flex;
      justify-content: center;
      align-items: center;
   
  }

  .user_collect {
      flex: 1;
       display: flex;
      justify-content: center;
      align-items: center;
  }
}
</style>

2.评论数据

2.1获取评论数据

<script>
export default {
    data(){
        return{
            // 图片信息对象 包含着用户头像等
            imgDetail:{},
            // 专辑数据 数组
            album:[],
            // 最热评论
            hot:[],
            // 最新评论
            comment:[]
        }
    },
    onLoad(){
        // console.log(getApp().globalData)
        // 解构
        const{imgList,imgIndex}=getApp().globalData;
        this.imgDetail=imgList[imgIndex];     
        this.imgDetail.newThumb=
          imgDetail.thumb+imgDetail.rule.replace('$<Height>',360);

    
        // 获取图片详情的id
        // this.imgDetail.id
        this.getComments(this.imgDetail.id);
    },
    methods:{
        getComments(id){
            this.request({
                url:`http://157.122.54.189:9088/image/v2/wallpaper/wallpaper/${id}/comment`               
            })
             .then(result=>{
                    // console.log(result);
                    this.album=result.res.album;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值