<template>
<div class="app-container">
<el-table
v-loading="listLoading"
:data="list"
element-loading-text="Loading"
border
fit
highlight-current-row
>
<el-table-column align="center" label="ID" width="95">
<template slot-scope="scope">
<el-input v-model="scope.row.id"
v-bind:ref="'r'+ scope.$index + 'c' + 1"
@input='input(scope.row, scope.row.id, range.value)'
@keyup.native="keyup($event, scope.$index, 1)"
@change='save(scope.row)'></el-input>
</template>
</el-table-column>
<el-table-column align="center" label="author" width="95">
<template slot-scope="scope">
<el-input v-model="scope.row.author"
v-bind:ref="'r'+ scope.$index + 'c' + 2"
@input='input(scope.row, scope.row.author, range.value)'
@keyup.native="keyup($event, scope.$index, 2)"
@change='save(scope.row)'></el-input>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import { getList } from '@/api/table'
export default {
filters: {
statusFilter(status) {
const statusMap = {
published: 'success',
draft: 'gray',
deleted: 'danger'
}
return statusMap[status]
}
},
data() {
return {
list: null,
listLoading: true
}
},
created() {
this.fetchData()
},
methods: {
fetchData() {
this.listLoading = true
getList().then(response => {
this.list = response.data.items
this.listLoading = false
})
},
keyup(ev, row, col) {
this.keyupTo(ev, row, col, this.list.length,2)
},
keyupTo(ev, row, col, rowCount, colCount) {
// 替代 switch 的优雅写法
const actions = {
'ArrowUp': () => {
row--
if (row < 0) row = rowCount - 1
},
'ArrowDown': () => {
row++
if (row >= rowCount) row = 0;
},
'ArrowLeft': () => {
col--
if (col < 1) col = colCount;
},
'ArrowRight': () => {
col++
if (col > colCount) col = 1
},
'Enter': () => {
col++
if (col > colCount) {
// 右下角的话保持不动
if (row === (rowCount - 1)) {
col = colCount
this.list.push({})
} else {
col = 1
row++
}
}
},
}
let action = actions[ev.key];
if (action !== undefined) {
action.call()
// 用 nextTick 避免 input 还没渲染出来
this.$nextTick(() => {
this.$refs['r' + row + 'c' + col].focus()
})
}
},
}
}
</script>