264 lines
6.4 KiB
Vue
264 lines
6.4 KiB
Vue
<template>
|
||
<s-layout title="社区种草">
|
||
<view class="search_box">
|
||
<view class="ss-flex ss-col-center">
|
||
<uni-search-bar
|
||
class="ss-flex-1"
|
||
radius="33"
|
||
placeholder="请输入关键字"
|
||
cancelButton="none"
|
||
:focus="true"
|
||
@confirm="onSearch($event.value)"
|
||
/>
|
||
</view>
|
||
</view>
|
||
<view class="nav-bd longTab" style="background-color: white;">
|
||
<scroll-view scroll-x="true" style="white-space: nowrap; display: flex" >
|
||
<view class="longItem"
|
||
:style="'color:' + (index == ProductNavindex ? '#e93323' : 'black')+';--color:#e93323'"
|
||
:data-index="index" :class="index===ProductNavindex?'click':''" v-for="(item,index) in navList"
|
||
:key="index" :id="'id'+index" @click="ProductNavTab(item, index)">{{ item.val }}
|
||
</view>
|
||
</scroll-view>
|
||
</view>
|
||
<view class="discover-box" :style="'height:'+swiperHeight+'px'">
|
||
<!-- 发现 -->
|
||
<scroll-view
|
||
:style="'height:'+swiperHeight+'px'"
|
||
class="scroll-view"
|
||
scroll-y
|
||
:refresher-enabled="true"
|
||
@refresherrefresh="onRefresh"
|
||
:refresher-triggered="triggered"
|
||
@scrolltolower="handleScrollToLower"
|
||
>
|
||
<!-- 列表内容 -->
|
||
<!-- <view v-for="(item, index) in list" :key="index" class="scroll-item">{{ item }}</view> -->
|
||
|
||
<grid-view type="masonry" main-axis-gap="{{10}}" cross-axis-gap="{{10}}">
|
||
<view class="masonry_item" v-for="(item, index) in arr" :key="index" :style="getStyle(item)">
|
||
{{item}}
|
||
</view>
|
||
</grid-view>
|
||
|
||
|
||
|
||
|
||
<!-- 加载更多提示 -->
|
||
<view v-if="loadingMore" class="loading-more">加载中...</view>
|
||
<view v-else-if="noMoreData" class="no-more-data">没有更多数据了</view>
|
||
</scroll-view>
|
||
</view>
|
||
</s-layout>
|
||
</template>
|
||
|
||
<script setup>
|
||
import { reactive,ref,onMounted,computed,nextTick } from 'vue';
|
||
import sheep from '@/sheep';
|
||
|
||
//数据定义
|
||
const isLogin = computed(() => sheep.$store('user').isLogin);
|
||
const template = computed(() => sheep.$store('app').template.user);
|
||
// const checkColor = computed(() => '#e93323');
|
||
const tabLeft = ref(0);
|
||
let ProductNavindex = ref(0);
|
||
let isWidth = ref(0);
|
||
const navList = reactive([{val:'热门'},
|
||
{val:'bbb'},
|
||
{val:'ccc'},
|
||
{val:'热门'},
|
||
{val:'bbb'},
|
||
{val:'ccc'},
|
||
{val:'热门'},
|
||
{val:'bbb'},
|
||
{val:'ccc'},
|
||
{val:'热门'},
|
||
{val:'bbb'},
|
||
{val:'ccc'},])
|
||
const categoryList = reactive([])
|
||
const discoverList = reactive([])
|
||
|
||
|
||
|
||
function ProductNavTab(item, index) {
|
||
ProductNavindex.value = index;
|
||
// this.itemStyle = this.navList[index].activeList.styleType;
|
||
// this.goodsSort = item.activeList.goodsSort;
|
||
|
||
nextTick(() => {
|
||
const id = 'id' + index.value;
|
||
tabLeft.value = (index.value - 2) * isWidth.value; // 设置下划线位置
|
||
// 如果需要对id对应的元素进行直接操作,可以在这里进行
|
||
// document.getElementById(id).style.left = `${tabLeft.value}px`;
|
||
});
|
||
// this.limit = item.activeList.num;
|
||
// this.changeTab(item, index);
|
||
}
|
||
const getStyle = (item) => {
|
||
return {
|
||
height: `${item * 100}rpx`,
|
||
border: '1rpx solid red'
|
||
};
|
||
};
|
||
// 搜索
|
||
function onSearch(keyword) {
|
||
if (!keyword) {
|
||
return;
|
||
}
|
||
console.log('搜索了',keyword)
|
||
// saveSearchHistory(keyword);
|
||
// 前往商品列表(带搜索条件)
|
||
// sheep.$router.go('/pages/goods/list', { keyword });
|
||
}
|
||
|
||
|
||
|
||
// 标签内容方法
|
||
const list = ref([]);
|
||
const total = ref(20); // 总数据量,用于模拟加载更多
|
||
const pageSize = ref(10); // 每次加载的数据量
|
||
const pageNum = ref(1); // 当前页码
|
||
const loadingMore = ref(false); // 正在加载更多数据
|
||
const noMoreData = ref(false); // 是否已无更多数据
|
||
const triggered = ref(false); // 下拉刷新触发状态
|
||
const swiperHeight = ref(0)
|
||
|
||
const arr = ref([3, 2, 5, 7, 3, 7, 5, 4, 5, 7]);
|
||
|
||
|
||
// 初始化数据
|
||
const init = async () => {
|
||
await loadMore(pageNum.value);
|
||
};
|
||
|
||
const handleScrollToLower = () => {
|
||
console.log('触发了上拉加载');
|
||
let newArr = [5, 3, 4, 7, 8, 2, 1, 5, 7, 6]
|
||
// this.setData({ arr: [...this.data.arr, ...newArr] })
|
||
arr.value = [...arr.value,...newArr]
|
||
// this.setData({ arr: this.data.arr })
|
||
// loadItems(pageNum.value);
|
||
};
|
||
// 上拉加载更多
|
||
const loadMore = async () => {
|
||
if (list.value.length >= total.value) {
|
||
noMoreData.value = true;
|
||
return;
|
||
}
|
||
loadingMore.value = true;
|
||
pageNum.value += 1;
|
||
// 模拟网络请求
|
||
setTimeout(() => {
|
||
const newData = Array.from({ length: pageSize.value }, (_, i) => `Item ${(pageNum.value - 1) * pageSize.value + i + 1}`);
|
||
list.value.push(...newData);
|
||
loadingMore.value = false;
|
||
}, 1000);
|
||
};
|
||
|
||
// 下拉刷新
|
||
const onRefresh = () => {
|
||
triggered.value = true;
|
||
setTimeout(() => {
|
||
pageNum.value = 1; // 重置页码
|
||
init(); // 重新加载数据
|
||
uni.stopPullDownRefresh();
|
||
triggered.value = false; // 关闭刷新动画
|
||
},1000)
|
||
};
|
||
|
||
|
||
onMounted(() => {
|
||
uni.getSystemInfo({
|
||
success(e) {
|
||
isWidth.value = (e.windowWidth) / 5;
|
||
swiperHeight.value = e.windowHeight - 167;
|
||
}
|
||
});
|
||
init();
|
||
});
|
||
|
||
|
||
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.search_box{
|
||
width: 100%;
|
||
background-color: white;
|
||
.ss-flex{
|
||
width: 90%;
|
||
margin: 0 auto;
|
||
}
|
||
}
|
||
.discover-box{
|
||
width: 100%;
|
||
background-color: lightpink;
|
||
.scroll-view {
|
||
// height: 500px;
|
||
.scroll-item {
|
||
padding: 20rpx;
|
||
height: 200px;
|
||
border-bottom: 1px solid #eee;
|
||
}
|
||
.masonry_item{
|
||
|
||
}
|
||
}
|
||
|
||
}
|
||
.loading-more, .no-more-data {
|
||
text-align: center;
|
||
padding: 40rpx;
|
||
font-size: 40rpx;
|
||
color: #999;
|
||
}
|
||
.nav-bd {
|
||
height: 70rpx;
|
||
line-height: 70rpx;
|
||
padding-left: 20rpx;
|
||
background: #fff;
|
||
|
||
.item {
|
||
display: inline-block;
|
||
font-size: 28rpx;
|
||
color: #333;
|
||
font-weight: 400;
|
||
padding-right: 48rpx;
|
||
|
||
&.on {
|
||
border-radius: 0;
|
||
}
|
||
}
|
||
}
|
||
.longTab {
|
||
.longItem {
|
||
height: 70rpx;
|
||
display: inline-block;
|
||
line-height: 70rpx;
|
||
text-align: center;
|
||
font-size: 28rpx;
|
||
color: #333333;
|
||
white-space: nowrap;
|
||
margin-right: 46rpx;
|
||
|
||
&.click {
|
||
font-weight: bold;
|
||
font-size: 30rpx;
|
||
position: relative;
|
||
|
||
&::after {
|
||
content: '';
|
||
width: 40rpx;
|
||
height: 4rpx;
|
||
background: var(--color);
|
||
position: absolute;
|
||
bottom: 0;
|
||
left: 50%;
|
||
transform: translateX(-50%);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
</style>
|