chore:按钮 = 全局所有有商品的二级分类(去重,一直显示),选中状态在切换一级分类时保持
商品 = 切换一级分类时,用选中按钮的名称在当前一级分类下找同名 category,重新加载该 category 的商品
This commit is contained in:
@@ -340,6 +340,10 @@ export default {
|
|||||||
lastSecondCategoryName: {
|
lastSecondCategoryName: {
|
||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: ''
|
||||||
|
},
|
||||||
|
currentOneCategory: {
|
||||||
|
type: Object,
|
||||||
|
default: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mixins: [DiyMinx],
|
mixins: [DiyMinx],
|
||||||
@@ -379,7 +383,8 @@ export default {
|
|||||||
}
|
}
|
||||||
this.selectedSecondCategory = targetCategory.category_id;
|
this.selectedSecondCategory = targetCategory.category_id;
|
||||||
this.secondCategoryGoodsList = [];
|
this.secondCategoryGoodsList = [];
|
||||||
this.getSecondCategoryGoods(targetCategory.category_id);
|
// 用当前一级分类下同名二级分类的 id 查商品(而非全局按钮的 id)
|
||||||
|
this.refreshGoodsByCurrentCategory();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
@@ -440,9 +445,18 @@ export default {
|
|||||||
}
|
}
|
||||||
this.selectedSecondCategory = targetCategory.category_id;
|
this.selectedSecondCategory = targetCategory.category_id;
|
||||||
this.secondCategoryGoodsList = [];
|
this.secondCategoryGoodsList = [];
|
||||||
this.getSecondCategoryGoods(targetCategory.category_id);
|
this.refreshGoodsByCurrentCategory();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
// 切换一级分类时, 根据当前一级分类下同名二级分类重新加载商品
|
||||||
|
currentOneCategory: {
|
||||||
|
handler() {
|
||||||
|
if (this.value.template == 99 && parseInt(this.value.level) == 2) {
|
||||||
|
this.refreshGoodsByCurrentCategory();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
deep: true
|
||||||
|
},
|
||||||
'globalStoreInfo.store_id': {
|
'globalStoreInfo.store_id': {
|
||||||
handler(nval, oval) {
|
handler(nval, oval) {
|
||||||
if (nval != oval) {
|
if (nval != oval) {
|
||||||
@@ -821,6 +835,35 @@ export default {
|
|||||||
if (!link) return;
|
if (!link) return;
|
||||||
this.$util.diyRedirectTo(JSON.parse(link));
|
this.$util.diyRedirectTo(JSON.parse(link));
|
||||||
},
|
},
|
||||||
|
/**
|
||||||
|
* 根据当前一级分类(currentOneCategory)下与选中按钮同名的二级分类, 加载对应商品
|
||||||
|
* 按钮是全局去重的(选中状态用全局 category_id), 但商品只显示当前一级分类下的
|
||||||
|
* 当前一级分类下若没有同名二级分类, 则商品清空(按钮保持选中)
|
||||||
|
*/
|
||||||
|
refreshGoodsByCurrentCategory() {
|
||||||
|
if (this.selectedSecondCategory == null) {
|
||||||
|
this.secondCategoryGoodsList = [];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 取当前选中按钮的名称
|
||||||
|
const cur = (this.category.child_list || []).find(c => c.category_id === this.selectedSecondCategory);
|
||||||
|
if (!cur) {
|
||||||
|
this.secondCategoryGoodsList = [];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const one = this.currentOneCategory;
|
||||||
|
if (!one || !one.child_list || one.child_list.length === 0) {
|
||||||
|
this.secondCategoryGoodsList = [];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const match = one.child_list.find(c => c.category_name === cur.category_name);
|
||||||
|
if (match) {
|
||||||
|
this.getSecondCategoryGoods(match.category_id);
|
||||||
|
} else {
|
||||||
|
// 当前一级分类下没有该二级分类, 商品清空(按钮仍保持选中)
|
||||||
|
this.secondCategoryGoodsList = [];
|
||||||
|
}
|
||||||
|
},
|
||||||
selectSecondCategory(category) {
|
selectSecondCategory(category) {
|
||||||
if (this.selectedSecondCategory === category.category_id) {
|
if (this.selectedSecondCategory === category.category_id) {
|
||||||
this.selectedSecondCategory = null;
|
this.selectedSecondCategory = null;
|
||||||
@@ -828,8 +871,9 @@ export default {
|
|||||||
} else {
|
} else {
|
||||||
this.selectedSecondCategory = category.category_id;
|
this.selectedSecondCategory = category.category_id;
|
||||||
this.secondCategoryGoodsList = [];
|
this.secondCategoryGoodsList = [];
|
||||||
this.getSecondCategoryGoods(category.category_id);
|
|
||||||
this.$emit('saveSecondCategory', category.category_name);
|
this.$emit('saveSecondCategory', category.category_name);
|
||||||
|
// 用当前一级分类下同名 category_id 查商品
|
||||||
|
this.refreshGoodsByCurrentCategory();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
getSecondCategoryGoods(categoryId) {
|
getSecondCategoryGoods(categoryId) {
|
||||||
|
|||||||
@@ -92,7 +92,19 @@
|
|||||||
</scroll-view>
|
</scroll-view>
|
||||||
|
|
||||||
<view class="right-flex-wrap">
|
<view class="right-flex-wrap">
|
||||||
<scroll-view scroll-y="true" class="content-wrap" v-if="value.template == 1 || value.template == 99 || loadType == 'all'"
|
<!-- 模板99 + 二级分类: 全局二级分类按钮(去重, 一直显示) + 商品列表 -->
|
||||||
|
<scroll-view scroll-y="true" class="content-wrap" v-if="value.template == 99 && parseInt(value.level) == 2 && template99Category"
|
||||||
|
:refresher-enabled="true" refresher-default-style="none"
|
||||||
|
:refresher-triggered="triggered" @refresherrefresh="onRefresh" @refresherrestore="onRestore">
|
||||||
|
<diy-category-item :category="template99Category" :value="value" ref="categoryItem" :index="0" :select="0"
|
||||||
|
:oneCategorySelect="oneCategorySelect" :isList="isList"
|
||||||
|
:currentOneCategory="categoryTree && categoryTree[select] ? categoryTree[select] : null"
|
||||||
|
:lastSecondCategoryName="lastSecondCategoryName"
|
||||||
|
@tologin="toLogin" @selectsku="selectSku($event, 0)" @addCart="addCartPoint"
|
||||||
|
@saveSecondCategory="saveSecondCategoryName"></diy-category-item>
|
||||||
|
</scroll-view>
|
||||||
|
|
||||||
|
<scroll-view scroll-y="true" class="content-wrap" v-else-if="value.template == 1 || value.template == 99 || loadType == 'all'"
|
||||||
ref="contentWrap" :scroll-into-view="categoryId" :scroll-with-animation="true"
|
ref="contentWrap" :scroll-into-view="categoryId" :scroll-with-animation="true"
|
||||||
@scroll="listenScroll" @touchstart="touchStart" :refresher-enabled="true"
|
@scroll="listenScroll" @touchstart="touchStart" :refresher-enabled="true"
|
||||||
refresher-default-style="none" :refresher-triggered="triggered" @refresherrefresh="onRefresh"
|
refresher-default-style="none" :refresher-triggered="triggered" @refresherrefresh="onRefresh"
|
||||||
@@ -196,7 +208,8 @@ export default {
|
|||||||
templateFourData: [],
|
templateFourData: [],
|
||||||
isList: false,
|
isList: false,
|
||||||
lang: uni.getStorageSync("lang"),
|
lang: uni.getStorageSync("lang"),
|
||||||
lastSecondCategoryName: ''
|
lastSecondCategoryName: '',
|
||||||
|
template99Category: null
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
@@ -363,10 +376,77 @@ export default {
|
|||||||
return item;
|
return item;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
// 模板99 + 二级分类: 全局查询所有有商品的二级分类(去重), 按钮一直显示
|
||||||
|
if (this.value.template == 99 && parseInt(this.value.level) == 2) {
|
||||||
|
this.loadGlobalSecondCategoryBtns();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
/**
|
||||||
|
* 全局查询所有有商品的二级分类, 按名称去重, 汇总成虚拟分类供 template99 渲染按钮
|
||||||
|
* 只要任何商品属于该二级分类, 按钮就显示; 切换一级分类时按钮不变(一直显示)
|
||||||
|
* 新增的二级分类只要有商品也会自动包含
|
||||||
|
*/
|
||||||
|
loadGlobalSecondCategoryBtns() {
|
||||||
|
if (!this.categoryTree || !this.categoryTree.length) {
|
||||||
|
this.template99Category = { category_name: '', child_list: [] };
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 收集所有二级分类(保留原始顺序, 不去重, 查询所有同名后再去重)
|
||||||
|
const allSecond = [];
|
||||||
|
this.categoryTree.forEach(one => {
|
||||||
|
if (one.child_list && one.child_list.length) {
|
||||||
|
one.child_list.forEach(two => {
|
||||||
|
allSecond.push(Object.assign({ _origIndex: allSecond.length }, two));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!allSecond.length) {
|
||||||
|
this.template99Category = { category_name: '', child_list: [] };
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let pending = allSecond.length;
|
||||||
|
const results = [];
|
||||||
|
const finishOne = () => {
|
||||||
|
pending--;
|
||||||
|
if (pending <= 0) {
|
||||||
|
results.sort((a, b) => a._origIndex - b._origIndex);
|
||||||
|
// 按名称去重, 同名只保留第一个有商品的(只要任一同名有商品就显示)
|
||||||
|
const deduped = [];
|
||||||
|
const seenNames = {};
|
||||||
|
results.forEach(item => {
|
||||||
|
if (!seenNames[item.category_name]) {
|
||||||
|
seenNames[item.category_name] = true;
|
||||||
|
deduped.push(item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.template99Category = {
|
||||||
|
category_name: '',
|
||||||
|
child_list: deduped
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
allSecond.forEach(two => {
|
||||||
|
this.$api.sendRequest({
|
||||||
|
url: '/api/goodssku/pageByCategory',
|
||||||
|
data: {
|
||||||
|
category_id: two.category_id,
|
||||||
|
page: 1,
|
||||||
|
page_size: 1
|
||||||
|
},
|
||||||
|
success: res => {
|
||||||
|
if (res && res.code == 0 && res.data && res.data.list && res.data.list.length > 0) {
|
||||||
|
results.push(two);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
complete: () => {
|
||||||
|
finishOne();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
/**
|
/**
|
||||||
* 切换一级分类
|
* 切换一级分类
|
||||||
* @param {Object} index
|
* @param {Object} index
|
||||||
|
|||||||
Reference in New Issue
Block a user