vue3 電商類網站實現規格的選擇

目前有一個這樣的需求 類似淘寶 京東選擇?

但是在人家大廠給的數據我不清除是什么樣子的?

我這邊后端給的數據 一開始是想把規格全部顯示出來的 發現實現不了 后端的數據有限

因為必須選擇一個顏色 才可以對應的第二個規格 才知道有沒有庫存

因為這個庫存 是由兩個規格決定的 這種的話 要想 做成京東或者淘寶那種?

無庫存無法顯示的效果是不行的 看一下我的后端給的數據

?

[{"id": "1384947912936914944","image": "","stock": 0,"supplyCode": "","sellerPrice": "8250","masterAttrName": "顏色","masterAttrValue": "紫綠色調00374","slaveAttrName": "參考身高","slaveAttrValue": "160cm"},{"id": "1384947912953692160","image": "","stock": 19,"supplyCode": "","sellerPrice": "8250","masterAttrName": "顏色","masterAttrValue": "紫綠色調00374","slaveAttrName": "參考身高","slaveAttrValue": "165cm"},{"id": "1384947912970469376","image": "","stock": 50,"supplyCode": "","sellerPrice": "8250","masterAttrName": "顏色","masterAttrValue": "紅綠色調00364","slaveAttrName": "參考身高","slaveAttrValue": "160cm"},{"id": "1384947912987246592","image": "","stock": 100,"supplyCode": "","sellerPrice": "8250","masterAttrName": "顏色","masterAttrValue": "紅綠色調00364","slaveAttrName": "參考身高","slaveAttrValue": "165cm"}
]

這里面的數據 stock 是 0 的話 我前端自己又加了一個數據 isDisable字段 為true 無法選擇

需要把這個數據整體更換成 這樣的就好了

[{"value": "紫綠色調00374","disabled": false,"heights": [{"value": "160cm","stock": 0,"disabled": true},{"value": "165cm","stock": 19,"disabled": false}]},{"value": "紅綠色調00364","disabled": false,"heights": [{"value": "160cm","stock": 50,"disabled": false},{"value": "165cm","stock": 100,"disabled": false}]}
]

最終我們需要這樣的數據來顯示 就好了

我認為這樣的數據 才是 最符合 的 很明顯 后端給的數據 差距太大 說實話?

我一下子沒有想起來怎么把上面的數據處理成下面這樣

我也是搜了搜

使用 new Map? 映射一下 最后在Array.from(new Map.values)? 映射出來就好了

我直接上代碼吧

      colorOptions: [],heightOptions: [],filterOptions: [],  中轉 相當于選擇了規格1 的經過 去篩選規格2 的顯示selectedColor: null, //規格1選擇的結果selectedHeight: null    //規格1選擇的結果initOptions() {const colorMap = new Map();const heightMap = new Map();// 首先收集所有顏色和身高選項this.originalData.forEach(product => {// 處理顏色選項if (!colorMap.has(product.masterAttrValue)) {colorMap.set(product.masterAttrValue, {value: product.masterAttrValue,disabled: false, // 初始不禁用heights: new Map() // 存儲身高和對應的庫存});}const colorOption = colorMap.get(product.masterAttrValue);colorOption.heights.set(product.slaveAttrValue, product.stock);// 處理身高選項if (!heightMap.has(product.slaveAttrValue)) {heightMap.set(product.slaveAttrValue, {value: product.slaveAttrValue,disabled: product.stock === 0, // 身高選項的禁用狀態基于庫存colors: new Map() // 存儲顏色和對應的庫存});}const heightOption = heightMap.get(product.slaveAttrValue);heightOption.colors.set(product.masterAttrValue, product.stock);});// 轉換顏色選項:只有當所有身高都缺貨時才禁用顏色this.colorOptions = Array.from(colorMap.values()).map(color => {const hasStock = Array.from(color.heights.values()).some(stock => stock > 0);return {...color,disabled: !hasStock,heights: Array.from(color.heights.entries()).map(([height, stock]) => ({value: height,stock,disabled: stock === 0}))};});// 轉換身高選項this.heightOptions = Array.from(heightMap.values()).map(height => ({...height,colors: Array.from(height.colors.entries()).map(([color, stock]) => ({value: color,stock,disabled: stock === 0}))}));console.log(this.colorOptions, 'this.colorOptions');console.log(this.heightOptions, 'this.colorOptions');},

