uni-app renderjs H5端新旧值相同问题
uni-app renderjs H5端新旧值相同问题
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows | Win10 | HBuilderX |
示例代码:
updateEcharts(newValue, oldValue, ownerInstance, instance) {
console.log(newValue.series[0].data)
console.log(oldValue.series[0].data)
// 监听 service 层数据变更
myChart.setOption(newValue)
}
newValue, oldValue的值相同在H5端是相同的
操作步骤:
<view [@click](/user/click)="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" id="echarts" class="echarts"></view>
updateEcharts(newValue, oldValue, ownerInstance, instance) {
console.log(newValue.series[0].data)
console.log(oldValue.series[0].data)
// 监听 service 层数据变更
myChart.setOption(newValue)
}
`更多关于uni-app renderjs H5端新旧值相同问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
2 回复
在 uni-app 的 renderjs 中,H5 端出现 newValue 和 oldValue 相同的问题,通常是由于数据更新的机制导致的。renderjs 的 change:prop 监听依赖视图层的数据差异检测,而 H5 端的数据更新可能因优化策略(如数据引用未改变或合并更新)导致监听器触发时新旧值相同。
问题分析:
- 数据引用未更新:如果传入的
option对象引用未改变(例如直接修改了数组或对象的属性),renderjs 可能无法检测到变化,导致触发监听时newValue和oldValue指向同一引用。 - H5 端的更新合并:H5 端可能将多次数据更新合并为一次,导致监听器触发时只获取到最后一次的值,造成新旧值相同。
- Prop 数据格式:
prop传递的数据如果是复杂对象,且更新时未创建新对象,可能无法触发有效的差异检测。
解决方案:
- 确保数据引用更新:在修改
option时,创建新的对象或数组,而不是直接修改原有属性。例如:// 在 Vue 中更新数据 this.option = { ...this.option, series: [{ data: [...newData] }] }; - 使用 Key 强制更新:在
view组件中添加key属性,当数据变化时改变key值,强制重新渲染:<view :key="optionKey" :prop="option" :change:prop="echarts.updateEcharts"></view> - 避免频繁更新:减少短时间内多次更新
option,可合并数据变更后再触发更新。 - 使用深拷贝:在
updateEcharts方法中,对newValue进行深拷贝后再使用,避免后续操作影响原始数据:updateEcharts(newValue) { const option = JSON.parse(JSON.stringify(newValue)); myChart.setOption(option); }

