純前端翻頁(yè)+跨頁(yè)級(jí)聯(lián)勾選的實(shí)現(xiàn)

需求描述

實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表和表字段的勾選,數(shù)據(jù)庫(kù)表包含了表字段互站,后端一次性返回所有表的數(shù)據(jù)囤热。前端需要自行對(duì)表做翻頁(yè)處理。當(dāng)用戶勾選完需要的表和字段后穆役,再把勾選后的數(shù)據(jù)發(fā)送給后端禁漓。

需求拆分

  1. 前端翻頁(yè)功能
  2. 跨頁(yè)級(jí)聯(lián)勾選功能

實(shí)現(xiàn)效果

file

具體實(shí)現(xiàn)

前端翻頁(yè)功能

需要實(shí)現(xiàn)前端翻頁(yè)的部分是數(shù)據(jù)庫(kù)表,進(jìn)入頁(yè)面后孵睬,默認(rèn)自動(dòng)向后端獲取一次 搜索后的表數(shù)據(jù)searchTableList播歼,獲取到之后,計(jì)算當(dāng)前頁(yè)顯示的表數(shù)據(jù)掰读,計(jì)算公式為 curTableList = searchTableList.slice((page - 1) * size, page * size)秘狞,pagesize 保存在 url 參數(shù)中蹈集。如果用戶點(diǎn)擊翻頁(yè)烁试,則重新計(jì)算當(dāng)前頁(yè)顯示的表數(shù)據(jù)。如果用戶搜索表拢肆,則重置頁(yè)數(shù)為 1 后减响,獲取 searchTableList,并重新計(jì)算當(dāng)前頁(yè)顯示的表數(shù)據(jù)郭怪。

流程圖

file

關(guān)鍵代碼

// 獲取當(dāng)前頁(yè)表數(shù)據(jù)
getCurTableList() {
    // 不發(fā)請(qǐng)求支示,根據(jù) searchTableList 獲取數(shù)據(jù)。模擬翻頁(yè)
    let page = Number(this.$route.query.page || 1);
    let size = Number(this.$route.query.size || 10);
    let total = this.searchTableList.length;
    let maxPage = Math.ceil(total / size);
    page = page > maxPage ? maxPage : page;
    this.tablePageData = { page, size, total };
    this.curTableList = this.searchTableList.slice((page - 1) * size, page * size);
},

跨頁(yè)級(jí)聯(lián)勾選功能

分析用戶可進(jìn)行的勾選操作的勾選框:


file
  1. 全部表勾選框鄙才,共有未選颂鸿、部分先和全選有三種狀態(tài),未選和部分選狀態(tài)點(diǎn)擊可勾選全部表攒庵,全選狀態(tài)點(diǎn)擊可取消勾選全部表嘴纺;
  2. 當(dāng)前頁(yè)表勾選框败晴,共有未選、部分選和全選有三種狀態(tài)栽渴,未選和部分選狀態(tài)點(diǎn)擊可勾選當(dāng)前頁(yè)全部表尖坤,全選狀態(tài)點(diǎn)擊可取消勾選當(dāng)前頁(yè)全部表;
  3. 單個(gè)表勾選框闲擦,共有未選糖驴、部分選和全選有三種狀態(tài),未選和部分選狀態(tài)點(diǎn)擊可勾選表中的全部字段佛致,全選狀態(tài)點(diǎn)擊可取消勾選表中的全部字段贮缕;
  4. 全部字段勾選框,共有未選俺榆、部分選和全選有三種狀態(tài)感昼,未選和部分選狀態(tài)點(diǎn)擊可勾選表中的全部字段,全選狀態(tài)點(diǎn)擊可取消勾選表中的全部字段罐脊;
  5. 單個(gè)字段勾選框定嗓,共有未選和已選有兩種狀態(tài),未選狀態(tài)點(diǎn)擊可勾選表中的該字段萍桌,已選狀態(tài)點(diǎn)擊可取消勾選表中的該字段宵溅;

全部表數(shù)據(jù) allTableList,該數(shù)據(jù)結(jié)構(gòu)如下:

