问题描述:
当用 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:
贴一下关键代码
- 页面代码
<!-- 页面: 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);
},
});
- 自定义组件 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 模拟从后端获取更新数据。