swiper 嵌套自定义组件,真机渲染有问题?
发布于 3 年前 作者 jing55 593 次浏览 来自 问答

问题描述:

当用 swiper 嵌套一个自定义列表组件,组件更新数据时,数据渲染有问题。仅真机上能复现,开发者工具正常。

真机型号:iPhone12 mini 版本 14.6

微信版本:8.0.7

详细描述:

当自定义一个组件 base-info-list ,并且嵌入到 swiper-item 中,更新数据后,发现数据无法正常渲染。其中内嵌自定义组件 base-info-list 中用到了或语句 {{ xx || '暂无' }},在 vConsole 中能看到正常的数据,并且里面是没有“暂无”二字的(图1),但是页面上看到的却是“暂无"。个人认为数据实际上是更新了,只是被“暂无”两个字遮挡住了,也就是实际结果和“暂无”是同时存在的。因为保持其他变量不变,只是通过调整 swiper 外部同级自定义组件 detail-card 组件的 margin-bottom 可以让“暂无”两个字消失,而出现我们需要的数据。并且通过调整这个 margin-bottom 可以让实际结果和“暂无”各占一半(图2红框内),它们是在同一个最小的 dom 里。

预期结果:

更新数据后,页面上不应该看到“暂无”。

图1:

图2:

贴一下关键代码

  1. 页面代码
<!-- 页面: index.wxml -->
<detail-card detail="{{ detail }}" />
<swiper>
  <swiper-item>
    <base-info-list base-info-list="{{ baseInfo }}" />
  </swiper-item>
</swiper>


const app = getApp();

Page({
  data: {
    baseInfo: [
      { title: "标题1", key: "title1", content: "" },
      { title: "标题2", key: "title2", content: "" },
    ],
    detail: {},
  },
  onLoad() {
    const contentList = [1, 2];
    const baseInfo = [
      { title: "标题1", key: "title1", content: "1111" },
      { title: "标题2", key: "title2", content: "22222" },
    ];
    setTimeout(() => {
      this.setData({
        baseInfo,
        detail: { contentList },
      });
    }, 1000);
  },
});


  1. 自定义组件 base-info-list 代码
     <!-- base-info-list/index.wxml -->
<view class="base-info-list">
  <view wx:for="{{ baseInfoList }}" wx:key="key" class="base-info-item">
    <view class="base-info-item-title">
      {{ item.title }}
    </view>
    <view class="base-info-item-content">
      {{ item.content || "暂无" }}
    </view>
  </view>
</view>


/* base-info-list/index.wxss */
.base-info-list .base-info-item-content {
  margin-top: 10rpx;
  color: #333;
  font-size: 30rpx;
  line-height: 40rpx;
  border: 1rpx solid red;
}


完整代码见下面:

bug demo: https://developers.weixin.qq.com/s/KSXfIYmL7hqw

其中 settimeout 模拟从后端获取更新数据。

回到顶部