// 全部表
allTableList: [
    // 每個(gè)表
    {
        "tableName": "table-name", // 表名
        // 表中的全部字段
        "fieldList": [
            // 每個(gè)字段
            {
                "fieldName": "field-name", // 字段名
            },
        ],
    },
]

根據(jù)上面的信息分析上炎,為了實(shí)現(xiàn)勾選狀態(tài)的聯(lián)動(dòng)恃逻,最好的辦法是把所有的已勾選項(xiàng)放在一個(gè)變量中保存,該變量保存了選中的表和字段藕施,然后通過(guò)計(jì)算方法確定每個(gè)勾選框的狀態(tài)寇损。該勾選狀態(tài)變量的結(jié)構(gòu)如下:

// 選中的表和字段
checkedTableAndField: {
    // 選中的表名
    "table-name": [
        "field-name", // 表中選中的字段
    ],
}

有了 checkedTableAndField 變量,所有的勾選框狀態(tài)就都可以通過(guò)它來(lái)計(jì)算得到了裳食。下面列出所有勾選框狀態(tài)的計(jì)算方法:

  1. 全部表勾選框矛市,全選狀態(tài)=全部表狀態(tài)都全選,部分選狀態(tài)=本身非全選狀態(tài)且有任一表是部分選或全選狀態(tài)诲祸,未選狀態(tài)=本身非全選且本身非部分選浊吏。轉(zhuǎn)換為代碼如下:
// 全部表是否全選
isTableAllChecked() {
        return this.allTableList.length && this.allTableList.every(tableObj => this.isPerTableAllChecked(tableObj));
},
// 全部表是否部分選
isTablePartChecked() {
        return !this.isTableAllChecked && this.allTableList.some(tableObj => this.isPerTablePartChecked(tableObj) || this.isPerTableAllChecked(tableObj));
},
  1. 當(dāng)前頁(yè)表勾選框,全選狀態(tài)=當(dāng)前頁(yè)表狀態(tài)都全選救氯,部分選狀態(tài)=本身非全選狀態(tài)且有任一當(dāng)前頁(yè)表是部分選或全選狀態(tài)找田,未選狀態(tài)=本身非全選且本身非部分選。轉(zhuǎn)換為代碼如下:
// 當(dāng)前頁(yè)的表是否全選
isCurTableAllChecked() {
    return this.curTableList.length && this.curTableList.every(tableObj => this.isPerTableAllChecked(tableObj));
},
// 當(dāng)前頁(yè)的表是否部分選
isCurTablePartChecked() {
    return !this.isCurTableAllChecked && this.curTableList.some(tableObj => this.isPerTablePartChecked(tableObj) || this.isPerTableAllChecked(tableObj));
},
  1. 單個(gè)表勾選框径密,全選狀態(tài)=表中的全部字段狀態(tài)都勾選午阵,部分選狀態(tài)=本身非全選狀態(tài)且表中有任一字段勾選躺孝,未選狀態(tài)=本身非全選且本身非部分選享扔。轉(zhuǎn)換為代碼如下:
// 單個(gè)表是否全選
isPerTableAllChecked(tableObj) {
    let checkedFieldArr = vm.checkedTableAndField[tableObj.tableName];
    return checkedFieldArr && checkedFieldArr.length === tableObj.fieldList.length;
},
// 單個(gè)表是否部分選
isPerTablePartChecked(tableObj) {
    let checkedFieldArr = vm.checkedTableAndField[tableObj.tableName];
    return !vm.isPerTableAllChecked(tableObj) && checkedFieldArr && checkedFieldArr.length;
},
  1. 全部字段勾選框底桂,全選狀態(tài)=全部字段狀態(tài)都勾選,部分選狀態(tài)=本身非全選狀態(tài)且有任一字段勾選惧眠,未選狀態(tài)=本身非全選且本身非部分選籽懦。轉(zhuǎn)換為代碼如下:
