vue按住shift鍵多選方式(以element框架的table為例)
vue按住shift鍵多選

1、首先要在element組件中寫一個(gè)事件
@select = “pinSelect”,pinSelect是自定義命名

2、在data中添加兩個(gè)變量
自定義命名origin: -1是起點(diǎn)數(shù),pin:false是默認(rèn)不按住

3、在 mounted()寫鍵盤事件
keydown按住和keyup松開事件

4、在created()遍歷數(shù)據(jù)數(shù)組
并且賦值索引

5、然后在methods:中寫

完整的代碼
<template>
<!-- 按住shift鍵選擇 -->
<div>
<!-- 這里添加element組件table的select觸發(fā)事件,用來實(shí)現(xiàn)按住shift多選的 -->
<el-table
:data="tableData"
tooltip-effect="dark"
style="width: 100%"
@selection-change="handleSelectionChange"
@select = "pinSelect"
ref="multipleTable"
>
<el-table-column
type="selection"
width="55">
</el-table-column>
<el-table-column
label="日期"
width="120">
<template slot-scope="scope">{{ scope.row.date }}</template>
</el-table-column>
<el-table-column
prop="name"
label="姓名"
width="120">
</el-table-column>
<el-table-column
prop="address"
label="地址"
show-overflow-tooltip>
</el-table-column>
</el-table>
<div style="margin-top: 20px">
<el-button @click="toggleSelection([tableData[1], tableData[2]])">切換第二、第三行的選中狀態(tài)</el-button>
<el-button @click="toggleSelection()">取消選擇</el-button>
</div>
</div>
</template>
<script>
export default {
name:'ElementTable',
data() {
return {
origin: -1, // 這里給一個(gè)變量作為起點(diǎn)
pin: false, // 這里給一個(gè)變量,默認(rèn)為false,不按住
tableData: [{
date: '2016-05-01',
name: '王幼虎',
address: '上海市普陀區(qū)金沙江路 1511 弄'
}, {
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀區(qū)金沙江路 1512 弄'
}, {
date: '2016-05-03',
name: '王中虎',
address: '上海市普陀區(qū)金沙江路 1513 弄'
}, {
date: '2016-05-04',
name: '王老虎',
address: '上海市普陀區(qū)金沙江路 1514 弄'
}, {
date: '2016-05-05',
name: '王死虎',
address: '上海市普陀區(qū)金沙江路 1515 弄'
}, {
date: '2016-05-06',
name: '王骨虎',
address: '上海市普陀區(qū)金沙江路 1516 弄'
}, {
date: '2016-05-07',
name: '王灰虎',
address: '上海市普陀區(qū)金沙江路 1517 弄'
}],
multipleSelection: []
}
},
methods: {
toggleSelection(rows) {
if (rows) {
rows.forEach(row => {
this.$refs.multipleTable.toggleRowSelection(row);
});
} else {
this.$refs.multipleTable.clearSelection();
}
},
handleSelectionChange(val) {
this.multipleSelection = val;
},
// 這里是select事件開始
pinSelect (item, index) {
const data = this.$refs.multipleTable.tableData; // 獲取所以數(shù)據(jù)
const origin = this.origin; // 起點(diǎn)數(shù) 從-1開始
const endIdx = index.index; // 終點(diǎn)數(shù)
if (this.pin && item.includes(data[origin])) { // 判斷按住
const sum = Math.abs(origin - endIdx) + 1;// 這里記錄終點(diǎn)
const min = Math.min(origin, endIdx);// 這里記錄起點(diǎn)
let i = 0;
while (i < sum) {
const index = min + i;
this.$refs.multipleTable.toggleRowSelection(data[index], true); // 通過ref打點(diǎn)調(diào)用toggleRowSelection方法,第二個(gè)必須為true
i++;
}
} else {
this.origin = index.index; // 沒按住記錄起點(diǎn)
}
}
// 這里是select事件結(jié)束
},
// 這里是獲取鍵盤事件
mounted(){
window.addEventListener('keydown', code => { // 這個(gè)是獲取鍵盤按住事件
// console.log(code); // 這個(gè)是你按住鍵盤打印出鍵盤信息,在瀏覽器中自行查看
if (code.keyCode === 16 && code.shiftKey) { // 判斷是否按住shift鍵,是就把pin賦值為true
this.pin = true;
}
});
window.addEventListener('keyup', code => { // 這個(gè)是獲取鍵盤松開事件
if(code.keyCode === 16){ // 判斷是否松開shift鍵,是就把pin賦值為false
this.pin = false;
}
});
},
created(){
this.tableData.forEach((item, index) => {// 遍歷索引,賦值給data數(shù)據(jù)
item.index = index;
})
}
}
</script>
<style scoped>
</style>總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue如何獲取url路由地址和參數(shù)簡(jiǎn)單示例
這篇文章主要給大家介紹了Vue如何獲取url路由地址和參數(shù)的相關(guān)資料,通過簡(jiǎn)單的代碼示例,幫助讀者快速掌握Vue路由的基本用法,需要的朋友可以參考下2023-03-03
vue3的父?jìng)髯訂栴}(單項(xiàng)數(shù)據(jù)流)
這篇文章主要介紹了vue3的父?jìng)髯訂栴}(單項(xiàng)數(shù)據(jù)流),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
Vue+java實(shí)現(xiàn)時(shí)間段的搜索示例
本文主要介紹了Vue+java實(shí)現(xiàn)時(shí)間段的搜索示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
vue中使用sass及解決sass-loader版本過高導(dǎo)致的編譯錯(cuò)誤問題
這篇文章主要介紹了vue中使用sass及解決sass-loader版本過高導(dǎo)致的編譯錯(cuò)誤問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
vue 動(dòng)態(tài)設(shè)置img的src地址無效,npm run build 后找不到文件的解決
這篇文章主要介紹了vue 動(dòng)態(tài)設(shè)置img的src地址無效,npm run build 后找不到文件的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07
Vue3中虛擬dom轉(zhuǎn)成真實(shí)dom的過程詳解
Vue.js?在其運(yùn)行過程中會(huì)將模板編譯成虛擬?DOM?(VNode),然后再將?VNode?渲染成實(shí)際的?DOM?節(jié)點(diǎn),這個(gè)過程是由?Vue?內(nèi)部的編譯器和渲染系統(tǒng)完成的,本文給大家介紹了Vue3中虛擬dom轉(zhuǎn)成真實(shí)dom的過程,需要的朋友可以參考下2024-09-09

