掌握 findIndex、push 和 splice:打造微信小程序的靈活圖片上傳功能?

文章目錄

  • ? 掌握 `findIndex`、`push` 和 `splice`:打造微信小程序的靈活圖片上傳功能 🌟
    • 示例場景:小程序圖片上傳
    • 🌼 認識 `findIndex`
      • 定義
      • 語法
      • 在代碼中的應用
        • 示例
        • 當前行為
    • 🚀 認識 `push`
      • 定義
      • 語法
      • 在代碼中的應用
        • 示例
        • 特點
    • ?? 認識 `splice`
      • 定義
      • 語法
      • 在代碼中的應用
        • 示例
        • 特點
    • 🌈 三者的協作:動態管理
      • 操作流程
      • 長度變化
    • 🔧 優化:固定 4 張
      • 問題
      • 優化代碼
      • 效果
      • 長度變化
    • 🌟 三者的最佳實踐
        • 建議
    • 🎉 總結

? 掌握 findIndexpushsplice:打造微信小程序的靈活圖片上傳功能 🌟

在 JavaScript 中,數組操作是前端開發的核心技能。findIndexpushsplice 是三個功能強大且常用的方法,分別用于查找、追加和修改數組元素。在微信小程序開發中,這三個方法可以幫助我們實現動態的圖片上傳管理。今天,我們將以一個小程序的圖片上傳場景為例,探索它們如何協作,確保數據與 UI 無縫匹配,并提供優化方案以滿足固定槽位的需求。

本文從實踐出發,帶你深入理解三者的應用與優化。


示例場景:小程序圖片上傳

我們開發一個微信小程序,用戶可以上傳產品照片到 productImages 數組,UI 展示最多 4 張。以下是初始代碼:

