原生微信小程序:用 `setData` 正確修改數組中的對象項狀態(附實戰技巧)

📌 背景介紹

在微信小程序開發中,我們經常需要修改數組中某個對象的某個字段,比如:

  • 列表中的某一項展開/收起
  • 多選狀態切換
  • 數據列表中的臨時標記等

一個常見的場景是:

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…