vue输入查询内容但不查询,切页刷新表格会出现触发查询的不合理情况

一、问题说明

  在vue切页时,有时会用到直接调用相关方法来刷新表格的情况,刷新表格时一般会带有几个查询条件的参数,传到后台实现条件查询,但是如果输入查询条件但是不查询(就是输入查询内容,不按查询按钮),按切页时,如果不做处理就会出现切页时也会查询的不合理现象,如下为问题代码片段

查询框处

<el-input placeholder="按时间查询" v-model="queryMap.lendTime" class="input-with-select" clearable>
                    <el-select v-model="queryMap.lendTypeId" slot="prepend" placeholder="按类型查询" style="width: 120px"
                               clearable id="typeId" @change="typeIdChoice">
                        <el-option v-for="type in lendTypeList" :label="type.itemName" :value="type.itemId"
                                   :key="type.itemId"></el-option>
                    </el-select>
                    <el-button slot="append" icon="el-icon-search" @click="search"></el-button>
                </el-input>

data中的查询对象

queryMap: {//查询相关
                    id: '',
                    lendTime: '',//借款时间
                    lendTypeId: '',//借款类型id
                    page: 1,//第几页
                    limit: 5,//每页几条
                },

method中

查询表格信息的方法

getBorrowList() {//获取所有当前用户借款信息
                this.$http.post("getBorrowList", this.queryMap).then(res => {
                    this.borrowList = res.data.borrowList.list
                    this.total = res.data.borrowList.total
                    let once = sessionStorage.getItem("onceB")
                    if (once == 0) {//目的是在登录后,只显示一次审核未通过信息
                        for (let i = 0; i < this.borrowList.length; i++) {
                            if (this.borrowList[i].lendStateId == 7) {
                                const h = this.$createElement;
                                this.$notify({//弹出借款未通过信息
                                    title: '借款审核未通过',
                                    message: h('i', {style: 'color: black'}, '您有借款未通过审核,您可以修改后重新发送申请,请及时处理'),
                                    type: "warning",
                                    duration: 4500,//持续时长为4.5秒
                                })
                                sessionStorage.setItem("onceB", 1)
                                break
                            }
                        }
                    }
                }).catch(() => {
                    this.$message.error("借款信息请求失败")
                })
            },

查询按钮触发的查询方法

search() { //查找功能
                if (this.queryMap.lendTypeId == '' && this.queryMap.lendTime == '') {
                    this.lengthSpan1 = 0//控制"显示所有"功能的显隐
                    this.lengthSpan2 = 8
                }
                if (this.queryMap.lendTypeId != '' || this.queryMap.lendTime != '') {
                    this.lengthSpan1 = 2
                    this.lengthSpan2 = 6
                }
                this.queryMap.page = 1
                this.getBorrowList()//调用查询信息方法刷新表格
            },

elementUI自带的分页方法

//页码改变时,参数val是改变后的页码
            handleCurrentChange(val) {
                this.queryMap.page = val;
                this.getBorrowList()//此处直接调用查询信息方法刷新表格
            },

二、问题分析

  其实造成上述不合理现象最主要的原因就是v-model双向绑定这个vue的指令,在输入框输入查询时间(我这里做的比较简化用的是时间的模糊查询,如果便于理解,大家可以想做按名字查询),输入的同时由于v-model这个指令,一输入,queryMap中的借款时间lendTime就有了值,所以在不按查询按钮,点击切页,直接调用getBorrowList()方法,就会带着已有的lendTime去后台,后台实现的条件查询,从而造成没查询却查询了的不合理情况。

三、问题解决

  我的想法是:只在点击查询按钮时,给queryMap中的属性赋值,实现如下

在data中添加对象queryMap1


                queryMap: {//查询相关
                    id: '',
                    lendTime: '',//借款时间
                    lendTypeId: '',//借款类型id
                    page: 1,//第几页
                    limit: 5,//每页几条
                },
                queryMap1: {
                    lendTime: '',
                    lendTypeId: '',
                },

查询输入框v-model绑定queryMap1中的数据

 <el-input placeholder="按时间查询" v-model="queryMap1.lendTime" class="input-with-select" clearable>
                    <el-select v-model="queryMap1.lendTypeId" slot="prepend" placeholder="按类型查询" style="width: 120px"
                               clearable id="typeId" @change="typeIdChoice">
                        <el-option v-for="type in lendTypeList" :label="type.itemName" :value="type.itemId"
                                   :key="type.itemId"></el-option>
                    </el-select>
                    <el-button slot="append" icon="el-icon-search" @click="search"></el-button>
                </el-input>

在点击查询按钮调用查询方法时,先把queryMap1中的数据赋给queryMap

search() { //查找功能
                this.queryMap.lendTypeId = this.queryMap1.lendTypeId//把queryMap1之后的查询条件赋给原queryMap
                this.queryMap.lendTime = this.queryMap1.lendTime
                if (this.queryMap.lendTypeId == '' && this.queryMap.lendTime == '') {
                    this.lengthSpan1 = 0//控制"显示所有"功能的显隐
                    this.lengthSpan2 = 8
                }
                if (this.queryMap.lendTypeId != '' || this.queryMap.lendTime != '') {
                    this.lengthSpan1 = 2
                    this.lengthSpan2 = 6
                }
                this.queryMap.page = 1
                this.getBorrowList()
            },

其实我的想法很简单,就是只有在触发查询时才给查询对象queryMap赋值,什么时候查什么时候赋,不查询时,queryMap中的数据要不为空,要不为上一次查询的条件

四、其他解决方法

  我开始时,想用$refs来获取输入框中的数据,从而实现改正,大体如下:

<el-col :span="5">
                <input placeholder="请输入员工姓名"  clearable ref="names" id="fff"></input>
            </el-col>
 //点击查询按钮
            search() {
                this.queryMap.pname = this.$refs.names.value//获取输入框中的数据
                if (this.queryMap.pname =='') {//控制"显示所有"功能的显隐
                    this.lengthSpan1 = 0
                    this.lengthSpan2 = 10
                }
                if (this.queryMap.pname !='') {

                    this.lengthSpan1 = 2
                    this.lengthSpan2 = 8
                }
                this.queryMap.page = 1;//将页码重置回第一页,主要作用是查找时如果当前页面是第二页,那么查找将会从第二页开始,造成查找缺失,所以要
                this.getStaffList()           //先将页码归一,让其从第一页开始查询
            },

但是这种方法有两个问题:

1、注意第一个代码段,用的标签是普通的<input>而不是<el-input>,原因是在添加ref="names"后<el-input>会出现输入名字直接清除输入的情况

2、在使用普通<input>标签后,也就放弃了elementUI自带的输入框样式,所以需要重新调整样式

因此这种方法也可以解决本文的错误,但是使用起来不是特别方便

以上就是我对该问题的叙述,请大家批评指正。谢谢大家。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值