// this.allFieldList 是當(dāng)前選中的表的所有字段,這里省略該變量部分代碼
// 當(dāng)前已選中的字段的標(biāo)識(shí)集合
curCheckedFieldArr() {
    return this.checkedTableAndField[this.curTableName] || [];
},
// 全部字段是否全選
isFieldAllChecked() {
    return this.allFieldList.length && this.allFieldList.length === this.curCheckedFieldArr.length;
},
// 全部字段是否部分選
isFieldPartChecked() {
    return !this.isFieldAllChecked && this.curCheckedFieldArr.length;
}
  1. 單個(gè)字段勾選框氛魁,勾選狀態(tài)=本身是勾選暮顺,未選狀態(tài)=本身非勾選。轉(zhuǎn)換為代碼如下:
// 單個(gè)字段是否勾選
isFieldChecked(fieldName) {
    return curCheckedFieldArr.includes(fieldName)
}

以上逐步分析了各個(gè)勾選框的狀態(tài)如何確定秀存,基本圍繞著 checkedTableAndField 變量進(jìn)行捶码,那么當(dāng)我們更新 checkedTableAndField 的數(shù)據(jù),所有的勾選框狀態(tài)都會(huì)隨著它更新了或链。這里貼出來(lái)更新 checkedTableAndField 數(shù)據(jù)的部分代碼(詳情參考具體項(xiàng)目實(shí)現(xiàn)):

// 點(diǎn)擊 選擇全部表
checkAllTable() {
    let vm = this;
    let checkedTableAndField = {};
    if (!vm.isTableAllChecked) {
        vm.allTableList.forEach(tableObj => {
            checkedTableAndField[tableObj.tableName] = tableObj.fieldList.map(item => item.sensTypeMain.fieldName);
        });
    } else {
        vm.allTableList.forEach(tableObj => {
            checkedTableAndField[tableObj.tableName] = [];
        });
    }
    vm.checkedTableAndField = checkedTableAndField;
},
// 點(diǎn)擊 選擇當(dāng)前頁(yè)的表
checkCurTable() {
    let vm = this;
    let checkedTableAndField = {};
    if (!vm.isCurTableAllChecked) {
        vm.curTableList.forEach(tableObj => {
            checkedTableAndField[tableObj.tableName] = tableObj.fieldList.map(item => item.sensTypeMain.fieldName);
        });
    } else {
        vm.curTableList.forEach(tableObj => {
            checkedTableAndField[tableObj.tableName] = [];
        });
    }
    vm.checkedTableAndField = checkedTableAndField;
},
// 點(diǎn)擊 選擇單個(gè)表
checkPerTable(tableObj) {
    let vm = this;
    let checkedFieldArr = !vm.isPerTableAllChecked(tableObj) ? tableObj.fieldList.map(item => item.sensTypeMain.fieldName) : [];
    this.$set(this.checkedTableAndField, tableObj.tableName, checkedFieldArr);
},
// 點(diǎn)擊 選擇當(dāng)前顯示的全部字段
checkCurAllField() {
    let vm = this;
    let checkedFieldArr = !vm.isFieldAllChecked ? vm.allFieldList.map(item => item.sensTypeMain.fieldName) : [];
    this.$set(this.checkedTableAndField, this.curTableName, checkedFieldArr);
},
// 點(diǎn)擊 選擇字段
checkField(fieldName) {
    let checkedFieldArr = this.checkedTableAndField[this.curTableName];
    if (checkedFieldArr) {
        let position = checkedFieldArr.indexOf(fieldName);
        position > -1 ? checkedFieldArr.splice(position, 1) : checkedFieldArr.push(fieldName);
    } else {
        checkedFieldArr = [fieldName];
    }
    this.$set(this.checkedTableAndField, this.curTableName, checkedFieldArr);
},

總結(jié)

以上就實(shí)現(xiàn)了純前端翻頁(yè)+跨頁(yè)級(jí)聯(lián)勾選效果惫恼。純前端翻頁(yè)是把先把搜索數(shù)據(jù)保存在本地變量中,然后通過(guò)數(shù)組的切片功能澳盐,根據(jù)當(dāng)前頁(yè)數(shù)和大小進(jìn)行切片祈纯,再把結(jié)果保存到當(dāng)前頁(yè)中〉鸢遥跨頁(yè)級(jí)聯(lián)選擇是先把所有數(shù)據(jù)保存在本地變量中腕窥,再分析如何確定各個(gè)勾選框狀態(tài),最后通過(guò)一個(gè)保存了已勾選的表和字段狀態(tài)的變量進(jìn)行狀態(tài)更新筛婉。這其中的重點(diǎn)便是理解如何構(gòu)建和維護(hù)這樣一個(gè)變量簇爆。

