通常是由于调用栈深度超限(如无限递归、过深的函数调用链或数据绑定循环)导致。以下是具体解决方案:
一、核心原因分析
- 无限递归
函数直接或间接调用自身且无终止条件,例如事件处理函数中错误触发自身。 - 数据绑定循环
setData
触发数据更新后,再次触发相同逻辑,形成循环渲染NaN。 - 复杂组件渲染
如rich-text
解析深层嵌套 HTML 或Image
组件频繁修改src
属性,导致渲染层栈溢出NaN。
二、解决方案
1. 检查事件处理函数
- 问题代码示例:
若<!-- van-cell 绑定事件可能导致循环调用 --> <van-cell bindtap="handleClick" model:value="{{List}}"/>
handleClick
中再次修改List
并触发setData
,会形成循环更新。 - 解决:
- 确保事件处理函数无自调用。
- 使用
console.log
或断点调试,追踪函数调用链。
2. 优化数据绑定逻辑
- 避免循环更新:
// 错误示例:setData 中修改同一属性 this.setData({ List: newList }); this.setData({ List: updatedList }); // 可能触发二次渲染
- 合并数据更新逻辑,减少
setData
调用次数。 - 使用
wx:if
控制组件渲染频率,避免不必要的重绘。
- 合并数据更新逻辑,减少
3. 处理复杂组件渲染
- rich-text 组件优化:
- 简化 HTML 结构,避免多层嵌套。
- 过滤无效标签或样式(如
style
属性)
- Image 组件优化:
- 避免动态修改
src
属性,可缓存图片 URL。
- 避免动态修改
4. 页面跳转层级控制
- 问题:超过 5 级页面跳转时,
wx.navigateTo
会报错 - 解决:
- 使用
wx.redirectTo
替代深层跳转(关闭当前页面跳转新页)。 - 通过
getCurrentPages()
获取页面栈,手动管理跳转逻辑。
- 使用
5. 调试工具定位问题
- 步骤:
- 在微信开发者工具中开启性能分析。
- 使用
debugger
语句或断点定位递归调用位置。 - 检查调用栈中重复出现的函数名,优化逻辑。