在微信小程序开发中,我们经常需要修改数组中某个对象的某个字段,比如:
一个常见的场景是:
lists: [{ show: true }, { show: true }, { show: true }]
当点击某一项时,只想切换对应项的 show
状态。
{{item.show ? '显示' : '隐藏'}}
Page({
data: {
lists: [{ show: true }, { show: true }, { show: true }]
},
tap(e) {
const idx = e.currentTarget.dataset.idx;
const key = `lists[${idx}].show`;
const current = this.data.lists[idx].show;
this.setData({
[key]: !current
});
}
});
Page({
data: {
lists: [{ show: true }, { show: true }, { show: true }]
},
tap(e) {
const idx = e.currentTarget.dataset.idx;
this.data.lists[idx].show = !this.data.lists[idx].show;
this.setData({
lists: this.data.lists
});
}
});
this.data
会破坏响应式数据结构setData
的更新范围大,可能导致整个数组渲染为避免重复写动态字符串,可以封装一个小工具方法:
function updateField(page, path, value) {
page.setData({ [path]: value });
}
使用方式如下:
const idx = e.currentTarget.dataset.idx;
const path = `lists[${idx}].show`;
const current = this.data.lists[idx].show;
updateField(this, path, !current);
可将 updateField
抽取到 utils.js
工具文件中,项目更清晰。
支持数组字段的安全更新:
function updateArrayItemField(page, arrayKey, index, field, value) {
const path = `${arrayKey}[${index}].${field}`;
page.setData({ [path]: value });
}
// 用法:
updateArrayItemField(this, 'lists', idx, 'show', !this.data.lists[idx].show);
维度 | 方法一(推荐) | 方法二(不推荐) |
---|---|---|
性能 | ✅ 高(局部更新) | ❌ 低(全量更新) |
可维护性 | ✅ 好 | ❌ 差 |
数据安全 | ✅ 不污染原始数据 | ❌ 易出问题 |
项目适用性 | ✅ 中大型项目 | ❌ 仅限简单场景 |
在小程序开发中,合理使用 setData
是优化性能、保持代码清晰的重要一环。推荐在实际项目中封装字段更新函数,提升复用性和工程质量。