function getIndex(row,node,id){
if(node.$isShift){
node.$endSelectData = row[id]
}else{
node.$startSelectData = row[id]
node.$endSelectData = null
}
getNeedSelectData(node,id)
}
function getNeedSelectData(node,id){
if(node.$endSelectData && node.$startSelectData ){
let startIndex = null,endIndex = null
node.tableData.forEach((value,key)=>{
if(value[id] === node.$startSelectData){
startIndex = key
}
if(value[id]===node.$endSelectData){
endIndex = key
}
})
checkBox(node,startIndex,endIndex )
}
}
function checkBox(node,startIndex,endIndex ){
if(startIndex>endIndex ){
let temp = endIndex
endIndex = startIndex
startIndex = temp
}
const checkRows = node.tableData.slice(startIndex+1,endIndex);
checkRows.forEach(row=>{
node.toggleRowSelection(row)
})
delete node.$startSelectData
delete node.$endSelectData
}
function bind(el,binding){
if(!binding.value)return
el.onselectstart = function(){return false}
el.onkeydown = function(val){
if(val.key==='Shift'){
el.__vue__.$isShift = true
}
}
el.onkeyup=function(val){
if(val.key==='Shift'){
el.__vue__.$isShift = false
}
}
el.__vue__.$on('select',(selection,row)=>{
getIndex(row,el.__vue__,binding.value);
})
}
使用
Vue.directive('select-shift',bind)
<el-table v-select-shift="'oid'"></el-table>