图书馆小程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

242 lines
5.5 KiB

<template>
<view style="background-color: #fff; padding-bottom:5px;">
<view class="my-search-container">
<view class="my-search-wrapper">
<picker
mode="selector"
:range="rangeText"
:value="selectIndex"
@change="onPickerChange"
class="picker-select"
>
<view class="picker-display">
{{ selectValueText || '请选择分类' }}
<uni-icons type="arrowdown" size="14" color="#999" style="margin-left: 4px;" />
</view>
</picker>
<uni-search-bar
class="my-search-bar"
@confirm="onSearch"
@focus="onFocus"
@blur="onBlur"
@clear="onClear"
@cancel="onCancel"
@input="onInput"
cancelButton="none"
bgColor="#f7f7f7"
v-model="value"
placeholder="请输入搜索内容"
>
<uni-icons slot="clearIcon" type="clear" color="#999999" />
</uni-search-bar>
</view>
<view class="search-btn-container" @click="onSearch">
<button class="search-btn" type="primary" >搜索</button>
</view>
<!-- 有数据才显示 -->
<view class="filter-container">
<view class="total-reslut" v-if="listData.length > 0">
搜索到 {{ total }} 条记录,共 {{ totalPage }} 页,当前第 {{ page }} 页
</view>
<view>筛选</view>
</view>
</view>
<!-- 有数据才显示列表 -->
<view style="padding-top: 154px;" v-if="listData.length > 0">
<scroll-view
scroll-y
style="height: calc(100vh - 80px);"
@scrolltolower="onScrollLower"
>
<book-list-item
class="hot-list-item"
v-for="(item, index) in listData"
:key="index"
:data="item"
:ranking="index + 1"
@click="onItemClick(item)"
></book-list-item>
<view class="load-more" v-if="total > listData.length">
上拉加载更多...
</view>
<view class="load-more" v-if="total <= listData.length && listData.length > 0">
没有更多数据了
</view>
</scroll-view>
</view>
</view>
</template>
<script>
import BookListItem from "@/components/book-list-item/book-list-item.vue";
export default {
components: {
BookListItem
},
data() {
return {
selectValue: '',
selectValueText: '',
selectIndex: 0,
value:'',
range: [
{ value: 0, text: "任意词" },
{ value: 1, text: "题名" },
{ value: 2, text: "著者" },
{ value: 3, text: "ISBN" },
{ value: 4, text: "主题" },
{ value: 5, text: "出版社" },
{ value: 6, text: "分类号" }
],
rangeText: [],
listData:[],
size: 10,
page: 1,
total: 0,
totalPage: 0
};
},
onLoad() {
this.rangeText = this.range.map(item => item.text);
this.selectValue = this.range[0].value;
this.selectValueText = this.range[0].text;
},
methods: {
onPickerChange(e) {
const index = e.detail.value;
this.selectIndex = index;
this.selectValue = this.range[index].value;
this.selectValueText = this.range[index].text;
},
async getBookList() {
uni.showLoading({ title: '搜索中...' });
await new Promise(resolve => setTimeout(resolve, 500));
const mockList = [];
for (let i = 0; i < this.size; i++) {
const idx = (this.page - 1) * this.size + i + 1;
mockList.push({
id: idx,
title: `穆尔西医生带你走出孤独`,
desc: `关键词:${this.value}|检索类型:${this.selectValueText}`,
nickname: `穆尔西`,
imgCover:'http://wxtest.twgbz.cn/spider/bookcover/978-7-5546-1700-7',
publish: "中国青年出版社",
});
}
this.total = 37;
this.totalPage = 4;
if (this.page === 1) {
this.listData = mockList;
} else {
this.listData = [...this.listData, ...mockList];
}
uni.hideLoading();
},
onScrollLower() {
if (this.listData.length >= this.total) return;
this.page++;
this.getBookList();
},
onSearch() {
this.page = 1;
this.getBookList();
uni.showToast({ title: '搜索:' + this.value, icon: 'none' });
},
onItemClick(item) {
// uni.showToast({ title: '点击了:' + item.title, icon: 'none' });
uni.navigateTo({
url: "/subpkg/pages/book-detail/book-detail?isbn=" + item.isbn
})
},
onFocus() {},
onBlur() {},
onClear() {
this.value = '';
this.listData = []; // 清空列表
this.total = 0;
},
onCancel() {},
onInput(val) { this.value = val; }
}
}
</script>
<style lang="scss" scoped>
.my-search-container {
display: flex;
flex-direction: column;
padding: 15px 20px;
background: #fff;
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 99;
height: 124px;
.my-search-wrapper{
display: flex;
align-items: center;
width: 100%;
padding: 5px 0;
background-color: #f7f7f7;
border-radius: 36px;
overflow: hidden;
}
.picker-select {
width: 60px;
border-right: 1px solid #c9c9c9;
}
.picker-display {
display: flex;
align-items: center;
justify-content: center;
padding: 6px 0;
font-size: 14px;
color: #333;
}
.my-search-bar {
flex: 1;
::v-deep .uni-searchbar {
padding: 0 !important;
background: transparent !important;
}
}
.search-btn-container{
width: 100%;
margin-top: 10px;
.search-btn{
background-color: #01a4fe;
font-size: 15px;
border-radius: 20px;
}
}
}
.filter-container {
display: flex;
justify-content: flex-end;
padding-top: 10px;
font-size: 13px;
color: #666;
}
.load-more {
text-align: center;
padding: 10px;
font-size: 13px;
color: #999;
}
.total-reslut{
flex: 1;
line-height: 20px;
font-size: 13px;
color: #01a4fe;
font-weight: 400;
}
</style>