vue實現(xiàn)條件疊加搜索的解決方法
案例場景:
現(xiàn)在有個文章管理模塊,在該模塊中有欄目選擇、文章搜索、分頁功能。這些功能改變其中一個都會對查詢的文章有所改變。案例圖如下:
實現(xiàn)方案有兩種:
其一、我們開始可能會想到對每個功能綁定一個處理事件,但是這樣做我們對數(shù)據(jù)的維護工作將大大加大,而且用這樣方案做數(shù)據(jù)的疊加篩選不是很好。
方案二、我們將所有提交的數(shù)據(jù)放到一起維護然后再進行深度監(jiān)聽,當某一個值、或多個值的改變時,在去進行數(shù)據(jù)的查詢,此時問題也變得更易于理解與維護,具體實現(xiàn)如下:
分頁代碼如下:
<template> <el-pagination background :page-size="params.pageSize" @current-change="handlePaginationChange" layout="prev, pager, next" :total="total"> </el-pagination> </template>
下拉選擇框、搜索框代碼如下:
<template> //下拉選擇框 <el-select v-model="params.categoryId" placeholder="請選擇欄目" size='mini' v-loading="loadingCategory"> <el-option :key='c.id' v-for='c in categories' :label="c.name" :value="c.id"></el-option> </el-select> //搜索框 <el-input placeholder="請輸入關鍵字" prefix-icon="el-icon-search" v-model="params.keywords" clearable> </el-input> </template>
數(shù)據(jù)維護、與方法(事件處理)
export default{ data(){ return{ ... //其它的數(shù)據(jù)省略 params:{ //存儲分頁、搜索數(shù)據(jù) page:0, pageSize:3, categoryId:undefined, keywords:undefined } } }, watch:{ params:{ handler(val){ this.findArticle(); //查找文章 }, deep:true //深度監(jiān)聽 }, methods:{ //處理分頁 handlePaginationChange(page){ this.params.page=page-1; }, //查詢文章 findArticle(){ axios.get('',{params:this.params}) .then(()=>{}) .catch(()=>{}) } } }
小結:通過上面的雙向數(shù)據(jù)綁定、我們將所有數(shù)據(jù)放到 params中集中管理(進行數(shù)據(jù)的監(jiān)聽)、當數(shù)據(jù)發(fā)生改變時我們?nèi)フ埱髷?shù)據(jù),來局部更新表格中的數(shù)據(jù)。
存在問題與解決:
1.這種實現(xiàn)方法的實現(xiàn)是基于所有數(shù)據(jù)的和查詢、如果我們的需求是,當每次選擇欄目時,都要顯示第一頁欄目的文章;
解決方案:
一、此時我們可以給選擇的欄目加change事件、然后將page重置為第一頁(本項目是從第0頁開始),具體代碼如下:
1.1 將分頁中動態(tài)綁定page 即: :current-page="(params.page+1)"
<template> <el-pagination background :page-size="params.pageSize" :total="total" layout="prev, pager, next" :current-page="(params.page+1)" //將頁數(shù)進行動態(tài)綁定這樣利于我們操作頁數(shù)的改變 @current-change="handlePaginationChange" > </el-pagination> </template>
1.2 給select添加change事件
<template> //下拉選擇框 <el-select v-model="params.categoryId" placeholder="請選擇欄目" size='mini' @change="selectChange" > <el-option :key='c.id' v-for='c in categories' :label="c.name" :value="c.id"> </el-option> </el-select> </template> export default{ //重置page為0 selectChange(){ this.params.page=0; }, }
***:此時我們存在的問題是如果我們先點擊某一頁后然后再點擊欄目,那么會基于本頁去查詢選擇欄目的信息。
二、關于搜索時我的理想是對當前頁信息進行篩選、如果有人想要做出對所有數(shù)據(jù)的篩選、那么此時我們應該將keywords單獨拿出來進行,搜索這樣解決起來比加條件簡單許多。
只是我目前對多個信息篩選做出的一個解決方案、如果有更加友好的處理方法、希望能留言。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Vue-router不允許導航到當前位置(/path)錯誤原因以及修復方式
本文主要介紹了Vue-router不允許導航到當前位置(/path)錯誤原因以及修復方式,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09vue生命周期beforeDestroy和destroyed調用方式
這篇文章主要介紹了vue生命周期beforeDestroy和destroyed調用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06