沒用ui框架寫簡單的實現了下功能
思路:上拉加載肯定要滾動到底部,所以就先監聽滾動條滾動到底部 然後執行分頁+1請求數據push到渲染列表中即可;
同時判斷最後一頁時不請求,展示無數據狀態
主要代碼:
1:監聽滾動底部
<script>
export default {
name: "index_SearchPage",
data() {
return {
};
},
components: {
headAssembly
},
created() {
var that=this
window.onscroll = function() {
//變量scrollTop是滾動條滾動時,距離頂部的距離
var scrollTop =
document.documentElement.scrollTop || document.body.scrollTop; //變量windowHeight是可視區的高度
var windowHeight =
document.documentElement.clientHeight || document.body.clientHeight; //變量scrollHeight是滾動條的總高度
var scrollHeight =
document.documentElement.scrollHeight || document.body.scrollHeight; //滾動條到底部的條件
if (scrollTop + windowHeight == scrollHeight) {
//已滾動底部
that.information_Load();
}
};
},
mounted() {
this.inputTyping();
},
2.滾動底部後頁面+1 請求數據 push到渲染列表 page爲最大值時 展示無數據狀態
inputTyping() {
this.information_page=1
var that = this;
var baseUrl = process.env.API_ROOT;
//信息廣場
var formData0 = new FormData();
formData0.append("page", 1);
formData0.append("q", that.inputVal);
formData0.append("source", 3);
axios
.post(
baseUrl + "/apiyd/Information/",
formData0
) // 問號後面是要傳送的參數
.then(res => {
// 請求成功後的函數
if (res.data.code == 1000) {
that.information_list = res.data.data.data;//渲染列表數據
that.information_last_page = res.data.data.last_page;//獲得總頁數
} else {
$.alert(res.data.message);
}
});
}
information_Load() {
//信息上拉加載
let pageNum = this.information_page + 1;//頁面+1
let last_page = this.information_last_page;//總頁數
if (pageNum < last_page + 1) {
this.information_page = pageNum;
this.information_list_NoData = false;
$.showLoading("數據加載中");
var that = this;
var baseUrl = process.env.API_ROOT;
//信息廣場
var formData0 = new FormData();
formData0.append("page", that.information_page);
formData0.append("q", that.inputVal);
formData0.append("source", 3);
axios
.post(
baseUrl + "/apiyd/Information/",
formData0
) // 問號後面是要傳送的參數
.then(res => {
// 請求成功後的函數
if (res.data.code == 1000) {
$.hideLoading();
that.information_list.push(...res.data.data.data);
} else {
$.hideLoading();
$.alert(res.data.message);
}
});
} else {//當大於總頁數展示無數據狀態
this.information_list_NoData = true;
}
},
完整代碼:
<template>
<div>
<div class="longinPage">
<headAssembly textTitle="搜索" ifReturn="1"/>
<div class="page__bd">
<div class="weui-search-bar" id="searchBar">
<form class="weui-search-bar__form">
<div class="weui-search-bar__box">
<i class="weui-icon-search"></i>
<input
@input="inputTyping"
type="search"
v-model="inputVal"
class="weui-search-bar__input"
id="searchInput"
placeholder="搜索"
required
>
<a href="javascript:" class="weui-icon-clear" id="searchClear"></a>
</div>
<label class="weui-search-bar__label" id="searchText">
<i class="weui-icon-search"></i>
<span>搜索</span>
</label>
</form>
<a href="javascript:" class="weui-search-bar__cancel-btn" id="searchCancel">取消</a>
</div>
</div>
<div class="page__bd">
<div class="weui-tab">
<div class="weui-navbar">
<a
class="weui-navbar__item"
v-for="(item,index) in tabs"
:key="index"
:class="{'weui-bar__item--on':activeIndex == index}"
@click="tabClick(index)"
>{{item}}</a>
</div>
</div>
</div>
<div class="page__bd_bottom">
<div class="main" v-if="ifTaba0">
<div
class="main_list"
v-for="(item,index) in information_list"
:key="index"
@click="toDetails(item.uuid)"
>
<img class="main_list_img" :src="imgurl+item.user_pics">
<div class="main_list_content">
<div>
<p class="content_nama">{{item.user_nickname}}</p>
<p class="content_mark" v-if="item.user_auth==2">個人</p>
<p class="content_mark" v-if="item.user_auth==3">企業</p>
<p class="content_mark" v-if="item.user_auth==1"></p>
</div>
<div>
<p class="content_title">{{item.mation_title}}</p>
<div class="content_detailed">
<div class="content_hot" v-if="item.mation_recomm==1">薦</div>
<div class="content_num">{{item.browse_number}}</div>
<div class="content_time">{{item.create_time}}</div>
</div>
</div>
</div>
</div>
<div class="weui-loadmore weui-loadmore_line" v-if="information_list_NoData">
<div class="weui-loadmore__tips weui-loadmore__tips_in-line">暫無數據</div>
</div>
</div>
<div class="xmain" v-if="ifTaba1">
<div
class="xmain_list"
v-for="(item,index) in demand_list"
:key="index"
@click="toDetails1(item.uuid)"
>
<img class="xmain_list_img" :src="imgurl+item.company_pics">
<div class="xcontent">
<p class="xcontent_title">{{item.company_title}}</p>
<div class="xcontent_Second">
<div>{{item.cate1_name1}}</div>
<div>{{item.project_number1}}頭</div>
<div>¥{{item.project_price1}}-{{item.project_price2}}</div>
</div>
<p class="xcontent_time">截止時間:{{item.project_time3}}</p>
</div>
</div>
<div class="weui-loadmore weui-loadmore_line" v-if="demand_list_NoData">
<div class="weui-loadmore__tips weui-loadmore__tips_in-line">暫無數據</div>
</div>
</div>
<div class="ymain" v-if="ifTaba2">
<div
class="ymain_list"
v-for="(item,index) in Corn_list"
:key="index"
@click="toCornDetails(item.uuid)"
>
<img class="ymain_list_img" :src="imgurl+item.maize_pics">
<div class="ymain_list_content">
<p class="ycontent_title">{{item.maize_title}}</p>
<div class="ycontent_mark">{{item.maize_scope}}</div>
<p class="ycontent_Price">
價格:¥
<span>{{item.maize_price}}</span>元/斤
</p>
<p class="ycontent_address">地址:{{item.address}}</p>
</div>
<a href="tel:+18610687360">
<img class="phone_img" src="../../static/img/phone.png">
</a>
</div>
<div class="weui-loadmore weui-loadmore_line" v-if="Corn_list_NoData">
<div class="weui-loadmore__tips weui-loadmore__tips_in-line">暫無數據</div>
</div>
</div>
<div class="ymain" v-if="ifTaba3">
<div
class="ymain_list"
v-for="(item,index) in Veterinary_list"
:key="index"
@click="toVeterinaryDetails(item.uuid)"
>
<img class="ymain_list_img" :src="imgurl+item.marian_pics">
<div class="ymain_list_content">
<p class="ycontent_title">{{item.narian_title}}</p>
<div class="ycontent_mark">{{item.mation_scope}}</div>
<p> </p>
<p class="ycontent_address">地址:{{item.address}}</p>
</div>
<a href="tel:+18610687360">
<img class="phone_img" src="../../static/img/phone.png">
</a>
</div>
<div class="weui-loadmore weui-loadmore_line" v-if="Veterinary_list_NoData">
<div class="weui-loadmore__tips weui-loadmore__tips_in-line">暫無數據</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import axios from "axios";
import headAssembly from "../components/headAssembly/headAssembly.vue";
export default {
name: "index_SearchPage",
data() {
return {
imgurl: this.imgurl, //請求圖片域名
inputShowed: false,
inputVal: "",
tabs: ["信息", "需求", "玉米", "獸醫"],
activeIndex: 0,
fontSize: 30,
information_list: [],
information_list_NoData: false,
information_last_page: "",
information_page: 1,
demand_list: [],
demand_list_NoData: false,
demand_last_page: "",
demand_page: 1,
Corn_list: [],
Corn_list_NoData: false,
Corn_last_page: "",
Corn_page: 1,
Veterinary_list: [],
Veterinary_list_NoData: false,
Veterinary_last_page: "",
Veterinary_page: 1,
ifTaba0: true,
ifTaba1: false,
ifTaba2: false,
ifTaba3: false
};
},
components: {
headAssembly
},
created() {
var that=this
window.onscroll = function() {
//變量scrollTop是滾動條滾動時,距離頂部的距離
var scrollTop =
document.documentElement.scrollTop || document.body.scrollTop; //變量windowHeight是可視區的高度
var windowHeight =
document.documentElement.clientHeight || document.body.clientHeight; //變量scrollHeight是滾動條的總高度
var scrollHeight =
document.documentElement.scrollHeight || document.body.scrollHeight; //滾動條到底部的條件
if (scrollTop + windowHeight == scrollHeight) {
if (that.activeIndex == 0) {
that.information_Load();
} else if (that.activeIndex == 1) {
that.demand_Load();
} else if (that.activeIndex == 2) {
that.Corn_Load();
} else if (that.activeIndex == 3) {
that.Veterinary_Load();
}
}
};
},
mounted() {
this.inputTyping();
},
methods: {
information_Load() {
//信息上拉加載
let pageNum = this.information_page + 1;
let last_page = this.information_last_page;
if (pageNum < last_page + 1) {
this.information_page = pageNum;
this.information_list_NoData = false;
$.showLoading("數據加載中");
var that = this;
var baseUrl = process.env.API_ROOT;
//信息廣場
var formData0 = new FormData();
formData0.append("page", that.information_page);
formData0.append("q", that.inputVal);
formData0.append("source", 3);
axios
.post(
baseUrl + "/apiyd/Information/getApiinformationListInfo/",
formData0
) // 問號後面是要傳送的參數
.then(res => {
// 請求成功後的函數
if (res.data.code == 1000) {
$.hideLoading();
that.information_list.push(...res.data.data.data);
} else {
$.hideLoading();
$.alert(res.data.message);
}
});
} else {
this.information_list_NoData = true;
}
},
//to獸醫詳情
toVeterinaryDetails(uuids) {
this.$router.push({ path: "/VeterinaryDetails", query: { uuid: uuids } });
},
//to玉米詳情
toCornDetails(uuids) {
this.$router.push({ path: "/CornDetails", query: { uuid: uuids } });
},
//to需求詳情
toDetails1(uuids) {
this.$router.push({ path: "/DemandDetails", query: { uuid: uuids } });
},
//to信息詳情
toDetails(uuids) {
this.$router.push({
path: "/InformationDetails",
query: { uuid: uuids }
});
},
//tab切換
tabClick(index) {
this.activeIndex = index;
if (this.activeIndex == 0) {
(this.ifTaba0 = true),
(this.ifTaba1 = false),
(this.ifTaba2 = false),
(this.ifTaba3 = false);
this.information_page=1
} else if (this.activeIndex == 1) {
(this.ifTaba0 = false),
(this.ifTaba1 = true),
(this.ifTaba2 = false),
(this.ifTaba3 = false);
} else if (this.activeIndex == 2) {
(this.ifTaba0 = false),
(this.ifTaba1 = false),
(this.ifTaba2 = true),
(this.ifTaba3 = false);
} else if (this.activeIndex == 3) {
(this.ifTaba0 = false),
(this.ifTaba1 = false),
(this.ifTaba2 = false),
(this.ifTaba3 = true);
}
},
inputTyping() {
this.information_page=1
this.demand_page=1
this.Corn_page=1
this.Veterinary_page=1
var that = this;
var baseUrl = process.env.API_ROOT;
if (that.activeIndex == 0) {
//信息廣場
var formData0 = new FormData();
formData0.append("page", 1);
formData0.append("q", that.inputVal);
formData0.append("source", 3);
axios
.post(
baseUrl + "/apiyd/Information/getApiinformationListInfo/",
formData0
) // 問號後面是要傳送的參數
.then(res => {
// 請求成功後的函數
if (res.data.code == 1000) {
that.information_list = res.data.data.data;
that.information_last_page = res.data.data.last_page;
} else {
$.alert(res.data.message);
}
});
} else if (that.activeIndex == 1) {
//需求
var formData1 = new FormData();
formData1.append("page", 1);
formData1.append("q", that.inputVal);
formData1.append("source", 3);
axios
.post(baseUrl + "/apiyd/project/getApiprojectListInfo/", formData1) // 問號後面是要傳送的參數
.then(res => {
// 請求成功後的函數
if (res.data.code == 1000) {
that.demand_list = res.data.data.data;
that.demand_last_page = res.data.data.last_page;
} else {
$.alert(res.data.message);
}
});
} else if (that.activeIndex == 2) {
//玉米
var formData2 = new FormData();
formData2.append("page", 1);
formData2.append("q", that.inputVal);
formData2.append("source", 3);
axios
.post(baseUrl + "/apiyd/maize/getApimaizeListInfo/", formData2) // 問號後面是要傳送的參數
.then(res => {
// 請求成功後的函數
if (res.data.code == 1000) {
that.Corn_list = res.data.data.data;
that.Corn_last_page = res.data.data.last_page;
} else {
$.alert(res.data.message);
}
});
} else if (that.activeIndex == 3) {
//獸醫
var formData3 = new FormData();
formData3.append("page", 1);
formData3.append("q", that.inputVal);
formData3.append("source", 3);
axios
.post(
baseUrl + "/apiyd/Veterinaria/getApiveterinarianListInfo/",
formData3
) // 問號後面是要傳送的參數
.then(res => {
// 請求成功後的函數
if (res.data.code == 1000) {
that.Veterinary_list = res.data.data.data;
that.Veterinary_last_page = res.data.data.last_page;
} else {
$.alert(res.data.message);
}
});
}
}
}
};
</script>
<style scoped>
.longinPage {
width: 100%;
}
.main {
width: 100%;
overflow: hidden;
background: #fff;
padding: 0 5%;
box-sizing: border-box;
}
.main_list {
width: 100%;
height: 0.8rem;
border-bottom: 0.01rem solid #f3f3f3;
position: relative;
}
.main_list_img {
width: 0.55rem;
height: 0.5rem;
border-radius: 0.05rem;
margin-top: 0.15rem;
}
.main_list_content {
position: absolute;
top: 0;
left: 0;
width: 100%;
padding-left: 0.65rem;
box-sizing: border-box;
padding-top: 0.15rem;
box-sizing: border-box;
}
.main_list_content > div {
float: left;
font-size: 0.15rem;
color: #333333;
}
.main_list_content > div:nth-child(1) {
text-align: center;
width: 0.7rem;
}
.main_list_content > div:nth-child(2) {
position: absolute;
top: 0.15rem;
right: 0;
width: 100%;
padding-left: 1.45rem;
box-sizing: border-box;
}
.content_mark {
font-size: 0.12rem;
color: #999999;
margin-top: 0.05rem;
}
.content_detailed {
margin-top: 0.05rem;
display: flex;
justify-content: space-between;
}
.content_hot {
width: 0.27rem;
height: 0.14rem;
line-height: 0.14rem;
font-size: 0.1rem;
color: #de584b;
background: #f6c3be;
border: 0.01rem solid #ef8e85;
border-radius: 0.075rem;
text-align: center;
}
.content_num {
font-size: 0.1rem;
color: #006a3c;
}
.content_time {
font-size: 0.1rem;
color: #999999;
}
.xmain {
width: 100%;
overflow: hidden;
padding: 0 3%;
box-sizing: border-box;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.xmain_list {
width: 49%;
height: 1.88rem;
background: #fff;
box-shadow: 0 0.02rem 0.04rem 0 rgba(229, 227, 227, 0.5);
margin-bottom: 0.1rem;
}
.xmain_list_img {
width: 100%;
height: 1.08rem;
}
.xcontent {
width: 90%;
margin: 0 auto;
}
.xcontent_title {
font-size: 0.12rem;
color: #333333;
margin-top: 0.05rem;
}
.xcontent_Second {
display: flex;
justify-content: space-between;
margin-top: 0.05rem;
margin-bottom: 0.05rem;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.xcontent_Second > div {
font-size: 0.12rem;
color: #333333;
}
.xcontent_Second > div:nth-child(3) {
font-size: 0.15rem;
color: red;
line-height: 0.17rem;
}
.xcontent_time {
font-size: 0.12rem;
color: #787777;
}
.ymain {
width: 100%;
overflow: hidden;
background: #fff;
padding: 0 5%;
box-sizing: border-box;
}
.ymain_list {
width: 100%;
height: 1rem;
border-bottom: 0.01rem solid #f3f3f3;
position: relative;
}
.ymain_list_img {
width: 0.9rem;
height: 0.66rem;
float: left;
margin-top: 0.17rem;
margin-right: 0.2rem;
border-radius: 0.05rem;
}
.phone_img {
width: 0.25rem;
height: 0.25rem;
position: absolute;
top: 0.41rem;
right: 0;
}
.ymain_list_content {
width: 60%;
float: left;
padding-top: 0.1rem;
box-sizing: border-box;
}
.ycontent_title {
font-size: 0.16rem;
color: #333333;
}
.ycontent_mark {
width: 0.5rem;
height: 0.14rem;
text-align: center;
line-height: 0.14rem;
border: 0.01rem solid #f87700;
border-radius: 0.075rem;
font-size: 0.08rem;
color: #f87700;
}
.ycontent_Price {
font-size: 0.13rem;
color: #333333;
}
.ycontent_address {
font-size: 0.13rem;
color: #818080;
}
.content_nama,
.content_title,
.ycontent_title,
.ycontent_address {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.weui-bar__item--on {
background: #fff;
color: #333;
border-bottom: 0.02rem solid #006a3c;
}
.page__bd_bottom {
margin-top: 0.6rem;
}
</style>
更多技巧請查看vue專欄 https://blog.csdn.net/qq_42221334/column/info/27230/1