uni-app 快手小程序端动态设置swipe高度后swipe-item显示异常

uni-app 快手小程序端动态设置swipe高度后swipe-item显示异常

产品分类

uniapp/小程序

PC开发环境操作系统

Windows

PC开发环境操作系统版本号

Windows 10 专业版

HBuilderX类型

正式

HBuilderX版本号

4.15

第三方开发者工具版本号

1.46.1-9f9a84c-x64

基础库版本号

1.74.1

项目创建方式

HBuilderX

示例代码:

<template>  
    <view id="js_body" style="height: 100vh;display: flex;flex-direction:column;">  

    <swiper vertical :style="[bodyView]">  
      <swiper-item ><view>{{JSON.stringify(bodyView)}}</view></swiper-item>  
      <swiper-item ><view>{{JSON.stringify(bodyView)}}</view></swiper-item>  
      <swiper-item ><view>{{JSON.stringify(bodyView)}}</view></swiper-item>  
      <swiper-item ><view>{{JSON.stringify(bodyView)}}</view></swiper-item>  
      <swiper-item ><view>{{JSON.stringify(bodyView)}}</view></swiper-item>  
      <swiper-item ><view>{{JSON.stringify(bodyView)}}</view></swiper-item>  
      <swiper-item ><view>{{JSON.stringify(bodyView)}}</view></swiper-item>  
      <swiper-item ><view>{{JSON.stringify(bodyView)}}</view></swiper-item>  
      <swiper-item ><view>{{JSON.stringify(bodyView)}}</view></swiper-item>  
    </swiper>  
    </view>  
</template>  

<script>  
export default {  
    data() {  
        return {  
                   bodyView:{}  
           }  
    },  
    async onLoad() {  
               let {width,height} = await this.utils_getViewInfo('#js_body');  
               this.bodyView = {  
                     width:`${width}px`,  
                     height:`${height}px`,  
                     background:`green`,  
               }  
                console.error(this.bodyView)  
},  
methods: {  
      utils_getViewInfo(id){  
        let that = this  
        return new Promise(function (resolve, reject){  
          that.$nextTick(()=>{  
            const query = uni.createSelectorQuery().in(that);  
            query.select(id).boundingClientRect(data => {  
              resolve&&resolve(data)  
            }).exec(()=>{});  
          })  
        })  
      }  
}}  
</script>

操作步骤:

需求:设置纵向滑动的swipe,并且swipe高度和界面一致(实际功能用于视频的上下滑动)

遇到的问题:动态调整swipe高度后,界面出显示多个swipe-item,仿佛swipe-item的高度并无重新渲染

尝试过以下方案: 测试1、将swipe-item一并设置高度,结果:swipe垂直滑动的效果并不理想 测试2、将动态设置的高度写死,swipe-item 恢复正常

备注:附件有测试代码

预期结果:

希望动态设置swipe高度后,swipe-item 能正常显示

实际结果:

界面出显示多个swipe-item

bug描述:

动态给纵向swipe设置高度后,swipe中并列显示多个swipe-item,仿佛swipe-item的高度并无重新渲染

附件

test_测试项目_请编译于快手小程序.zip


更多关于uni-app 快手小程序端动态设置swipe高度后swipe-item显示异常的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

感谢反馈新问题,我看一下

更多关于uni-app 快手小程序端动态设置swipe高度后swipe-item显示异常的实战教程也可以访问 https://www.itying.com/category-93-b0.html


目前怎么样呢

我这用vue文件试了下 感觉是nvue对快手不太友好导致的,最终我这做了两个页面,一个nvue用于app,一个vue用于快手

在 uni-app 中开发快手小程序时,如果你动态设置了 swipe 组件的高度,并且 swipe-item 显示异常,可能是由于以下几个原因导致的。以下是一些可能的解决方案:

1. 确保 swipe 高度设置正确

在动态设置 swipe 组件的高度时,确保你设置的高度是有效的,并且与 swipe-item 的内容高度一致。如果高度设置不正确,可能会导致 swipe-item 内容显示不全或布局错乱。

<template>
  <view>
    <swiper :style="{ height: swiperHeight + 'px' }">
      <swiper-item v-for="(item, index) in list" :key="index">
        <view>{{ item }}</view>
      </swiper-item>
    </swiper>
  </view>
</template>

<script>
export default {
  data() {
    return {
      swiperHeight: 300, // 动态设置的高度
      list: ['Item 1', 'Item 2', 'Item 3']
    };
  }
};
</script>

2. 使用 v-ifv-show 控制 swipe-item 的显示

如果你在 swipe-item 中使用了 v-ifv-show 来控制显示,确保在切换时 swipe 的高度能够正确更新。你可以通过监听数据变化来重新计算 swipe 的高度。

<template>
  <view>
    <swiper :style="{ height: swiperHeight + 'px' }">
      <swiper-item v-for="(item, index) in list" :key="index" v-if="item.visible">
        <view>{{ item.content }}</view>
      </swiper-item>
    </swiper>
  </view>
</template>

<script>
export default {
  data() {
    return {
      swiperHeight: 300,
      list: [
        { content: 'Item 1', visible: true },
        { content: 'Item 2', visible: false },
        { content: 'Item 3', visible: true }
      ]
    };
  },
  watch: {
    list: {
      handler() {
        this.calculateSwiperHeight();
      },
      deep: true
    }
  },
  methods: {
    calculateSwiperHeight() {
      // 根据内容重新计算 swiper 的高度
      this.swiperHeight = this.list.filter(item => item.visible).length * 100;
    }
  }
};
</script>

3. 强制刷新 swipe 组件

在某些情况下,动态设置高度后,swipe 组件可能没有正确刷新。你可以尝试通过强制刷新组件来解决这个问题。例如,通过 key 属性强制重新渲染 swipe 组件。

<template>
  <view>
    <swiper :key="swiperKey" :style="{ height: swiperHeight + 'px' }">
      <swiper-item v-for="(item, index) in list" :key="index">
        <view>{{ item }}</view>
      </swiper-item>
    </swiper>
  </view>
</template>

<script>
export default {
  data() {
    return {
      swiperHeight: 300,
      list: ['Item 1', 'Item 2', 'Item 3'],
      swiperKey: 0
    };
  },
  methods: {
    refreshSwiper() {
      this.swiperKey += 1; // 通过改变 key 强制刷新 swiper 组件
    }
  }
};
</script>

4. 检查 CSS 样式

确保 swipeswipe-item 的 CSS 样式没有冲突或覆盖。特别是 heightwidthoverflow 等属性,可能会影响布局。

swiper {
  width: 100%;
  height: 300px;
  overflow: hidden;
}

swiper-item {
  width: 100%;
  height: 100%;
}

5. 快手小程序特有的问题

快手小程序可能存在一些特有的问题或限制。你可以查看快手小程序的官方文档,或者尝试在社区中寻找类似问题的解决方案。

6. 使用 nextTick 确保 DOM 更新

如果你在动态设置高度后立即进行操作,可能需要使用 nextTick 来确保 DOM 已经更新。

this.$nextTick(() => {
  // 确保 DOM 更新后再进行操作
});
回到顶部