【小程序】微信小程序slice方法分割无效,单独输出一直为空,这是为什么呢

🌹欢迎来到《小5讲堂》🌹

🌹这是《小程序》系列文章,每篇文章将以博主理解的角度展开讲解。🌹

🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!🌹
👨💻 作者简介

🏆 荣誉头衔:2024博客之星Top14 | CSDN博客专家 | 阿里云专家博主

🎤 经历 :曾多次进行线下演讲,亦是 CSDN内容合伙人 以及 新星优秀导师

💡 信念"帮助别人,成长自己!"

🚀 技术领域:深耕全栈,精通 .NET Core (C#)、Python、Java,熟悉主流数据库

🤝 欢迎交流:无论是基础概念还是进阶实战,都欢迎与我探讨!

目录

  • 前言
  • 核心原因
  • 问题复现
  • 为什么?
    • [1. 初次渲染](#1. 初次渲染)
    • [2. 2秒后数据更新](#2. 2秒后数据更新)
  • 真正原因
    • [🔴 情况A:progressList 初始不是数组](#🔴 情况A:progressList 初始不是数组)
    • [🔴 情况B:setData 没触发重新渲染](#🔴 情况B:setData 没触发重新渲染)
    • [🔴 情况C:wx:key 不匹配导致节点未被更新](#🔴 情况C:wx:key 不匹配导致节点未被更新)
  • 解决方案
    • [✅ 方案1:加 wx:if 确保有数据再 slice(最常用)](#✅ 方案1:加 wx:if 确保有数据再 slice(最常用))
    • [✅ 方案2:JS 里提前截取(最稳妥)](#✅ 方案2:JS 里提前截取(最稳妥))
    • [✅ 方案3:使用 computed 属性(wxs 或 behaviors)](#✅ 方案3:使用 computed 属性(wxs 或 behaviors))
  • 推荐文章

前言

对于数组的分割再熟悉不过了,都会内置方法,比如:slice。

当博主信心满满的写好逻辑后,发现一直显示空白,单独输出调试确实也是空白,

因此,写篇文章简单总结下其中的原因。

核心原因

即便 progressList 后续赋值为有数据的数组对象,WXML 里的 slice(0, 2) 在初次渲染时已经执行过一次(结果为 []),后续数据变化时不会自动重新计算切割逻辑。


问题复现

js 复制代码
Page({
  data: {
    progressList: []  // 初始空数组
  },
  onLoad() {
    // 2秒后赋值数组对象
    setTimeout(() => {
      this.setData({
        progressList: [
          { id: 1, name: '任务1' },
          { id: 2, name: '任务2' },
          { id: 3, name: '任务3' }
        ]
      })
    }, 2000)
  }
})
html 复制代码
<view wx:for="{{progressList.slice(0, 2)}}" wx:key="id">
  {{item.name}}
</view>

结果:一直为空


为什么?

1. 初次渲染

  • progressList = []
  • [].slice(0, 2) = []
  • wx:for 遍历空数组 → 不生成任何节点

2. 2秒后数据更新

  • this.setData({ progressList: [...] })
  • 页面重新渲染
  • 但 WXML 表达式 progressList.slice(0, 2) 重新计算了 吗?
    ✅ 会重新计算!
    ❌ 但结果还是 []
    等等------这里其实会正常显示,除非......

真正原因

真正导致"一直为空"的隐藏原因

🔴 情况A:progressList 初始不是数组

js 复制代码
data: {
  progressList: null  // 或 undefined
}

null.slice(0, 2)报错,小程序会忽略这个报错并显示空白

🔴 情况B:setData 没触发重新渲染

如果数据是父组件传递的,且引用没变:

js 复制代码
// 错误写法
const list = this.data.progressList
list.push({ id: 4, name: '任务4' })
this.setData({
  progressList: list  // 引用没变,可能不触发重新渲染
})

🔴 情况C:wx:key 不匹配导致节点未被更新

html 复制代码
<view wx:for="{{progressList.slice(0, 2)}}" wx:key="index">
  <!-- 用 index 当 key 有时会出问题 -->
</view>

解决方案

✅ 方案1:加 wx:if 确保有数据再 slice(最常用)

html 复制代码
<view wx:if="{{progressList && progressList.length}}">
  <view wx:for="{{progressList.slice(0, 2)}}" wx:key="id">
    {{item.name}}
  </view>
</view>
<view wx:else>暂无数据</view>

✅ 方案2:JS 里提前截取(最稳妥)

博主这里采用的是这个方案。

js 复制代码
data: {
  topTwoList: []  // 专门存前两条
},
onLoad() {
  setTimeout(() => {
    const list = [
      { id: 1, name: '任务1' },
      { id: 2, name: '任务2' },
      { id: 3, name: '任务3' }
    ]
    this.setData({
      progressList: list,
      topTwoList: list.slice(0, 2)  // 提前截好
    })
  }, 2000)
}
html 复制代码
<view wx:for="{{topTwoList}}" wx:key="id">
  {{item.name}}
</view>

✅ 方案3:使用 computed 属性(wxs 或 behaviors)

js 复制代码
// 借助 wxs 实时计算
<wxs module="helper">
  function topTwo(arr) {
    return arr && arr.slice ? arr.slice(0, 2) : []
  }
  module.exports = { topTwo }
</wxs>

<view wx:for="{{helper.topTwo(progressList)}}" wx:key="id">
  {{item.name}}
</view>

推荐文章

【小程序】微信小程序input设置readonly只读属性无效,这是怎么回事呢

【小程序】微信开发者工具上调用api接口可以,到了线上调用发现提示wx.request调用报错,原来是https协议问题

【小程序】微信小程序开发,给用户发送一次性订阅消息,常见参数长度和数据类型说明,你值得收藏

【小程序】微信小程序开发,分享给朋友或者朋友圈的功能增加地址参数,以及如何进行带参数本地测试

【小程序】.net core2.1对接微信支付开发时自己挖的坑

【前端】微信小程序,同名图片缓存问题,增加图片后缀动态参数值解决

【小程序】常用方法、知识点汇总1

【腾讯云】AI驱动TDSQL-C Serveress 数据库技术实战营-如何是从0到1体验电商可视化分析小助手得统计功能,一句话就能输出目标统计图

【随笔】博客质量分计算,如何让自己的博客脱颖而出,也许文章能够给你答案

【Sql Server】sql server 2019设置远程访问,外网服务器需要设置好安全组入方向规则

【千帆AppBuilder】零代码+组件+代码节点方式实现AI应用《法定退休年龄计算器》

【1024程序员节】分享下博主的AI应用之旅,有哪些好玩有趣的智能体呢,不妨一起探索下

相关推荐
Light601 小时前
心智有效性测试小程序 V1.0 产品白皮书——心智结构量化与系统稳定性评估平台
小程序·apache
予你@。2 小时前
uni-app(Vue3)实现自定义 Tab 切换滑块效果(微信小程序)
vue.js·微信小程序·uni-app
说私域2 小时前
数字商超的崛起:基于“链动2+1模式智能名片S2B2C商城小程序”的社交电商生态重构
人工智能·小程序·重构·流量运营
低代码布道师2 小时前
【教培管家】后台订单管理与预约确认
低代码·小程序·云开发
烟囱土著15 小时前
如何让相册「动」起来❓看这里❗
微信·微信小程序·小程序
azhou的代码园1 天前
基于SpringBoot与微信小程序的招聘管理系统的设计与实现
spring boot·微信小程序·毕业设计·求职招聘小程序
蓝帆傲亦1 天前
Web前端Mock数据实战指南:正确使用Mock.js提升开发效率
微信小程序·小程序·uni-app
00后程序员张1 天前
iOS 应用代码混淆,对已编译 IPA 进行类与方法混淆
android·ios·小程序·https·uni-app·iphone·webview
kyh10033811201 天前
微信小游戏《找茬找汉字闯关王》开发实战:送全部源码
microsoft·微信·微信小程序·小程序·微信小游戏·汉字找茬找梗