【开发小记】vue2+elementUI实现搜索结果无限滚动(触底加载)展示

一、效果展示

在这里插入图片描述

在这里插入图片描述

### 二、展示部分框架搭建

首先分为两大部分,搜索部分,以及结果展示部分。搜索部分直接复用了elementUI的一些小组件,核心代码如下:

在这里插入图片描述
重点在于结果展示部分,下面详细拆解
template部分

        <div class="search_res" infinite-scroll-distance=10  v-infinite-scroll="load" infinite-scroll-disabled="scroll" infinite-scroll-immediate-check=false>
            <div class="content">
                <div class="main">
                    <el-row :gutter="20">
                        <el-col class="loveItem " :span="4" v-for="item in tableData" :key="item.user_id">
                            <el-card :body-style="{ padding: '0px' }">
                                <img :src="item.user_photo.split(',')[0]" class="image">
                                <div style="padding: 14px;">
                                <span>{{item.name}}</span>
                                <div class="bottom clearfix">
                                    <p class="introduction">{{item.about_me}}</p>
                                    <el-button type="text" class="button" @click="goto(item.user_id)">了解更多</el-button>
                                </div>
                                </div>
                            </el-card>
                        </el-col>
                    </el-row>
                </div>
                <span v-if="flag">我也是有底线的~</span>
            </div>
        </div>

其中.main包含的就是我们展示的人员相关的卡片,这个地方为了控制样式我多加了一层.content的div。然后这里有一个关键点,就是在最外层的那个div上要添加infinite相关的几个属性,其中是滚动触底后触发的函数。

css部分
首先是设置一个固定高度,让超出视觉范围的内容自动裁剪。接着添加第二个样式去除由于加载内容产生的滚动条。
在这里插入图片描述

三、逻辑部分

最相关的就是以下三个函数

        handleSearch(){
            // 根据搜索条件请求数据
            if(this.both_year_value1>this.both_year_value2){
                alert('出生日期范围不可颠倒!')
            }else{
                this.getUserList()
            }
            
        },
        getUserList() {
            if(!this.flag){
                let getUserData = {
                    both_year_start:this.both_year_value1,
                    both_year_end:this.both_year_value2,
                    height:this.height_value,
                    weight:this.weight_value,
                    sex:this.sex_value,
                    citys:this.city_value,
                    colleges:this.college_value,
                    page:this.page,
                    "limit":this.limit
                }
                this.scroll = true
                axios.post(path.SearchGetUsers,getUserData).then(
                    res=>{
                        this.page ++;
                        let receive = JSON.parse(JSON.stringify(res.data))
                        console.log(receive.data)
                        let newData = receive.data
                        if(newData.length<this.limit){
                            this.flag = true
                        }else{
                            this.tableData = [...this.tableData,...newData]
                            this.scroll = false
                        }
                    },err=>{
                    this.$message.error(err)
                    }
                );
            }
        },
        // 无限滚动组件的触发的函数
        load(){
            this.getUserList()
        }

点击搜索按钮,调用handleSearch函数,然后去调用getUserList函数获取符合条件的相关信息。
其次就是滚动触发load函数,也会再次调用getUserList函数,实现滚动加载的效果
这里其实采用了分页加载的思想,每次请求除了带上请求条件,还带上了page和limit,从而获取到相应的数据。同时我们定义了一个flag用于控制是否还需要继续请求(初始化为false,让底部的span不出现,且继续发送请求获取新数据)。如果后台返回的数据小于limit证明以及没有新的数据会返回了,所以将flag改为true,用于控制展示模块底部的span元素展现。

后台模拟部分
由于处于接口调试阶段,用node搭建的简要的返回机制。
这里模拟只返回5页数据,小于5页的情况下,就直接返回指定数量的数据。超出五页的返回空,用来测试数据加载完毕的情况。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值