Files
PC-202306242200\Administrator f529129c93 first commit
2026-03-31 10:53:43 +08:00

350 lines
7.9 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view class="u-wrap">
<view style="margin: 30rpx">
<up-swiper :list="['https://zhongshuai-test.oss-cn-beijing.aliyuncs.com/upload/20240919/c6f8c174-19b1-41a3-a0d9-082f0abb5f85.png']" height="320rpx" indicator></up-swiper>
</view>
<view class="u-search-box">
<u-input placeholder="请输入充电桩型号或关键字" border="surround" prefixIcon="search" shape="circle" clearable="true" v-model="keywords"></u-input>
</view>
<view style="display: flex; align-items: center; justify-content: space-between; margin: 0 30rpx 30rpx">
<view
style="font-weight: bold; position: relative"
:style="{
color: purposeType == item.id ? '#333' : '#bbb'
}"
v-for="(item, index) in tabbar"
:key="index"
@click="swichMenu(item.id)"
>
<view style="position: relative;z-index: 9;">{{ item.name }}</view>
<view v-if="purposeType == item.id" style="width: 72rpx; height: 16rpx; background: #b6d0aa; border-radius: 48rpx 48rpx 48rpx 48rpx; position: absolute; bottom: -5rpx; left: 0"></view>
</view>
</view>
<view class="shopList">
<!-- <image class="shopList_img" src="/static/jp.png" mode="widthFix"></image> -->
<view class="shopList_list">
<view class="shopList_list_view" v-for="i in filterGoods(goods)" :key="i" @click="navTo(`/pageInvest/shop/details?id=${i.id}`)">
<image class="shopList_list_view_img" :src="i.cover" mode="aspectFit"></image>
<view class="shopList_list_view_tit">{{ i.name }}</view>
<view class="shopList_list_view_mon">
<view class="shopList_list_view_mon_left">{{ i.currentPrice }} </view>
<!-- <up-tag @click="toShop(i)" text="下单" bgColor="#4874e5" borderColor="#4874e5"></up-tag> -->
<!-- <view class="shopList_list_view_mon_right">下单</view> -->
</view>
</view>
</view>
</view>
<!-- <view class="u-menu-wrap">
<scroll-view scroll-y scroll-with-animation class="u-tab-view menu-scroll-view" :scroll-top="scrollTop">
<view
v-for="(item, index) in tabbar"
:key="index"
class="u-tab-item"
:class="[current == index ? 'u-tab-item-active' : '']"
:data-current="index"
@tap.stop="swichMenu(index)"
>
<text class="u-line-1">{{ item.name }}</text>
</view>
</scroll-view>
<block v-for="(item, index) in tabbar" :key="index">
<scroll-view scroll-y class="right-box" v-if="current == index">
<view class="page-view">
<view class="class-item">
<view class="item-title">
<text>{{ item.name }}</text>
</view>
<view class="item-container">
<view class="thumb-box" v-for="(item1, index1) in filterGoods(item.foods)" @click="navTo(`/pageInvest/shop/details?id=${item1.id}`)" :key="item1.id">
<image class="item-menu-image" :src="item1.cover" mode="aspectFill"></image>
<view class="item-menu-name">{{ item1.name }}</view>
</view>
</view>
</view>
</view>
</scroll-view>
</block>
</view> -->
</view>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import { onLoad } from '@dcloudio/uni-app';
import { goodsList, categoryList } from '@/api/api.js';
import { useNav } from '@/hooks/useNav.js';
const { navTo } = useNav();
const keywords = ref('');
let tabbar = ref([]);
let goods = ref([]);
let scrollTop = ref(0);
let current = ref(0);
let menuHeight = ref(0);
let menuItemHeight = ref(0);
let purposeType = ref(null);
// [
// {
// name: '女装',
// foods: [
// {
// name: 'A字裙',
// key: 'A字裙',
// icon: 'https://cdn.uviewui.com/uview/common/classify/1/1.jpg',
// cat: 10
// }
// ]
// }
// ]
onMounted(() => {
categoryList().then((res) => {
tabbar.value = res.map((item, index) => {
return {
...item,
foods: []
};
});
purposeType.value = res[0].id;
goodsList({ categoryId: res[0].id }).then((res) => {
// tabbar.value[0].foods = res;
goods.value = res;
});
});
});
async function swichMenu(index) {
// if (index == current.value) return;
// current.value = index;
purposeType.value = index;
goodsList({ categoryId: index }).then((res) => {
goods.value = res;
});
return;
// 如果为0意味着尚未初始化
if (menuHeight.value == 0 || menuItemHeight.value == 0) {
await this.getElRect('menu-scroll-view', 'menuHeight');
await this.getElRect('u-tab-item', 'menuItemHeight');
}
// 将菜单菜单活动item垂直居中
this.scrollTop = index * menuItemHeight.value + menuItemHeight.value / 2 - menuHeight.value / 2;
}
function getElRect(elClass, dataVal) {
new Promise((resolve, reject) => {
const query = uni.createSelectorQuery().in(this);
query
.select('.' + elClass)
.fields({ size: true }, (res) => {
// 如果节点尚未生成res值为null循环调用执行
if (!res) {
setTimeout(() => {
this.getElRect(elClass);
}, 10);
return;
}
this[dataVal] = res.height;
})
.exec();
});
}
const filterGoods = (value) => {
if (!value?.length) {
return [];
}
return value.filter((item) => item.name.includes(keywords.value));
};
</script>
<style lang="scss" scoped>
.u-wrap {
height: calc(100vh);
/* #ifdef H5 */
height: calc(100vh - var(--window-top));
/* #endif */
display: flex;
flex-direction: column;
}
.u-search-box {
padding: 18rpx 30rpx;
}
.u-menu-wrap {
flex: 1;
display: flex;
overflow: hidden;
}
.u-search-inner {
background-color: rgb(234, 234, 234);
border-radius: 100rpx;
display: flex;
align-items: center;
padding: 10rpx 16rpx;
}
.u-search-text {
font-size: 26rpx;
color: $u-tips-color;
margin-left: 10rpx;
}
.u-tab-view {
width: 200rpx;
height: 100%;
}
.u-tab-item {
height: 80rpx;
background: #f6f6f6;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: center;
font-size: 26rpx;
color: #444;
font-weight: 400;
line-height: 1;
}
.u-tab-item-active {
position: relative;
color: #000;
font-size: 30rpx;
font-weight: 600;
background: #fff;
}
.u-tab-item-active::before {
content: '';
position: absolute;
border-left: 4px solid rgba(111, 162, 86, 1);
height: 45rpx;
left: 0;
top: calc(50% - 22.5rpx);
}
.u-tab-view {
height: 100%;
}
.right-box {
background-color: rgb(250, 250, 250);
}
.page-view {
padding: 16rpx;
}
.class-item {
margin-bottom: 30rpx;
background-color: #fff;
padding: 16rpx;
border-radius: 8rpx;
}
.item-title {
font-size: 26rpx;
color: $u-main-color;
font-weight: bold;
}
.item-menu-name {
font-weight: normal;
font-size: 24rpx;
color: $u-main-color;
}
.item-container {
display: flex;
flex-wrap: wrap;
}
.thumb-box {
width: 33.333333%;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
margin-top: 20rpx;
}
.item-menu-image {
width: 144rpx;
height: 144rpx;
border-radius: 4rpx 4rpx 4rpx 4rpx;
}
.shopList {
@include flex($direction: column, $space: content);
&_img {
width: 308rpx;
height: 44rpx;
margin-bottom: 50rpx;
}
&_list {
width: 690rpx;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
&_view {
border-radius: 8rpx 8rpx 8rpx 8rpx;
width: 334rpx;
background-color: #fff;
margin-bottom: 30rpx;
padding-bottom: 20rpx;
&_img {
width: 334rpx;
height: 334rpx;
border-radius: 8rpx 8rpx 0rpx 0rpx;
}
&_tit {
padding: 10rpx 20rpx 0;
display: -webkit-box;
-webkit-line-clamp: 2; /* 限制显示的行数 */
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
font-weight: bold;
font-size: 30rpx;
color: #232323;
}
&_mon {
padding: 0rpx 20rpx;
@include flex($space: space-between);
&_left {
font-weight: bold;
font-size: 30rpx;
color: rgba(239, 38, 38, 1);
}
&_right {
width: 80rpx;
height: 40rpx;
@include flex($space: center);
font-size: 26rpx;
background-color: #4874e5;
color: #fff;
font-weight: bold;
border-radius: 20rpx;
}
}
}
}
}
</style>