上面的數據到下面 這個方法就夠了

然后頁面上顯示我也拿出來

  <div class="cate-selected-box"><div class="cate-title"> {{ info.masterAttrName }}</div><ul class="cate-list"><li class="level1-item" v-for="color in colorOptions" :key="color.value" @click="selectColor(color)":class="{ 'disabled': color.disabled, 'selected': selectedColor === color.value }">{{ color.value }}<span v-if="color.disabled">(缺貨)</span></li></ul><div class="cate-title"> {{ info.slaveAttrName }}</div><ul class="cate-list" v-if="filterOptions.length"><li class="level1-item" v-for="item in filterOptions" v-if="item.value != '-'" :key="item.value"@click.stop="selectHeight(item)":class="{ 'disabled': item.disabled, 'selected': selectedHeight === item.value }">{{ item.value }}<span v-if="item.disabled">(缺貨)</span></li></ul><div class="selected-info" v-if="info.productSpecials && info.productSpecials.length > 1"><div class="item"><div class="label">已選擇:</div><!-- &&  --><div class="value"v-if="(info.slaveAttrValues && info.slaveAttrValues.length) && (info.masterAttrValues && info.masterAttrValues.length)"><div v-if="selectedColor && selectedHeight">{{ selectedColor }} - {{ selectedHeight }}</div></div><div class="value"v-if="(!info.slaveAttrValues) && (info.masterAttrValues && info.masterAttrValues.length)"><div v-if="selectedColor">{{ selectedColor }}</div></div></div></div></div>