另外,純前端翻頁(yè)是目的是為了能夠完成跨頁(yè)級(jí)聯(lián)勾選功能爽撒,因?yàn)橹挥泻蠖朔祷亓怂械臄?shù)據(jù)給我們冕碟,我們才能計(jì)算出全部選擇勾選框的狀態(tài)。數(shù)據(jù)量過(guò)大的情況下匆浙,后端即使返回了所有數(shù)據(jù)給我們安寺,瀏覽器也無(wú)法進(jìn)行大量數(shù)據(jù)的保存和計(jì)算。這種情況下首尼,需要采取另外的方案挑庶。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市软能,隨后出現(xiàn)的幾起案子迎捺,更是在濱河造成了極大的恐慌,老刑警劉巖查排,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凳枝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)岖瑰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門叛买,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蹋订,你說(shuō)我怎么就攤上這事率挣。” “怎么了露戒?”我有些...
    開(kāi)封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵椒功,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我智什,道長(zhǎng)动漾,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任荠锭,我火速辦了婚禮谦炬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘节沦。我一直安慰自己键思,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布甫贯。 她就那樣靜靜地躺著吼鳞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叫搁。 梳的紋絲不亂的頭發(fā)上赔桌,一...
    開(kāi)封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音渴逻,去河邊找鬼疾党。 笑死,一個(gè)胖子當(dāng)著我的面吹牛惨奕,可吹牛的內(nèi)容都是我干的雪位。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼梨撞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼雹洗!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起卧波,我...
    開(kāi)封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤时肿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后港粱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體螃成,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寸宏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宁炫。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖击吱,靈堂內(nèi)的尸體忽然破棺而出淋淀,到底是詐尸還是另有隱情遥昧,我是刑警寧澤覆醇,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站炭臭,受9級(jí)特大地震影響永脓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鞋仍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一常摧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧威创,春花似錦落午、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至吸申,卻和暖如春梗劫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背截碴。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工梳侨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人日丹。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓走哺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親哲虾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子割坠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 為大家梳理一個(gè)web表格設(shè)計(jì)框架,希望能夠給大家?guī)?lái)完整的不一樣的內(nèi)容妒牙。全文12,598字 彼哼,預(yù)計(jì)閱讀30分鐘,建...
    小龍ha閱讀 1,860評(píng)論 0 3
  • Web網(wǎng)站測(cè)試流程和方法(轉(zhuǎn)載) 1測(cè)試流程與方法 1.1測(cè)試流程 進(jìn)行正式測(cè)試之前湘今,應(yīng)先確定如何開(kāi)展測(cè)試敢朱,不可盲...
    夏了夏夏夏天閱讀 1,274評(píng)論 0 0
  • 這一段時(shí)間以來(lái)做web端的產(chǎn)品較多,漸漸地覺(jué)得如果能積累一份規(guī)范的交互設(shè)計(jì)規(guī)范,能有效保證產(chǎn)品操作的一致性和連貫性...
    youngcheer閱讀 3,797評(píng)論 0 11
  • 兼容性 1拴签、自適應(yīng)1280*768px及以上的分辨率 默認(rèn)窗口設(shè)置下孝常,不應(yīng)出現(xiàn)水平滾動(dòng)條,盡量避免出現(xiàn)垂直滾動(dòng)條(...
    reloaded么閱讀 1,996評(píng)論 0 0
  • 作為頁(yè)面布局的重要組成部分蚓哩,表格的身影隨處可見(jiàn)构灸。了解與熟知To B業(yè)務(wù)平臺(tái)軟件設(shè)計(jì)的工作人員都應(yīng)該知道,表格在平臺(tái)...
    弘毅道閱讀 19,849評(píng)論 3 59