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>
相关推荐
郑州光合科技余经理9 小时前
可独立部署的Java同城O2O系统架构:技术落地
java·开发语言·前端·后端·小程序·系统架构·uni-app
雪芽蓝域zzs10 小时前
uniapp 取消滚动条
uni-app
2401_8658548811 小时前
Uniapp和Flutter哪个更适合企业级开发?
flutter·uni-app
雪芽蓝域zzs11 小时前
uniapp 省市区三级联动
前端·javascript·uni-app
总爱写点小BUG11 小时前
UniApp 图标方案终极排坑:告别 FontClass,拥抱真 SVG 组件化
前端框架·uni-app
Rysxt_1 天前
UniApp获取安卓系统权限教程
android·uni-app
木子啊2 天前
ProCamera 智能水印相机解决方案 (UniApp)
数码相机·uni-app·水印相机·小程序水印
木子啊2 天前
Uni-app跨页面通信三剑客
前端·uni-app·传参
Rysxt_2 天前
UniApp五大UI框架与uni-ui核心区别对比
uni-app·uni-ui
2501_915918412 天前
HTTPS 代理失效,启用双向认证(mTLS)的 iOS 应用网络怎么抓包调试
android·网络·ios·小程序·https·uni-app·iphone