Page({data: {productImages: [], // 產品照片數組},chooseImage: async function() {try {const res = await wx.chooseMedia({count: 1,mediaType: ['image'],sourceType: ['album', 'camera']});if (!res.tempFiles || res.tempFiles.length === 0) {throw new Error('未選擇任何圖片');}const imagePath = await uploadImage(res.tempFiles[0].tempFilePath, 'fake-strategy', 1);const imageUrl = `${path.IMAGE_BASE_URL}${imagePath}`;const productImages = [...this.data.productImages];const emptyIndex = productImages.findIndex(img => !img);if (emptyIndex !== -1) {productImages[emptyIndex] = imageUrl;} else {productImages.push(imageUrl);}this.setData({ productImages });} catch (error) {wx.showToast({ title: error.message || '上傳失敗', icon: 'none' });}},deleteImage: function(e) {const index = e.currentTarget.dataset.index;const productImages = this.data.productImages;productImages.splice(index, 1);this.setData({ productImages });},
});
<!-- WXML -->
<view class="image-upload-grid"><block wx:for="{{[0,1,2,3]}}" wx:key="index"><view wx:if="{{productImages[index]}}" class="image-item"><image src="{{productImages[index]}}" bindtap="previewImage" data-url="{{productImages[index]}}"/><view class="delete-btn" bindtap="deleteImage" data-index="{{index}}">×</view></view><view wx:else class="upload-btn" bindtap="chooseImage">+</view></block>
</view>

我們將以此為基礎,分析 findIndexpushsplice 的作用,并探討如何優化為固定 4 張的邏輯。


🌼 認識 findIndex

定義

findIndex 查找數組中第一個滿足條件的元素的索引,若無匹配,返回 -1

語法

array.findIndex(callback(element[, index[, array]])[, thisArg])

在代碼中的應用

const emptyIndex = productImages.findIndex(img => !img);
  • 檢查元素是否為“空值”(如 null)。
  • 作用:定位可替換的空位。
示例
const arr = ['url1', null, 'url3'];
const index = arr.findIndex(img => !img); // 1
當前行為
  • 初始 [],上傳后為有效 URL(如 ['url1']),無 nullemptyIndex 總是 -1

🚀 認識 push

定義

push 將元素追加到數組末尾,返回新長度。

語法

array.push(element1[, ...[, elementN]])

在代碼中的應用

productImages.push(imageUrl);
  • 當無空位時,追加圖片。
示例
const arr = ['url1'];
arr.push('url2'); // ['url1', 'url2']
特點
  • 無長度限制。

?? 認識 splice

定義

splice 修改數組,可刪除或替換元素。

語法

array.splice(start[, deleteCount[, item1[, item2[, ...]]]])

在代碼中的應用

productImages.splice(index, 1);
  • 刪除圖片,縮短數組。
示例
const arr = ['url1', 'url2', 'url3'];
arr.splice(1, 1); // ['url1', 'url3']
特點
  • 減少長度,不留空位。

🌈 三者的協作:動態管理

操作流程

  1. 初始[] -> 4 個“+”。
  2. 上傳 4 張
    • [] -> ['url1'] -> ['url1', 'url2'] -> ['url1', 'url2', 'url3'] -> ['url1', 'url2', 'url3', 'url4']
    • 長度 4,UI 顯示 4 圖。
  3. 刪除索引 1
    • splice(1, 1)['url1', 'url2', 'url3', 'url4'] -> ['url1', 'url3', 'url4']
    • 長度 3,UI 顯示 3 圖 + 1 個“+”。
  4. 上傳第 5 張
    • push('url5')['url1', 'url3', 'url4', 'url5']
    • 長度 4,UI 顯示 4 圖。

長度變化

  • 上傳增加長度,刪除減少長度,最終反映凈結果。

🔧 優化:固定 4 張

問題

  • 無限制:當前 push 可超 4,UI 只顯示前 4 個。
  • findIndex 未生效:無 null,總是追加。

優化代碼

Page({data: {productImages: [null, null, null, null], // 固定 4 個槽位},chooseImage: async function() {// ... 上傳邏輯 ...const productImages = [...this.data.productImages];const emptyIndex = productImages.findIndex(img => !img);if (emptyIndex !== -1) {productImages[emptyIndex] = imageUrl;} else {wx.showToast({ title: '最多 4 張圖片', icon: 'none' });return;}this.setData({ productImages });},deleteImage: function(e) {const index = e.currentTarget.dataset.index;const productImages = [...this.data.productImages];productImages[index] = null;this.setData({ productImages });},
});

效果

  1. 初始[null, null, null, null] -> 4 個“+”。
  2. 上傳 4 張['url1', 'url2', 'url3', 'url4'] -> 4 圖。
  3. 刪除索引 1['url1', null, 'url3', 'url4'] -> 3 圖 + 1 個“+”。
  4. 上傳第 5 張['url1', 'url5', 'url3', 'url4'] -> 4 圖。

長度變化

  • 始終為 4,刪除后空位用 null 占位,上傳替換空位。

🌟 三者的最佳實踐

  • findIndex:定位空位,需有 null
  • push:追加元素,需限制。
  • splice:刪除時可選縮短或保留空位。
建議
  • 固定槽位:用 findIndexnull
  • 動態擴展:用 pushsplice

🎉 總結

findIndexpushsplice 是數組管理的核心工具。通過優化,你可以實現固定或動態的圖片上傳邏輯,確保數據與 UI 一致。試試調整后的代碼,看看效果吧!


在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71026.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71026.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71026.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微服務即時通信系統---(七)文件管理子服務

目錄 功能設計 模塊劃分 業務接口/功能示意圖 服務實現流程 服務代碼實現 封裝文件操作模塊(utils.hpp) 獲取唯一標識ID 文件讀操作 文件寫操作 編寫proto文件 文件元信息 文件管理proto 單文件上傳 多文件上傳 單文件下載 多文件下載 RPC調用 服務端創建子…

fluent-ffmpeg 依賴詳解

fluent-ffmpeg 是一個用于在 Node.js 環境中與 FFmpeg 進行交互的強大庫&#xff0c;它提供了流暢的 API 來執行各種音視頻處理任務&#xff0c;如轉碼、剪輯、合并等。 一、安裝 npm install fluent-ffmpeg二、基本使用 要使用 fluent-ffmpeg&#xff0c;首先需要確保系統中…

第16天:C++多線程完全指南 - 從基礎到現代并發編程

第16天&#xff1a;C多線程完全指南 - 從基礎到現代并發編程 一、多線程基礎概念 1. 線程創建與管理&#xff08;C11&#xff09; #include <iostream> #include <thread>void hello() {std::cout << "Hello from thread " << std::this_…

Pwntools 的詳細介紹、安裝指南、配置說明

Pwntools&#xff1a;Python 開源安全工具箱 一、Pwntools 簡介 Pwntools 是一個由 Security researcher 開發的 高效 Python 工具庫&#xff0c;專為密碼學研究、漏洞利用、協議分析和逆向工程設計。它集成了數百個底層工具的功能&#xff0c;提供統一的 Python API 接口&am…

ES的簡單講解

功能 &#xff1a; 文檔存儲 與 文檔搜索 特點&#xff1a;比如有一個文檔名 “你好” 可以用‘你‘&#xff0c;好&#xff0c;你好都可以搜索到這個文檔 ES核心概念 類似于數據庫中表的概念&#xff0c;在表的概念下又對數據集合進行了細分 ? ES_Client查詢接口 cpr::R…

leetcode_字典樹 139. 單詞拆分

139. 單詞拆分 給你一個字符串 s 和一個字符串列表 wordDict 作為字典。如果可以利用字典中出現的一個或多個單詞拼接出 s 則返回 true。 注意&#xff1a;不要求字典中出現的單詞全部都使用&#xff0c;并且字典中的單詞可以重復使用。 思路: 定義狀態&#xff1a; 設dp[i]表…

寶塔安裝向量數據庫-Milvus

注&#xff1a;寶塔需要安裝好docker容器組件&#xff01; 1、純血寶塔安裝 1.1 在線上鏡像中&#xff0c;拉取milvus鏡像&#xff0c;創建milvus容器 1.2 安裝milvus管理工具ATTU&#xff1b;同樣方式拉取線上鏡像創建attu容器 2、自定義安裝 2.1修改配置 {"registry-…

【K8S】Kubernetes 基本架構、節點類型及運行流程詳解(附架構圖及流程圖)

Kubernetes 架構 k8s 集群 多個 master node 多個 work nodeMaster 節點&#xff08;主節點&#xff09;&#xff1a;負責集群的管理任務&#xff0c;包括調度容器、維護集群狀態、監控集群、管理服務發現等。Worker 節點&#xff08;工作節點&#xff09;&#xff1a;實際運…

數據庫MySQL,在終端輸入后,提示不是內部命令等

【解決問題】mysql提示不是內部或外部命令&#xff0c;也不是可運行的程序 一般這種問題是因為沒有在系統變量里面添加MySQL的可執行路徑 以下是添加可執行路徑的方法&#xff1a; 第一步&#xff1a;winR輸入services.msc 然后找到MySQL&#xff0c;右擊屬性并復制MySQL的可執…

Python 中的線程模塊

Python 中的線程模塊 Python 中的線程模塊 Python 中的線程模塊 thread 模塊是一個標準模塊&#xff0c;提供了簡單易用的方法為程序構建多線程。在幕后&#xff0c;該模塊使用較低級的 _thread 模塊&#xff0c;在 Python 早期版本中&#xff0c;該模塊是多線程的流行選擇。 …

PhotoShop學習01

了解Photoshop 這里省略了Photoshop的軟件安裝&#xff0c;請自行查找資源下載。 1.打開圖片 下圖為啟動photoshop后出現的界面&#xff0c;我們可以通過創建新文件或打開已有文件來啟用photoshop的工作界面。 可以通過左邊的按鈕進行新文件的創建或打開已有文件。 也可以點…

Python大戰Java:AI時代的編程語言‘復仇者聯盟‘能否換C位?

背景 當Java程序員在咖啡機前念叨’Python憑什么搶我飯碗’時&#xff0c;AI實驗室里的Python工程師正用5行代碼召喚出神經網絡——這場編程語言的’權力的游戲’&#xff0c;勝負可能比你想象的更魔幻&#xff01;" 一、茶水間里的戰爭&#xff1a;Java和Python的相愛相…

GitCode 助力 python-office:開啟 Python 自動化辦公新生態

項目倉庫&#xff1a;https://gitcode.com/CoderWanFeng1/python-office 源于需求洞察&#xff0c;打造 Python 辦公神器 項目作者程序員晚楓在運營擁有 14w 粉絲的 B 站賬號 “Python 自動化辦公社區” 時&#xff0c;敏銳察覺到非程序員群體對 Python 學習的強烈需求。在數字…

javaweb + AI day03

一、web基礎 二、分層解耦 注意&#xff1a;bean的名字默認是類名的首字母小寫&#xff01;&#xff01;&#xff01; 三、Mysql count不參與null值統計 四、JDBC 五、MyBatis 數據庫連接池

運行程序時出現加載配置文件時出錯,對路徑****的訪問被拒絕

問題&#xff1a;最近給客戶用c#語言編寫進銷存項目&#xff0c;在用vs2022自帶的打包工具Microsoft visual studio installer projects 打包生成了安裝文件&#xff0c;順利安裝后&#xff0c;點擊桌面快捷方式后出現如下錯誤 經過查詢相關資料發現是桌面快捷方式的權限問題&a…

基于C#的CANoe CLR Adapter開發指南

一、引言 CANoe 是一款廣泛應用于汽車電子開發和測試的工具&#xff0c;它支持多種編程接口&#xff0c;方便開發者進行自定義擴展。CANoe CLR Adapter 允許我們使用 C# 語言與 CANoe 進行交互&#xff0c;充分利用 C# 的強大功能和豐富的類庫。本文將詳細介紹如何基于 C# 進行…

conda怎么遷移之前下載的環境包,把python從3.9升級到3.10

克隆舊環境&#xff08;保留舊環境作為備份&#xff09; conda create -n cloned_env --clone old_env 在克隆環境中直接升級 Python conda activate cloned_env conda install python3.10 升級 Python 后出現 所有包導入失敗 的問題&#xff0c;通常是因為依賴包與新 Pyth…

一文掌握 Scrapy 框架的詳細使用,包括實戰案例

更多內容請見: 爬蟲和逆向教程-專欄介紹和目錄 文章目錄 1. Scrapy 簡介2. Scrapy 的核心組件3. 安裝 Scrapy4. 創建 Scrapy 項目4.1 創建項目4.2 創建 Spider5. 編寫 Spider5.1 定義 Item5.2 編寫 Spider 邏輯6. 運行 Scrapy 爬蟲6.1 運行爬蟲6.2 保存爬取數據7. Scrapy 的高…

筆試-查找最長公共字符串

應用 以字符串形式給定兩行代碼&#xff0c;1<長度<100&#xff0c;由字母、數字、空格組成。請找出最長公共子字符串&#xff0c;如果不存在返回空字符串。 實現 str1 input("請輸入字符串1&#xff1a;") str2 input("請輸入字符串2&#xff1a;&q…

【三維分割】LangSplat: 3D Language Gaussian Splatting(CVPR 2024 highlight)

論文&#xff1a;https://arxiv.org/pdf/2312.16084 代碼&#xff1a;https://github.com/minghanqin/LangSplat 文章目錄 一、3D language field二、回顧 Language Fields的挑戰三、使用SAM學習層次結構語義四、Language Fields 的 3DGS五、開放詞匯查詢&#xff08;Open-voca…