微信小程序,直接修改 this.data 不会触发渲染
$api.post(apiUrl + '/locker/list', obj)
  .then(res => {
    //请求成功          
    this.setData({
      lockerList: res.list
    }) 
    if (this.data.lockerList) {
      this.data.lockerList.forEach((v, i) => {
        if (v.itemImages) { 
          v.itemImages.split(',').forEach((x, i) => {
            v.image = apiUrl + x.trim().replace('[', '').replace(']', '')
          })
        }
      }) 
    } 
    console.info("this.data.lockerList", this.data.lockerList)
  })
 <view class="cu-item" wx:for="{{lockerList}}" wx:key="mainLocker" id="main-{{index}}">
             {{item.image}}
</view>
为什么 this.data.lockerList 日志打印出来能看到 image 的值,但 界面不显示
在你的代码中,this.data.lockerList 打印时有 image 值,但界面不显示,可能是因为 数据更新没有触发页面渲染。以下是可能的原因和解决方案:
🐛 问题原因
- 
直接修改 this.data不会触发渲染- 你在 forEach循环中直接修改this.data.lockerList[i].image,但小程序不会检测这种修改。
- 必须使用 this.setData()才能更新视图。
 
- 你在 
- 
v.image的赋值方式可能有问题- 你用了 v.image = ...,但v是临时变量,修改它不会影响原始数据。
 
- 你用了 
✅ 解决方案
方法 1:使用 setData 更新整个列表
$api.post(apiUrl + '/locker/list', obj)
  .then(res => {
    if (res.list) {
      const newLockerList = res.list.map(v => {
        if (v.itemImages) {
          // 提取第一个图片(如果只需要第一张)
          const firstImage = v.itemImages.split(',')[0].trim().replace(/[\[\]]/g, '');
          return { ...v, image: apiUrl + firstImage };
        }
        return v;
      });
      
      this.setData({ lockerList: newLockerList }); // ✅ 正确更新数据
    }
  });
方法 2:动态更新 image 并触发渲染
$api.post(apiUrl + '/locker/list', obj)
  .then(res => {
    this.setData({ lockerList: res.list }, () => {
      // 在 setData 回调中处理 image(确保数据已更新)
      const updatedList = this.data.lockerList.map(v => {
        if (v.itemImages) {
          const images = v.itemImages.split(',').map(x => 
            apiUrl + x.trim().replace(/[\[\]]/g, '')
          );
          return { ...v, image: images[0] }; // 取第一张图
        }
        return v;
      });
      this.setData({ lockerList: updatedList }); // 再次触发渲染
    });
  });
🛠 代码优化建议
- 
避免直接修改 this.data- 始终用 this.setData()更新数据。
 
- 始终用 
- 
简化图片处理逻辑 - 如果只需要第一张图,可以用 split(',')[0]直接获取。
 
- 如果只需要第一张图,可以用 
- 
使用正则表达式清理 [ ]- replace(/[\[\]]/g, '')可以一次性移除- [和- ]。
 
📌 最终检查点
- 
确保 item.image是字符串- 如果 item.image是数组,WXML 无法直接渲染,需用{{item.image[0]}}。
 
- 如果 
- 
检查 WXML 绑定 - 确保绑定正确:<view wx:for="{{lockerList}}" wx:key="mainLocker"> {{item.image}} <!-- 如果是数组,改用 {{item.image[0]}} --> </view>
 
- 确保绑定正确:
- 
查看网络数据 - 打印 res.list确认后端返回的数据结构是否符合预期。
 
- 打印 
🔍 调试技巧
在 onLoad 或 onShow 中临时写:
this.setData({
  lockerList: [
    { image: "https://example.com/test.jpg" }  // 测试数据
  ]
});
如果界面能显示,说明问题出在数据赋值逻辑;否则可能是 WXML 或样式问题。
如果仍有问题,可以提供 res.list 的原始数据结构和完整 WXML 代码,我可以进一步分析! 🚀
本文来自博客园,作者:VipSoft 转载请注明原文链接:https://www.cnblogs.com/vipsoft/p/18824678
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号