web-app uniapp监测屏幕大小的变化对数组一行展示数据作相应处理

web-app uniapp监测屏幕大小的变化对数组一行展示数据作相应处理

1.uni.getSystemInfoSync().screenWidth; 获取屏幕宽度

2.uni.onWindowResize() 实时监测屏幕宽度变化

3.根据宽度的大小拿到每行要展示的数量itemsPerRow

4.为了确保样式能够根据 itemsPerRow 动态调整,可以使用 CSS 变量或动态类。width: calc((100% - 40rpx * (itemsPerRow - 1)) / itemsPerRow);

复制代码
<template>
    <view class="index">
      <!-- list表单 -->
      <view class="activityList">
        <view class="innerContent">
          <!-- conent-list -->
          <view class="content-list">
            <view class="list-row" v-for="(row, rowIndex) in groupedCollectionList" :key="rowIndex">
              <view class="list-item" v-for="(item, index) in row" :key="index" @click="goDetail(item)">
                <view class="item-left" v-if="item.picture">
                  <image class="img" :src="item.picture" />
                </view>
                <view class="item-right">
                  <view class="title space" v-if="item.name.length > 10">{{ item.name.slice(0, 10) }}...</view>
                  <view class="title space" v-else>{{ item.name }}</view>
                  <view class="title space">{{ item.createdTime }}</view>
                </view>
              </view>
            </view>
          </view>
        </view>
      </view>
    </view>
  </template>

<script>
export default {
    data() {
        return {
            list:[],
            itemsPerRow:1,// 默认每行显示1个
        };
    },
    computed: {
        // 在 computed 中添加 groupedCollectionList 以根据 itemsPerRow 分组数据。
        groupedCollectionList() {
            const rows = [];
            for (let i = 0; i < this.list.length; i += this.itemsPerRow) {
            rows.push(this.list.slice(i, i + this.itemsPerRow));
            }
            return rows;
        },
    },
    beforeMount() {
        this.updateScreenSize(); //初始化屏幕宽度
        uni.onWindowResize(this.updateScreenSize);  // 监听屏幕尺寸变化
    },
    beforeDestroy() {
       uni.offWindowResize(this.updateScreenSize);  // 移除监听器
    },
    methods: {
        // 获取当前屏幕宽度
        getScreenWidth() {
        return uni.getSystemInfoSync().screenWidth;
        },
        updateScreenSize(){
            const width = this.getScreenWidth()
            console.log(width,'width');
            // 562<width&&width<687
            if (width > 640) {
                this.itemsPerRow = 3;
            } else if (562<width&&width < 640) {
                this.itemsPerRow = 2;
            } else {
                this.itemsPerRow = 1;
            }
        },
        getList() {
            // this.$modal.loading("加载中..");
            this.list = [{
                picture:"https://jis-eclass.oss-accelerate.aliyuncs.com/images/Course/20250108/20250108141759a888cbd5-8dec-4b98-a423-30d1f2081023.jpg",
                name:"测试1",
                createdTime:"2025-1-1"
            },
            {
                picture:"https://jis-eclass.oss-accelerate.aliyuncs.com/images/Course/20250108/20250108141759a888cbd5-8dec-4b98-a423-30d1f2081023.jpg",
                name:"测试2",
                createdTime:"2025-1-1"
            },
            {
                picture:"https://jis-eclass.oss-accelerate.aliyuncs.com/images/Course/20250108/20250108141759a888cbd5-8dec-4b98-a423-30d1f2081023.jpg",
                name:"测试3",
                createdTime:"2025-1-1"
            },
            {
                picture:"https://jis-eclass.oss-accelerate.aliyuncs.com/images/Course/20250108/20250108141759a888cbd5-8dec-4b98-a423-30d1f2081023.jpg",
                name:"测试4",
                createdTime:"2025-1-1"
            }
        ]
        },
    },
    async onLoad(e) {
        const { id }  = e
        this.id = id
    },
    onShow() {
        this.pageNum = 1;
        this.getList();
    },


};
</script>

<style lang="scss" scoped>
.index {
  width: 100%;
  min-height: 100vh;
  background: #f7f8fc;
  box-sizing: border-box;
  padding-bottom: calc(110rpx + env(safe-area-inset-bottom));

  .activityList {
    width: 100%;
    padding: 0 20rpx;
    padding-top: 24rpx;

    .innerContent {
      width: 100%;
      background: #ffffff;
      border-radius: 20rpx;
      padding: 20rpx;

      .content-list {
        padding: 20rpx;
        padding-right: 0rpx;

        .list-row {
          display: flex;
          justify-content: space-between;
          margin-bottom: 20rpx;
        }

        .list-item {
          // 确保样式能够适应不同数量的每行显示。
          width: calc((100% - 40rpx * (itemsPerRow - 1)) / itemsPerRow);
          height: 152rpx;
          display: flex;
          margin-bottom: 20rpx;

          .item-left {
            width: 270rpx;
            height: 152rpx;
            border-radius: 10rpx;
            position: relative;

            .img {
              width: 270rpx;
              height: 152rpx;
              border-radius: 10rpx;
            }
          }

          .item-right {
            flex: 1;
            padding: 10rpx 0rpx;
            display: flex;
            flex-direction: column;
            justify-content: space-between;
            width: 200rpx;
            padding-left: 20rpx;

            .title {
              font-size: 30rpx;
              font-family: PingFang SC, PingFang SC-Regular;
              font-weight: Regular;
              text-align: left;
              color: #333333;
              line-height: 41rpx;
            }

            .title.space {
              white-space: nowrap;
              overflow: hidden;
              text-overflow: ellipsis;
            }
          }
        }
      }
    }
  }
}
</style>
相关推荐
Mr_li10 小时前
给 Vue 开发者的 uni-app 快速指南
vue.js·uni-app
anyup12 小时前
🔥2026最推荐的跨平台方案:H5/小程序/App/鸿蒙,一套代码搞定
前端·uni-app·harmonyos
Mintopia1 天前
Vue3 项目如何迁移到 uni-app x:从纯 Web 到多端应用的系统指南
uni-app
Mintopia2 天前
uni-app x 发展前景技术分析:跨端统一的新阶段?
uni-app
不爱说话郭德纲2 天前
告别漫长的HbuilderX云打包排队!uni-app x 安卓本地打包保姆级教程(附白屏、包体积过大排坑指南)
android·前端·uni-app
HashTang4 天前
【AI 编程实战】第 12 篇:从 0 到 1 的回顾 - 项目总结与 AI 协作心得
前端·uni-app·ai编程
JunjunZ4 天前
uniapp 文件预览:从文件流到多格式预览的完整实现
前端·uni-app
郑州光合科技余经理4 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
TT_Close4 天前
“啪啪啪”三下键盘,极速拉起你的 uni-app 项目!
vue.js·uni-app·前端工程化
特立独行的猫a5 天前
uni-app x跨平台开发实战:开发鸿蒙HarmonyOS影视票房榜组件完整实现过程
华为·uni-app·harmonyos·轮播图·uniapp-x