📌 背景介绍

在微信小程序开发中,我们经常需要修改数组中某个对象的某个字段,比如:

  • 列表中的某一项展开/收起
  • 多选状态切换
  • 数据列表中的临时标记等

一个常见的场景是:

lists: [{ show: true }, { show: true }, { show: true }]

当点击某一项时,只想切换对应项的 show 状态。


✅ 方法对比:两种常见写法

✨ 方法一(推荐):使用动态 key 精准更新

<view wx:for="{{lists}}" data-idx="{{index}}" bindtap="tap">{{item.show ? '显示' : '隐藏'}}
</view>
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 工具文件中,项目更清晰。


🚀 Bonus:工具函数更进一步

支持数组字段的安全更新:

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 是优化性能、保持代码清晰的重要一环。推荐在实际项目中封装字段更新函数,提升复用性和工程质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912262.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912262.shtml
英文地址,请注明出处:http://en.pswp.cn/news/912262.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 临时表空间相关操作

一、临时表空间概述 临时表空间&#xff08;Temporary Tablespace&#xff09;是Oracle数据库中用于存储临时数据的特殊存储区域&#xff0c;其数据在会话结束或事务提交后自动清除&#xff0c;重启数据库后彻底消失。主要用途包括&#xff1a; 存储排序操作&#xff08;如OR…

从静态到动态:Web渲染模式的演进和突破

渲染模式有好多种&#xff0c;了解下web的各种渲染模式&#xff0c;对技术选型有很大的参考作用。 一、静态HTML时代 早期&#xff08;1990 - 1995年&#xff09;网页开发完全依赖手工编写HTML&#xff08;HyperText Markup Language&#xff09;和CSS&#xff08;层叠样式表…

Flask(六) 数据库操作SQLAlchemy

文章目录 一、准备工作二、最小化可运行示例✅ 补充延迟绑定方式&#xff08;推荐方式&#xff09; 三、数据库基本操作&#xff08;增删改查&#xff09;1. 插入数据&#xff08;增&#xff09;2. 查询数据&#xff08;查&#xff09;3. 更新数据&#xff08;改&#xff09;4.…

PYTHON从入门到实践7-获取用户输入与while循环

# 【1】获取用户输入 # 【2】python数据类型的转换 input_res input("请输入一个数字\n") if int(input_res) % 10 0:print("你输入的数是10的倍数") else:print("你输入的数不是10的倍数") # 【3】while循环&#xff0c;适合不知道循环多少次…

学习笔记(C++篇)—— Day 8

1.STL简介 STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 2.STL的六大组件 先这样&#xff0c;下一部分是string的内容&#xff0c;内容比较多&a…

ant+Jmeter+jenkins接口自动化,如何实现把执行失败的接口信息单独发邮件?

B站讲的最好的自动化测试教程&#xff0c;工具框架附项目实战一套速通&#xff0c;零基础完全轻松掌握&#xff01;自动化测试课程、web/app/接口 实现AntJMeterJenkins接口自动化失败接口邮件通知方案 要实现只发送执行失败的接口信息邮件通知&#xff0c;可以通过以下步骤实…

恶意Python包“psslib“实施拼写错误攻击,可强制关闭Windows系统

Socket威胁研究团队发现一个名为psslib的恶意Python包&#xff0c;该软件包伪装成提供密码安全功能&#xff0c;实则会突然关闭Windows系统。这个由化名umaraq的威胁行为者开发的软件包&#xff0c;是对知名密码哈希工具库passlib的拼写错误仿冒&#xff08;typosquatting&…

云原生灰度方案对比:服务网格灰度(Istio ) 与 K8s Ingress 灰度(Nginx Ingress )

服务网格灰度与 Kubernetes Ingress 灰度是云原生环境下两种主流的灰度发布方案&#xff0c;它们在架构定位、实现方式和适用场景上存在显著差异。以下从多个维度对比分析&#xff0c;并给出选型建议&#xff1a; 一、核心区别对比 维度服务网格灰度&#xff08;以 Istio 为例…

科技如何影响我们的生活?

科技已成为我们生活中不可或缺的一部分&#xff0c;彻底改变了我们工作、沟通和生活的方式。从智能手机到智能家居&#xff0c;科技已渗透到我们生活的每个角落。无论是用手机闹钟开启新的一天&#xff0c;通过 Alexa 开关灯光&#xff0c;还是打开 Uber 或 Lyft 打车上班&…

