uniapp-商城-60-后臺 新增商品(屬性的選中和頁面顯示,數組join 的使用)

????????前面添加了屬性,添加屬性的子級項目。也分析了如何回顯,但是在添加新的商品的時,我們也同樣需要進行選擇,還要能正常的顯示在界面上。下面對頁面的顯示進行分析。

1、界面情況回顧

屬性顯示其實是個一嵌套的數據顯示。

2、選中的界面

3、頁面顯示

使用了函數方法skuChildName,

還使用了點擊就彈窗在兩個地方都用了。clickSelect

對于默認顯示:還用到了skuTitle 計算接口,

當然這個接口也可以用方法來做,但這里值都可以取得,所以就用這方法。

前一個章節講了顯示,需要添加一個view 進行顯示:

4、相應顯示的需要的方法?skuChildName

方法很簡單,就是將讀取的數據,arr數組,找出數組中的name ,然后對name進行/ 拼接

注意使用的方法?? map

對數組中的值 使用? / 進行拼接。

注意這里只是計算了 子級 項的name??

??????????? //屬性返回子元素的名稱
??????????? skuChildName(arr) {
??????????????? let nsArr = arr.map(item => {
??????????????????? return item.name
??????????????? })
??????????????? return nsArr.join("/")
??????????? },

5、計算頁面的顯示,如果沒有值,那么就顯示點擊添加屬性

是一個計算值的接口,默認是顯示點擊添加屬性

如果this.goodsFormData.sku_select.length 不為0 ,就顯示屬性值中的name,用到的用 jion?? /? 鏈接

注意不是 children,這里只是計算了父級 屬性

在頁面上顯示 也是直接用了該函數名字

??????? computed: {
??????????? skuTitle() {
??????????????? if (this.goodsFormData.sku_select.length) {
??????????????????? let arr = this.goodsFormData.sku_select.map(item => {
??????????????????????? return item.skuName
??????????????????? })
??????????????????? return arr.join("/")
??????????????? } else {
??????????????????? return "點擊添加屬性"
??????????????? }
??????????? }
??????? },

??????????? <uni-forms-item label="商品屬性" >
??????????????? <u-cell :title="skuTitle" isLink :border="false" @click="clickSelect"></u-cell>
??????????????? <view class="skuList">
??????????????????? <view class="item" v-for="item in goodsFormData.sku_select" @click="clickSelect">
??????????????????????? <view class="left">{{item.skuName}}:</view>
??????????????????????? <view class="right">{{skuChildName(item.children)}}</view>
??????????????????? </view>
??????????????? </view>
??????????? </uni-forms-item>

6 整體的代碼(除開商品,屬性這一欄 界面的? 全都有了)

