unicloud云开发进阶34-项目18图片预览previewImage及导航筛选

59 阅读3分钟

首页图片预览及滑动

现在先把前面的时间也改掉

<uni-dateformat :date="item.publish_date" format="MM月dd hh:mm" :threshold="[60000,3600000*24*30]"></uni-dateformat>

image.png

对文章进行倒序展示,新发布的展示在前面

// 联表查询
db.collection(artTemp, userTemp).orderBy("publish_date desc").get().then(res=>{
    console.log(res);
    this.dataList = res.result.data
})

点击标题、摘要和评论进入详情页

点击图片进入图片预览 在子组件blog_item中,给图片部分写点击事件,在点击事件中调用图片预览方法

文档位置 uniapp.dcloud.net.cn/api/media/i…

<image @click="clickPic" :src="pic != null ? pic :'../../static/images/pic2.jpg'" mode="aspectFill"></image>
</view>

// 点击图片,进入图片预览
      clickPic(){
        uni.previewImage({
          // 这里的item就是props从父组件引用的值
          urls:this.item.picurls
        })
      }

现在由于跨域问题,看不到图,但方法是成功的 image.png

现在没有传图片的索引,没法控制显示哪一张图,所以要用图片的索引来控制点哪一张图,就从那一张开始预览 不传index就是默认从第一张图开始的

        <!-- 如果只有一张图就给图片上下左右都加圆角 -->
        <view class="pic" :class="item.picurls.length==1 ? 'only':''" v-for="(pic, index) in item.picurls" :key="pic">
        <!-- <image :src="pic" mode="aspectFill"></image> -->
        <!-- 图片显示直接照上面这样写会报错,因为可能有一些没有图,得用三元表达式判断没有图的话这里显示一张默认图 -->
        <image @click="clickPic(index)" :src="pic != null ? pic :'../../static/images/pic2.jpg'" mode="aspectFill"></image>
        </view>
        
      // 点击图片,进入图片预览
      clickPic(index){
        uni.previewImage({
          // 这里的item就是props从父组件引用的值
          urls:this.item.picurls,
          current:index
        })
      }        

点击最新是根据最新发布时间排序,点击热门是根据浏览量排序 两个都是倒序排列 image.png

在首页中给navlist定义type

        navlist: [{
          name: "最新",
          type:"publish_date"
        }, {
          name: "热门",
          type:"view_count"
        }],

这样就能知道是点了两项中的某一项了

    <view class="topnav">
      <u-tabs 
      :list="navlist" 
      :activeStyle="{
          color: '#333',
          fontWeight: 'bold',
          transform: 'scale(1.08)'
        }" 
        :inactiveStyle="{
          color: '#888',
          transform: 'scale(1)'
        }" 
        @click="clickNav">
        </u-tabs>
    </view>
    data() {
      return {
        navlist: [{
          name: "最新",
          type:"publish_date"
        }, {
          name: "热门",
          type:"view_count"
        }],
        // 内容部分
        dataList:[],
        // 骨架屏状态
        loadingState:false
      }
    },
clickNav(e) {
    console.log(e);
},

image.png

接下来就是在首页联表查询这里,把排序写法重新改过

// 联表查询
        db.collection(artTemp, userTemp).orderBy("publish_date desc").get().then(res=>{
          console.log(res);
          this.dataList = res.result.data
        })

上面的是原本的写法 下面,通过给排序重新写

      return {
        navlist: [{
          name: "最新",
          type:"publish_date"
        }, {
          name: "热门",
          type:"view_count"
        }],
        // 最新和热门的切换状态
        navAction:0,
        // 内容部分
        dataList:[],
        // 骨架屏状态
        loadingState:false
      }
    },

联表查询字段用变量来写,方括号里就是默认显示最新这一栏

// 联表查询
db.collection(artTemp, userTemp).orderBy(this.navlist[this.navAction].type, "desc").get().then(res=>{
    console.log(res);
    this.dataList = res.result.data
})

点击后切换 实现逻辑是在导航栏的点击事件里重置这个值

// 点击切换导航栏
clickNav(e) {
    this.navAction=e.index;
    // 点击之后,要重新获取网络请求
    this.getData()
},

骨架屏

之前写了骨架屏的结构,但没有做效果

    <!-- 骨架屏 -->
    <view class="loadingState" v-show="loadState">
      <u-skeleton
      	rows="3"
      	title
      	loading
        avatar
      ></u-skeleton>
    </view>
    
    // 骨架屏状态
    loadState:true

把骨架屏默认开启,在网络请求方法获取到数据后,改变骨架屏的状态

      getData(){
        // 联表查询 主表quanzi_article 副表uun-id-users
        // 通过主表中保存的_id去副表中把对应的三个字段值查出来
        let artTemp = db.collection("quanzi_article").field("title,user_id,description,picurls,comment_count,like_count,view_count,publish_date").getTemp();
        let userTemp = db.collection("uni-id-users").field("_id,username,nickname,avatar_file").getTemp();
        // 联表查询
        db.collection(artTemp, userTemp).orderBy(this.navlist[this.navAction].type, "desc").get().then(res=>{
          console.log(res);
          this.dataList = res.result.data
          // 获取到数据,将骨架屏关闭
          this.loadState = false
        })
      },

然后在点击导航栏时,要先初始化骨架屏的状态为true,否则就永远是false了

      // 点击切换导航栏
      clickNav(e) {
        // 重置骨架屏状态为打开
        this.loadState = true;
        // 切换最新和热门的值
        this.navAction=e.index;
        // 点击之后,要重新获取网络请求
        this.getData()
      },

同时,在点击时,要将datalist清空,否则上面显示骨架屏,下面还有在没刷新出新数据来之前,留存的数据 下面这样,还在显示的数据就是之前的数据,同时,因为此时在刷新,骨架屏也显示出来了 如果有分页功能,需要把分页功能也清空 image.png

      // 点击切换导航栏
      clickNav(e) {
        // 重置骨架屏状态为打开
        this.loadState = true;
        // 清空之前获取到的数据
        this.dataList = [];
        // 切换最新和热门的值
        this.navAction=e.index;
        // 点击之后,要重新获取网络请求
        this.getData()
      },