li {list-style: none;padding: 0;margin: 0;
}ul {padding: 0;margin: 0;
}.cate-selected-box {.cate-title {font-weight: 700;margin: 10px 0;}.selected-info {margin: 15px;margin-top: 25px;.item {display: flex;align-items: center;.label {color: 858a99;}.value {color: #6034b9;margin-left: 10px;}}}.cate-list {cursor: pointer;display: flex;flex-wrap: wrap;align-items: center;.level1-item {padding: 10px 20px;border: 1px solid #f7f8f9;border-radius: 5px;transition: all 0.3s;margin: 6px;}.level1-item:hover {border: 1px solid #6034b9;}.level1-item:nth-child(n+2) {// margin-left: 10px;// margin: 10px;}}}.disabled {color: #ccc;cursor: not-allowed;
}.selected {background-color: #6034b9;color: white;border-color: #6034b9;
}

這一部分的樣式我也顯示出來了

大家如果把這個放到vue 文件中 是直接能夠顯示效果的

這里面的難點其實是這個 new Map 的使用 我也使用的好少 Es6 的方法如果說不使用 這個 其實 也能夠想辦法 把這個處理好 但是方法不太好想

這些都是經驗嗎 每次記一點 下次遇到了就能有想法了

學習前端就是這樣 哪怕你死記硬背 有時候 也有用 就會知道什么方法處理什么問題

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

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

相關文章

HarmonyOS5 音樂播放器app(一):歌曲展示與收藏功能(附代碼)

鴻蒙音樂應用開發&#xff1a;從收藏功能實現看狀態管理與交互設計 在移動應用開發中&#xff0c;收藏功能是用戶體驗的重要組成部分。本文將以鴻蒙OS音樂應用為例&#xff0c;詳細解析如何實現具有動畫效果的收藏功能&#xff0c;涉及狀態管理、組件通信和交互動畫等核心技術…

PHP函數大全參考代碼

字符串相關操作函數 去除空格或其他字符 trim刪除字符串兩端空格或其他預定義字符rtrim刪除字符串右邊空格或其他預定義字符choprtrim() 的別名 chop() 與 Perl 的 chop() 函數有所不同&#xff0c;它會刪除字符串的最后一個字符。ltrim刪除字符串左邊空格或其他預定義字符 字…

Flowise工作流引擎的本地部署與遠程訪問實踐

文章目錄 前言1. Docker安裝Flowise2. Ubuntu安裝Cpolar3. 配置Flowise公網地址4. 遠程訪問Flowise5. 固定Cpolar公網地址6. 固定地址訪問 前言 當多數團隊仍深陷傳統數據處理框架的桎梏時&#xff0c;創新者已率先引入Flowise智能流程引擎&#xff0c;成功將面向大型語言模型…

端側AI+OS垂直創新研究報告

端側AIOS垂直創新研究報告 摘要 端側AIOS研究背景、核心創新點及產業價值 研究背景 隨著AI技術的快速發展&#xff0c;端側AI已成為2025年的重要技術趨勢[4]。端側AI是指將AI計算能力從云端遷移到終端設備上&#xff0c;實現本地化的智能處理。這一技術變革主要受到隱私安全…

【JVM 07-運行時常量池重要組成部分-StringTable】

StringTable 筆記記錄 1. 常量池、運行時常量池與字符串常量池(StringTable)的關系2. String str"a"放入字符串常量池的過程3. 常見面試題4. StringTable特性5.StringTable的位置變更5.1 為什么位置變換&#xff1f;5.2 位置變更演示 6. StringTable垃圾回收7. Strin…

算法-每日一題(DAY10)打家劫舍

1.題目鏈接&#xff1a; 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 2.題目描述&#xff1a; 你是一個專業的小偷&#xff0c;計劃偷竊沿街的房屋。每間房內都藏有一定的現金&#xff0c;影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統&#xf…

android UI 布局

一&#xff1a;約束布局 參考&#xff1a; 【約束布局】ConstraintLayout 約束布局 ( 簡介 | 引入依賴 | 基本操作 | 垂直定位約束 | 角度定位約束 | 基線約束 )_韓曙亮-2048 AI社區 以下是一個基于 ConstraintLayout 的簡單 Android 示例&#xff0c;包含三個控件&#xff0…

【K8S】詳解Labels?? 和 ??Annotations

在 Kubernetes&#xff08;K8s&#xff09;中&#xff0c;??Labels&#xff08;標簽&#xff09;?? 和 ??Annotations&#xff08;注解&#xff09;?? 都是用于為資源對象&#xff08;如 Pod、Service、Deployment&#xff09;附加元數據的機制&#xff0c;但它們在設計…

系統模塊編程與實現

設備類&#xff08;Device Class&#xff09;?? 和 ??設備節點&#xff08;Device Node&#xff09;??是深入 Linux 設備管理和驅動模型的核心基礎。它們就像“骨骼”與“門戶”&#xff0c;共同構建了 Linux 與硬件交互的核心橋梁。 一、設備類與設備節點 1. ??設備…

視頻壓縮、碼率與流媒體傳輸知識總結

&#x1f3a5; 視頻壓縮、碼率與流媒體傳輸知識總結 本筆記整理了 I/P/B 幀結構、碼率計算、文件大小估算、壓縮格式對比、推流帶寬建議等視頻工程常見技術要點。 一、單幀與未壓縮視頻數據量估算 分辨率&#xff1a;19201080&#xff08;1080p&#xff09; 色深&#xff1a;…

嵌入式C++學習路線

&#x1f680; 嵌入式C學習路線圖 從C語言基礎到嵌入式C高手的完整路徑 &#x1f4cb; 學習進度追蹤 總體目標&#xff1a; 20-26周完成全部學習內容 前置條件&#xff1a; C語言基礎 STM32開發經驗 學習方式&#xff1a; 理論學習 實踐項目 階段1: C基礎過渡 (2-3周) 目標…

VSCode1.101.1Win多語言語言編輯器便攜版安裝教程

軟件下載 【名稱】&#xff1a; VSCode1.101.1 【大小】&#xff1a; 120M 【語言】&#xff1a; 簡體中文 【安裝環境】&#xff1a; Win10/Win11 【迅雷網盤下載鏈接】&#xff08;務必手機注冊&#xff09;&#xff1a; 迅雷 【網站下載鏈接】: 其他網盤 軟件介紹 VSCod…

ssh 服務和 rsync 數據同步

目錄 一、ssh服務 1、概述 2、命令解析 遠程登錄命令 遠程拷貝命令 3、登錄方式配置 1、用戶名密碼登錄 2、公鑰驗證登錄 二、rsync 數據同步 1、rsync概述 2、rsync運行原理 3、rsync部署 一、ssh服務 1、概述 ssh服務&#xff0c;一種遠程管理連接工具&#xf…

使用隨機森林實現目標檢測

核心實現思路 滑動窗口策略&#xff1a;在圖像上滑動固定大小的窗口&#xff0c;對每個窗口進行分類多維特征提取&#xff1a;結合統計特征、紋理特征、邊緣特征、形狀特征等隨機森林分類&#xff1a;訓練二分類器判斷窗口是否包含目標后處理優化&#xff1a;使用非極大值抑制…

3.6 move_base導航初體驗

1.環境搭建 在工作空間src下git wpr_simulation&#xff0c;安裝install_for_noetic.sh&#xff0c;然后再回退工作空間進行編譯 下載參數文件 git clone https://github.com/6-robot/wpb_home.git下載需要魔法&#xff0c;在這里可以使用手機熱點進行平替 進入腳本文件夾 …

Mysql高級——MVCC(多版本并發控制)

MySQL MVCC&#xff08;多版本并發控制&#xff09;詳解 MVCC&#xff08;Multi-Version Concurrency Control&#xff09;是 MySQL InnoDB 存儲引擎實現的一種并發控制機制&#xff0c;用于在保證事務隔離性的同時&#xff0c;提高數據庫的并發性能。下面從原理、實現、事務隔…

Oracle union連接的怎么排序

在Oracle數據庫中&#xff0c;使用UNION或UNION ALL操作符來合并兩個或多個查詢結果時&#xff0c;如果想對這些合并后的結果進行排序&#xff0c;通常有兩種方法可以實現&#xff1a; 方法1&#xff1a;在最后的查詢結果上使用ORDER BY 你可以在所有使用UNION或UNION ALL合并…

uni-app總結2-所需知識儲備和學習途徑

使用uni-app進行跨平臺開發&#xff0c;開發者不用去掌握各個平臺的開發語言&#xff0c;只需一套代碼即可完成多端的產品輸出。那么使用uni-app需要掌握什么呢&#xff0c;這里給大家分享一下。 Vue.js uni-app里是通過Vue來開發的&#xff0c;所以首先肯定是要掌握Vue語言。…

如何高效實現公司文件管理

要實現公司文件管理的高效&#xff0c;企業應聚焦統一文件規范、部署文檔管理系統、強化權限控制、推動協同編輯、實施定期清理、推進文化建設、引入可視化分析。其中&#xff0c;統一文件規范是文件高效管理的基礎。若缺乏清晰的命名規則與分類體系&#xff0c;即便配備了先進…

多模態大語言模型arxiv論文略讀(124)

MediConfusion: Can you trust your AI radiologist? Probing the reliability of multimodal medical foundation models ?? 論文標題&#xff1a;MediConfusion: Can you trust your AI radiologist? Probing the reliability of multimodal medical foundation models …