el-table点击单元格变成输入框,以及其自动获取焦点失效可能的原因(focus失效)
在Element UI的el-table
组件中,要使得点击单元格变为输入框,并且能够自动获取焦点,可以通过结合@cell-click
事件和el-input
组件的@click
事件来实现。以下是一个简单的示例:
<template>
<el-table :data="tableData" @cell-click="handleCellClick">
<el-table-column prop="date" label="日期" width="180">
<template slot-scope="scope">
<el-input
v-if="scope.column.property === 'date' && editable[scope.$index]"
:ref="`input${scope.$index}`"
v-model="scope.row.date"
@click.native.stop
@blur="handleInputBlur(scope.$index)"
></el-input>
<span v-else>{{ scope.row.date }}</span>
</template>
</el-table-column>
<!-- 其他列 -->
</el-table>
</template>
<script>
export default {
data() {
return {
tableData: [
{ date: '2016-05-02', name: 'Tom', address: 'No.189, Grove St, Los Angeles' },
// ...
],
editable: []
};
},
methods: {
handleCellClick(row, column, cell, event) {
// 点击单元格进入编辑模式
if (column.property === 'date') {
this.editable = this.tableData.map(() => false);
this.$set(this.editable, row.index, true);
this.$nextTick(() => {
// 使用$nextTick确保DOM已经更新
this.$refs[`input${row.index}`][0].$refs.input.focus();
});
}
},
handleInputBlur(index) {
// 输入框失去焦点时退出编辑模式
this.$set(this.editable, index, false);
}
}
};
</script>
在上述代码中,我们定义了一个名为editable
的数组,它与tableData
一一对应,用于标识每一行是否处于编辑状态。在handleCellClick
方法中,我们通过$set
方法来更新editable
数组,以触发视图的更新,并进入编辑模式。在el-input
组件中,我们使用ref
属性为输入框添加了引用,并在handleCellClick
方法中通过this.$refs
来访问并调用focus
方法,以使输入框自动获取焦点。
如果你遇到输入框的focus
方法失效的问题,可能的原因和解决方法如下:
- 输入框还未渲染完成:使用
$nextTick
确保DOM已经更新。 - 其他元素的事件拦截导致焦点失效:检查是否有其他元素的点击事件阻止了焦点的设置,可以使用
.stop
修饰符来阻止事件冒泡。 - CSS样式问题:检查是否有CSS样式(如
pointer-events: none;
)导致输入框无法获取焦点。
确保你的代码中考虑到了这些可能的原因,并做出相应的调整。
评论已关闭