<template><view class="goodsView"><!-- 添加商品 --><uni-forms ref="goodsForm" :model="goodsFormData" :rules="goodsRules" :label-width="100" label-align="right"><uni-forms-item label="商品圖片" required="true"><uni-file-picker v-model="goodsFormData.thumb" fileMediatype="image" mode="grid" ></uni-file-picker></uni-forms-item><uni-forms-item label="商品名稱" required name="name" ><!-- trim 去空格 --><uni-easyinput v-model="goodsFormData.name" placeholder="請輸入商品名稱" trim="both"></uni-easyinput></uni-forms-item><uni-forms-item label="產品分類" required name="category_id"><!-- 云端數據  下拉框獲取  field 就是獲取的內容  一定要寫成 value text 這是官方定義的  value選中的值,text顯示的文本,也就是value后臺用,text前臺用 --><!-- 利用這個組件就實現了后端數據庫的讀取 --><uni-data-select collection="green-mall-categories" field="_id as value, name as text"v-model="goodsFormData.category_id"></uni-data-select></uni-forms-item><uni-forms-item label="商品價格" required name="price"><!-- trim 去空格 --><uni-easyinput type="number" v-model="goodsFormData.price" placeholder="請輸入商品價格"trim="both"></uni-easyinput></uni-forms-item><uni-forms-item label="商品原價"><!-- trim 去空格 --><uni-easyinput type="number" v-model="goodsFormData.before_price" placeholder="請輸入原價"trim="both"></uni-easyinput></uni-forms-item><uni-forms-item label="商品屬性" ><u-cell :title="skuTitle" isLink :border="false" @click="clickSelect"></u-cell><view class="skuList"><view class="item" v-for="item in goodsFormData.sku_select" @click="clickSelect"><view class="left">{{item.skuName}}:</view><view class="right">{{skuChildName(item.children)}}</view></view></view></uni-forms-item><uni-forms-item label="商品描述"><!-- type 是類型  textarea 就是大框 --><uni-easyinput type="textarea" placeholder="請輸入詳細的描述信息"v-model="goodsFormData.description"></uni-easyinput></uni-forms-item><view class="btnView"><button type="primary" @click="onSubmit">確認提交</button></view></uni-forms><uni-popup ref="attrWrapPop" type="bottom"><!-- 底部彈出 type ref 是一個名字屬性,便于被調用 給 clickSelect 在 clickSelect 函數中調用了該接口--><view class="attrWrapper"><!-- 分三部分  就是上中下 頭身體和尾部 --><view class="head"><view class="title">商品屬性</view><!-- clickAddAttr函數  添加屬性的--><view class="addAttr" @click="clickAddAttr()">+ 添加屬性</view></view><view class="body"><!-- 讀取 skuArr 循環顯示 分兩部分顯示 top 和 btngroup--><view class="item" v-for="(item,index) in skuArr"><view class="top"><checkbox :checked="item.checked" @click="changeCheckbox(index)"></checkbox><!-- changeCheckbox  選中就做這個操作 --><!-- checked 是否被選中的屬性標識 --><view class="font">{{item.skuName}}</view></view><view class="btnGroup" v-if="item.checked"><!-- 需要判斷checked 是不是true  是不是選中,選中了就展示--><view class="btn" :class="child.checked?'active':''" v-for="(child,cIdx) in item.children"@click="clickChlidBtn(index,cIdx)">{{child.name}}</view><!-- btn 讀取skuArr ,循環顯示選中就加class 為active  點擊 就執行 clickChlidBtn函數--><view class="btn" @click="clickAddAttr(index)"><!-- btn 該盒子就是一個 + 號,用來添加該屬性下的選項 clickAddAttr 點就執行uicon就一個 + 號圖標  --><u-icon name="plus"></u-icon></view></view></view></view><view class="foot"><button type="primary" @click="clickConfirmSelect">確認選擇</button><!-- 按鈕 ,藍色提交按鈕type 就是顏色格式點擊就是確認該商品的屬性clickConfirmSelect--></view></view><view class="safe-area-bottom"></view><!--防止被蘋果虛擬home鍵 擋住 --><!-- 這里就是直接調用的app.vue的全局樣式。什么是全局樣式:就是樣式那里沒有scoped 的,所以在以前老是要寫一個表示局部樣式,就怕vue 中class名字一樣了如果你不些scoped ,就要把全局的view 的class 寫在最前面。不知道懂不懂,慢慢悟吧--></uni-popup><!-- 這里是點擊的添加屬性的彈窗 --><!-- 你可能懵逼了那個添加屬性的彈窗?兩個彈窗都要用一個是第一個彈窗中的右上角的添加屬性  class名字 addAttr一個是屬性規格下的選項中的 + class的名字就是btn--><uni-popup ref="addAttrPop"><uni-popup-dialog mode="input" title="新增" placeholder="請輸入新增的內容"@confirm="dialogConfirm"></uni-popup-dialog><!-- dialogConfirm 是一個確認后處理邏輯 --></uni-popup></view>
</template><script>const skuCloudObj = uniCloud.importObject("green-mall-sku", {"customUI": true});const goodsCloudObj = uniCloud.importObject("green-mall-goods", {"customUI": true})export default {data() {return {goodsFormData: {thumb: [],name: "",category_id: null,price: null,before_price: null,description: "",sku_select: []},addAttrType: "parent", //parent代表父,child代表子goodsRules: {name: {rules: [{required: true,errorMessage: "請輸入產品名稱"}]},price: {rules: [{required: true,errorMessage: "請輸入產品價格"}]},category_id: {rules: [{required: true,errorMessage: "請輸入產品分類"}]}},/*skuArr: [{_id:1,skuName:"顏色",checked:false,children:[{name:"紅",checked:false},{name:"藍",checked:false}]},{_id:2,skuName:"規格",checked:false,children:[{name:"M",checked:false},{name:"S",checked:false}]}],*/// 上面是一個數據結構例子,后臺數據就應該著這樣存// 實際是下面的[]skuArr: [],};},onLoad() {},computed: {skuTitle() {if (this.goodsFormData.sku_select.length) {let arr = this.goodsFormData.sku_select.map(item => {return item.skuName})console.log(arr);return arr.join("/")} else {return "點擊添加屬性"}}},methods: {//屬性返回子元素的名稱skuChildName(arr) {let nsArr = arr.map(item => {return item.name})return nsArr.join("/")},//點擊確認選擇 是在彈出框上選//some 數組至少有一個滿足 沒有就是false   every就是每一個都要滿足,不滿足就是false// 這里filter 選出父級屬性 checked =true 被選中的 且子級屬性有一個被選中的數組對象;// 然后再對選中的對象,逐一進行map運算//運算就是filter 過濾出來選中的子級元素//返回一個 數組 arr 且元素為一個對象,對象展開了item ,然后將children的值放到里面,覆蓋item中的childrenclickConfirmSelect() {let arr = this.skuArr.filter(item => {let state = item.children.some(child => child.checked)  return item.checked && state}).map(item => {let children = item.children.filter(child => {return child.checked})// console.log(item,11111111);// console.log(children,2222222);return {...item,// children   //覆蓋了item中children}})this.goodsFormData.sku_select = arr   //賦值后,頁面在使用這個數組來顯示  立即回顯this.$refs.attrWrapPop.close();   //關閉掉彈窗},//獲取sku列表async getSkuData() {let res = await skuCloudObj.get();this.skuArr = res.data// console.log(res);},//點擊添加屬性 index 存在就是嵌套下 父類屬性的子類選項 ,不存在就是添加父類屬性clickAddAttr(index = null) {if (index == null) {this.addAttrType = "parent"this.attrIndex = null} else {this.addAttrType = "child"this.attrIndex = index}this.$refs.addAttrPop.open();},//添加屬性彈窗的確認按鈕async dialogConfirm(e) {if (!e) return;if (this.addAttrType == "parent") {let obj = {skuName: e,checked: true,children: []}let res = await skuCloudObj.add(obj)obj._id = res.id;this.skuArr.push(obj)//向數組中添加一個元素,就彈窗的確認按鈕} else if (this.addAttrType == "child") {let obj = {name: e,checked: true}let id = this.skuArr[this.attrIndex]._id;let res = await skuCloudObj.updateChild(id, obj)this.skuArr[this.attrIndex].children.push(obj)}},//點擊屬性的復選框	改變了值,也相應改變了顯示 后面也把值存到了數據庫changeCheckbox(index) {this.skuArr[index].checked = !this.skuArr[index].checked},//點擊屬性值的子元素  改變了值,也相應改變了顯示 后面也把值存到了數據庫clickChlidBtn(index, cIdx) {this.skuArr[index].children[cIdx].checked = !this.skuArr[index].children[cIdx].checked},//點擊選擇屬性clickSelect() {this.$refs.attrWrapPop.open(); //使用open方法彈出來if (this.skuArr.length) return;this.getSkuData();},//點擊提交表單onSubmit() {this.$refs.goodsForm.validate().then(res => {this.toDataBase();}).catch(err => {console.log(err);})},//上傳到云數據庫async toDataBase() {//這里缺少一個更新的按鈕,需要在list中去實現this.goodsFormData.thumb = this.goodsFormData.thumb.map(item => {return {url: item.url,name: item.name,extname: item.extname}})let res = await goodsCloudObj.add(this.goodsFormData)uni.showToast({title: "新增商品成功"})setTimeout(() => {uni.navigateBack()}, 1500)}}}
</script><style lang="scss" scoped>.goodsView {padding: 30rpx;.skuList {.item {padding: 30rpx;background: $page-bg-color;margin: 15rpx 0;@include flex-box-set(start);}}}.attrWrapper {padding: 30rpx;background: #fff;border-radius: 20rpx 20rpx 0 0;.head {@include flex-box();font-size: 34rpx;margin-bottom: 30rpx;.title {font-weight: bold;}.addAttr {color: $brand-theme-color-aux;}}.body {.item {border-top: 1px solid $border-color-light;&:last-child {border-bottom: 1px solid $border-color-light;}.top {padding: 30rpx 0;@include flex-box-set(start);.font {padding-left: 10rpx;font-weight: bold;}}.btnGroup {padding: 10rpx 0 30rpx;@include flex-box-set(start);flex-wrap: wrap;.btn {padding: 0rpx 25rpx;height: 60rpx;border: 1rpx solid $border-color-light;margin-right: 20rpx;border-radius: 10rpx;color: $text-font-color-2;margin-bottom: 20rpx;@include flex-box-set();&.active {border-color: $brand-theme-color;color: $brand-theme-color;background: rgba(236, 87, 79, 0.1);}}}}}.foot {padding: 50rpx 200rpx;}}
</style>

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

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

相關文章

Vue框架

Vue 概況&#xff1a; Vue是一款用于構建用戶界面的漸進式的JavaScript框架。&#xff08;官方;https:://cn.vuejs.org/) 框架:就是一套完整的項目解決方案&#xff0c;用于快速構建項目。 優點:大大提升前端項目的開發效率。 缺點:需要理解記憶框架的使用規則。&#xff…

解讀RTOS 第七篇 · 驅動框架與中間件集成

1. 引言 在面向生產環境的 RTOS 系統中,硬件驅動框架與中間件層是連接底層外設與上層應用的橋梁。一個模塊化、可擴展的驅動框架能夠簡化外設管理,提升代碼可維護性;而豐富的中間件生態則為網絡通信、文件系統、圖形界面、安全加密等功能提供開箱即用的支持。本章將從驅動模…

JavaScript防抖與節流全解析

文章目錄 前言:為什么需要防抖和節流基本概念與區別防抖(Debounce)節流(Throttle)關鍵區別防抖(Debounce)詳解1. 基本防抖函數實現2. 防抖函數的使用3. 防抖函數的工作流程4. 防抖函數進階 - 立即執行選項節流(Throttle)詳解1. 基本節流函數實現時間戳法(第一次會立即執行)定…

JavaScript入門【3】面向對象

1.對象: 1.概述: 在js中除了5中基本類型之外,剩下得都是對象Object類型(引用類型),他們的頂級父類是Object;2.形式: 在js中,對象類型的格式為key-value形式,key表示屬性,value表示屬性的值3.創建對象的方式: 方式1:通過new關鍵字創建(不常用) let person new Object();// 添…

oracle主備切換參考

主備正常切換操作參考&#xff1a;RAC兩節點->單機 &#xff08;rac和單機的操作區別&#xff1a;就是關閉其它節點&#xff0c;剩一個節點操作即可&#xff09; 1.主庫準備 檢查狀態 SQL> select inst_id,database_role,OPEN_MODE from gv$database; INST_ID DATA…

端到端自動駕駛系統實戰指南:從Comma.ai架構到PyTorch部署

引言&#xff1a;端到端自動駕駛的技術革命 在自動駕駛技術演進歷程中&#xff0c;端到端&#xff08;End-to-End&#xff09;架構正引領新一輪技術革命。不同于傳統分模塊處理感知、規劃、控制的方案&#xff0c;端到端系統通過深度神經網絡直接建立傳感器原始數據到車輛控制…

使用 Kotlin 和 Jetpack Compose 開發 Wear OS 應用的完整指南

環境配置與項目搭建 1. Gradle 依賴配置 // build.gradle (Module) android {buildFeatures {compose true}composeOptions {kotlinCompilerExtensionVersion "1.5.3"} }dependencies {def wear_compose_version "1.2.0"implementation "androidx.…

應用層協議簡介:以 HTTP 和 MQTT 為例

文章目錄 應用層協議簡介&#xff1a;什么是應用層協議&#xff1f;為什么需要應用層協議&#xff1f;什么是應用層協議&#xff1f;為什么需要應用層協議&#xff1f; HTTP 協議詳解HTTP 協議特點HTTP 工作的基本原理HTTP 請求與響應示例為什么 Web 應用基于 HTTP 請求&#x…

Kafka快速安裝與使用

引言 這篇文章是一篇Ubuntu(Linux)環境下的Kafka安裝與使用教程&#xff0c;通過本文&#xff0c;你可以非常快速搭建一個kafka的小單元進行日常開發與調測。 安裝步驟 下載與解壓安裝 首先我們需要下載一下Kafka&#xff0c;這里筆者采用wget指令&#xff1a; wget https:…

PD 分離推理的加速大招,百度智能云網絡基礎設施和通信組件的優化實踐

為了適應 PD 分離式推理部署架構&#xff0c;百度智能云從物理網絡層面的「4us 端到端低時延」HPN 集群建設&#xff0c;到網絡流量層面的設備配置和管理&#xff0c;再到通信組件和算子層面的優化&#xff0c;顯著提升了上層推理服務的整體性能。 百度智能云在大規模 PD 分離…

flutter Stream 有哪兩種訂閱模式。

Flutter 中的 Stream 有兩種訂閱模式&#xff1a; ?單訂閱模式 (Single Subscription)?? 只能有一個訂閱者&#xff08;listen 只能調用一次&#xff09;&#xff0c;后續調用會拋出異常。數據僅在訂閱后開始傳遞&#xff0c;適用于點對點通信場景&#xff08;如文件讀取流…

Python爬蟲實戰:研究JavaScript 環境補全逆向解密

1. 引言 1.1 研究背景與意義 隨著互聯網的快速發展,大量有價值的數據被發布在各種網站上。然而,為了保護數據安全和商業利益,許多網站采用了 JavaScript 加密技術對敏感數據進行保護。這些加密技術使得傳統的爬蟲技術難以直接獲取和解析數據,給數據采集工作帶來了巨大挑戰…

[system-design] ByteByteGo_Note Summary

目錄 通信協議 REST API 與 GraphQL gRPC 如何工作&#xff1f; 什么是Webhook&#xff1f; 如何提高應用程序接口的性能&#xff1f; HTTP 1.0 -> HTTP 1.1 -> HTTP 2.0 -> HTTP 3.0 (QUIC) SOAP vs REST vs GraphQL vs RPC 代碼優先與應用程序接口優先 HTT…

Linux中的進程

進程控制 fork 函數 fork 函數從已存在的進程中創建新的進程&#xff0c;已存在進程為父進程&#xff0c;新創建進程為子進程 fork 的常規用法 一個父進程希望復制自己&#xff0c;使父子進程同時執行不同的代碼段。例如&#xff0c;父進程等待客戶端請求&#xff0c;生成子…

EDR與XDR如何選擇適合您的網絡安全解決方案

1. 什么是EDR&#xff1f; 端點檢測與響應&#xff08;EDR&#xff09; 專注于保護端點設備&#xff08;如電腦、服務器、移動設備&#xff09;。通過在端點安裝代理軟件&#xff0c;EDR實時監控設備活動&#xff0c;檢測威脅并快速響應。 EDR核心功能 實時監控&#xff1a;…

AGI大模型(21):混合檢索之混合搜索

為了執行混合搜索,我們結合了 BM25 和密集檢索的結果。每種方法的分數均經過標準化和加權以獲得最佳總體結果 1 代碼 先編寫 BM25搜索的代碼,再編寫密集檢索的代碼,最后進行混合。 from rank_bm25 import BM25Okapi from nltk.tokenize import word_tokenize import jieb…

2025最新的軟件測試面試大全(含答案+文檔)

一、軟件測試基礎面試題 1、闡述軟件生命周期都有哪些階段? 常見的軟件生命周期模型有哪些? 軟件生命周期是指一個計算機軟件從功能確定設計&#xff0c;到開發成功投入使用&#xff0c;并在使用中不斷地修改、增補和完善&#xff0c;直到停止該軟件的使用的全過程(從醞釀到…

C++.神經網絡與深度學習(二次修改)

神經網絡與深度學習 1. 神經網絡基礎1.1 神經元模型與激活函數1.2 神經網絡結構與前向傳播2.1 損失函數與優化算法均方誤差損失函數交叉熵損失函數梯度下降優化算法2.2 反向傳播與梯度計算神經元的反向傳播3.1 神經元類設計與實現神經元類代碼實現代碼思路3.2 神經網絡類構建神…

FPGA圖像處理(六)------ 圖像腐蝕and圖像膨脹

默認迭代次數為1&#xff0c;只進行一次腐蝕、膨脹 一、圖像腐蝕 1.相關定義 2.圖像腐蝕效果圖 3.fpga實現 彩色圖像灰度化&#xff0c;灰度圖像二值化&#xff0c;圖像緩存生成濾波模塊&#xff08;3*3&#xff09;&#xff0c;圖像腐蝕算法 timescale 1ns / 1ps // // Des…

中國版Cursor:CodeBuddy騰訊云代碼助手使用體驗

我正在參加CodeBuddy「首席試玩官」內容創作大賽&#xff0c;本文所使用的 CodeBuddy 免費下載鏈接&#xff1a;騰訊云代碼助手 CodeBuddy - AI 時代的智能編程伙伴” 1.CodeBuddy簡介 騰訊云代碼助手CodeBuddy&#xff0c;這個是一款編程插件&#xff0c;我們可以在各個編程…