TakeOutShop/userserve/SearchList/SearchList.vue
2025-04-15 20:33:17 +08:00

172 lines
5.4 KiB
Vue
Raw 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="main">
<view class="head" :style="{'padding-top':headerHeight+4+'px'}">
<view class="head_top">
<view class="head_back" @click="handleBack()" :style="{'width': statusHeight+'px','height':statusHeight+'px'}">
<image class="head_back_img" src="https://zhkj1.oss-cn-shanghai.aliyuncs.com/newPD/zhBack.png" mode="widthFix"></image>
</view>
<view class="head_search" :style="{'width':searchWidth+'px','height':statusHeight+5+'px'}">
<image class="head_search_img" src="../../static/search_img.png" mode="widthFix"></image>
<input class="head_search_input" type="text" v-model="searchtext" disabled="true" @click="handleBack()"/>
</view>
</view>
<view class="head_list">
<view class="head_item">价格</view>
<view class="head_item">销量</view>
<view class="head_item">折扣</view>
</view>
</view>
<view class="cont" :style="{'padding-top':statusHeight+headerHeight+50+'px'}">
<!-- 商品区域 -->
<view class="cont_item" v-for="(item,index) in searchList" :key="index" @click="JumpType(item.id,1)">
<image class="item_imgUrl" :src="item.image" lazy-load="true" mode="widthFix"></image>
<view class="item_r">
<view class="item_title"><text>{{item.storeName}}</text></view>
<view class="item_desc"><text>{{item.storeInfo}}</text></view>
<view class="item_bottom">
<view class="item_price">{{item.price}}<text class="item_otPrice">{{item.otPrice}}</text></view>
<image class="item_addCart" src="../../static/addGroup.png" @click.stop="addCart(item,1)"></image>
</view>
</view>
</view>
<view class="empty" v-if="img_err && decs">
<view class="empty_cont">
<image class="empty_cont_img" :src="img_err" lazy-load="true" mode="widthFix"></image>
<view class="empty_cont_title">{{decs}}</view>
</view>
</view>
</view>
<recomGoods :apiType="5" @add-message="addCart"></recomGoods>
<multi
ref="shopData"
@add-success="handleAddSuccess"
@add-error="handleAddError"
></multi>
</view>
</template>
<script setup>
import { computed,ref,onMounted,onUnmounted,getCurrentInstance,nextTick } from 'vue';
import { useCounterStore } from '@/store/counter'; // 引入 Pinia Store
import { storeToRefs } from 'pinia';//实现解构付值
import { frontproducts } from '@/server/api.js'
import multi from '@/components/multi/multi.vue'
import { onLoad,onShow,onPullDownRefresh,onPageScroll,onReachBottom,onReady } from "@dcloudio/uni-app"
const counterStore = useCounterStore(); // 使用 Store
const { proxy } = getCurrentInstance();
//使用piniastoreToRefs方法包裹(保持响应式更新,不使用视图无法更新)
const {statusHeight,headerHeight,statusBartop,ButtonWidth,ButtonHeight } = storeToRefs(counterStore);
// 定义响应式数据,存储页面宽度
const pageWidth = ref(0);
const searchtext = ref('');
const searchList= ref([]);
const decs = ref('');
const pages = ref(0);
const limits = ref(10);
const type = ref("");
const img_err = ref("");
const shopData = ref({});
//加购物车
const addCart=(i,type)=>{
shopData.value.addCart(i,type);
}
// 加入购物车成功回调
const handleAddSuccess = (data) => {}
// 加入购物车失败回调
const handleAddError = (error) => {}
// 获取页面宽度
const updatePageWidth = () => {
const systemInfo = uni.getSystemInfoSync();
pageWidth.value = systemInfo.windowWidth;
};
const searchWidth = computed(() => {
return pageWidth.value - statusHeight.value - ButtonWidth.value - 35;
});
// 判断是否有上一页
const getPages = () => {
const pages = getCurrentPages();
return pages.length > 1;
};
const handleBack = () => {
if (getPages()) {
// 如果有上一页,返回上一页
uni.navigateBack();
} else {
// 如果没有上一页,返回首页
uni.switchTab({
url: '/pages/index/index',
});
}
};
const api_frontproducts=()=>{
pages.value = pages.value + 1;
img_err.value = "";
decs.value = "—— 加载中... ——";
const params = {
page:pages.value,
limit:limits.value
}
if(searchtext.value){
params.keyword = searchtext.value
}
return frontproducts(params).then(({data}) => {
decs.value = '—— 上拉加载更多 ——';
searchList.value = searchList.value.concat(data.list);
if(!searchList.value.length){
img_err.value = "../../static/Empty/search.png"
decs.value = "抱歉,没有搜到相关商品"
}else if(data.list.length < 10){
decs.value = '—— 嗷呜,已经到底啦 ——';
}
}).catch(({message}) => {
img_err.value = "../../static/Empty/err.png"
decs.value = `—— ${message||'网络异常'} ——`;
})
}
//跳转统一处理
const JumpType=(item,type)=>{
if(type == 1){
uni.navigateTo({
url:`/shopProDetail/detail/detail?id=${item}`//商品详情
})
}else{
const { jumpUrl,jumpIds,jumpType } = item;
if(jumpType == 0 || jumpType == 2 || jumpType == 4) return false;
let url = "";
if(jumpType == 1){
uni.navigateTo({
url:`/shopProDetail/detail/detail?id=${jumpIds}`//商品详情
})
}else if(jumpType == 3){
uni.switchTab({
url:`/pages/classify/classify`//商品列表
})
}
}
}
onLoad((options) => {
const { text } = options;
if(searchtext){
searchtext.value = text;
}
updatePageWidth();
api_frontproducts();
});
onShow(() => {});
onReady(()=>{})
onPullDownRefresh(()=>{
searchList.value = [];
decs.value = '';
pages.value = 0;
api_frontproducts();
uni.stopPullDownRefresh();
})
onReachBottom(()=>{
api_frontproducts();
})
</script>
<style lang="scss">
@import './style.scss';
</style>