Re--攻防世界-基础android

Jadx 可以看到有账号密码输入 进入checkPassword函数 分析一下&#xff1a; 对每个字符 pass[len] 进行以下计算 pass[len] (char) (((255 - len) - 100) - pass[len]); 解密脚本 def decrypt_password(): password [] for len in range(12): c (255 - le…

InnoDB表空间结构-系统表空间

系统表空间整体结构 页号为7的SYS类型页结构

如何构建知识库

构建个人知识库是一个系统化的过程&#xff0c;需要结合工具选择、信息管理和持续优化。以下是分步骤的实用指南&#xff0c;包含现代工具和方法的建议&#xff1a; 一、明确知识库定位&#xff08;Why&#xff09; ​核心目标​ 学习型&#xff1a;支持学术研究/职业发展&…

3 大语言模型预训练数据-3.2 数据处理-3.2.2 冗余去除——2.SimHash算法文本去重实战案例:新闻文章去重场景

SimHash算法文本去重实战案例&#xff1a;新闻文章去重场景 一、案例背景与目标二、具体实现步骤与示例1. **待去重文本示例**2. **步骤1&#xff1a;文本预处理与特征提取**3. **步骤2&#xff1a;特征向量化与哈希映射**4. **步骤3&#xff1a;特征向量聚合**5. **步骤4&…

MSPM0G3507之GPIO配置报错 #Sysconfig报错

声明&#xff1a;本文完全免费阅读&#xff0c;如果你发现某天文章被设置了“VIP权限”&#xff0c;请私信我解除&#xff08;非笔者所为&#xff09;。 一、问题现象 在打开sysconfig后&#xff0c;GPIO这里会报错。 Unable to render selection Error:launchPadShortcut:Vali…

2025年检测相机十大品牌测评:工业级精度与场景化解决方案解析

一、引言 在工业自动化与智能制造领域&#xff0c;检测相机作为质量管控的核心硬件&#xff0c;正以“高精度、高速度、高适应性”的特性重塑生产流程。这类设备通过光学成像与智能算法结合&#xff0c;实现对工件表面缺陷、尺寸偏差、装配精度的精准检测&#xff0c;效率较传…

Python异步编程深度解析

一、异步编程范式演进 同步阻塞的困境&#xff1a;GIL限制与线程切换开销 事件循环本质&#xff1a;单线程并发模型 协程优势&#xff1a;比线程更轻量的执行单元 IO密集型场景&#xff1a;网络请求/文件操作的最佳实践 二、核心语法精要 import asyncioasync def fetch_…

网络缓冲区

用户态网络缓冲区 网络缓冲区原理为什么需要用户态网络缓冲区Linux下如何接收和发送数据包用户态网络缓冲区设计的本质 网络缓冲区代码实现 网络缓冲区原理 为什么需要用户态网络缓冲区 在网络开发中&#xff0c;我们经常使用到read/write/recv/send等系统调用接口&#xff0…

微信小程序实现简版点赞动画

这是第二次写canvas&#xff0c;基于微信小程序文档demo进行改写 demo效果为方块横向来回循环移动 我想做的是直播间那种点赞效果&#xff0c;竖向曲线移动、方块换成图片、点击添加绘制元素 第一阶段实现竖向曲线移动、点击添加绘制元素&#xff1b;下一阶段讲方块替换为图…

实现一个AI大模型当前都无法正确实现的基础二叉树读取算法

概述 图1: 图2: 上图帮大家温习完全二叉树的概念&#xff0c;本文讲的是完全顺序二叉树的初始化 华为的员工、考过华为OD的员工、参加过其他类似大厂的考试的员工一般做过二叉树的初始化&#xff0c;甚至有些还碰到过手撕代码时面试官要求做二叉树遍历&#xff0c;看完本文的…

【攻防篇】阿里云服务器中 如何关闭docker api端口

在阿里云服务器&#xff08;ECS&#xff09;上&#xff0c;Docker API 默认监听 2375&#xff08;非加密&#xff09;和 2376&#xff08;TLS加密&#xff09;端口。如果未正确配置&#xff0c;可能被恶意利用&#xff08;如挖矿攻击&#xff09;。以下是关闭和加固 Docker API…