[英]Repeat the same behaviour on Ant Design Editable Table for React on Ant Design Vue 3?
I'm using Ant Design in Vue 3 and I have a table that I'm able to edit all the cells.我在 Vue 3 中使用 Ant Design,我有一个表格,我可以编辑所有单元格。 The problem is: I want to automatically close the editable cell if the user opens a new one to edit.
问题是:如果用户打开一个新单元格进行编辑,我想自动关闭可编辑单元格。 While I was researching, I noticed that this behaviour happens on Ant Design for React accordingly to the documentation .
在我进行研究时,我注意到根据文档,这种行为发生在 Ant Design for React 上。
My question is, how to do this for Vue 3?我的问题是,如何为 Vue 3 执行此操作? On their documentation for Vue, the Ant Design table doesn't show this behaviour that I wanted and I have no idea how to do that.
在他们的 Vue 文档中,Ant 设计表没有显示我想要的这种行为,我不知道该怎么做。 Thanks in advance.
提前致谢。 :)
:)
This is how my code looks now:这就是我的代码现在的样子:
<template>
<a-table bordered :data-source="tableData.data" :columns="tableData.columns" :pagination="false" class="tableEditable">
<template v-for="col in this.editableCells" #[col]="{ column, text, record }" :key="col">
<div class="editable-cell" :ref="(record.key, column.key)">
<div v-if="editableData[record.key + '|' + column.key] !== undefined" class="editable-cell-input-wrapper">
<a-input v-model:value="editableData[record.key + '|' + column.key]" @pressEnter="save(record.key, column.key)" type="number" />
<check-outlined class="editable-cell-icon-check" @click="this.save(record.key, column.key)" />
</div>
<div v-else class="editable-cell-text-wrapper">
{{ text || ' ' }}
<edit-outlined class="editable-cell-icon" @click="this.edit(record.key, column.key)" />
</div>
</div>
</template>
<template #buttonTable="{text, record}">
<div class="editableTableButtonOption">
{{text}}
<Popper arrow :locked="true">
<button class="statusButtonCrud synch" v-if="showEditableButton(record.key)"> {{this.buttonText}} </button>
<template #content="{close}">
<div class="popperOptions">
<li v-for="options in this.optionsToEdit" :key="options" class="popperOptionsList" v-on:click="this.emitOption(options.method), close();">
{{$filters.translate(options.title)}}
</li>
</div>
</template>
</Popper>
</div>
</template>
</a-table>
</template>
<script>
import { CheckOutlined, EditOutlined } from '@ant-design/icons-vue';
export default {
name: 'TableEditable',
props: {
editableCells: Array,
tableData: Object,
buttonText: String,
optionsToEdit: Array,
copyOptionsTable: Boolean
},
emits: ['change', 'editRow', 'editColumn', 'editAllCells'],
components: {
CheckOutlined,
EditOutlined
},
data(){
return {
editableData: {},
selectedRow: '',
selectedColumn: '',
valueSaved: ''
}
},
methods: {
edit(row, column) {
this.editableData[row + '|' + column] = this.tableData.data.filter((item) => row === item.key)[0][column];
},
save(row, column) {
let data = {...this.tableData.data};
if (this.editableData[row + '|' + column] == '') {
data[row][column] = '0'
} else {
data[row][column] = this.editableData[row + '|' + column];
this.valueSaved = data[row][column]
}
delete this.editableData[row + '|' + column];
this.selectedRow = row;
this.selectedColumn = column;
this.$emit('change', data);
if (this.copyOptionsTable) {
this.addClass();
this.editedCell();
}
},
showEditableButton(row) {
if (this.copyOptionsTable && this.selectedRow == row) {
return true
}
},
emitOption(method) {
this.$emit(method, this.selectedRow, this.selectedColumn, this.valueSaved);
},
addClass() {
let columnsHTML = [...document.querySelectorAll('.ant-table-thead > tr > th')];
let columnsData = this.tableData.columns;
for (let idx in columnsHTML) {
columnsHTML[idx].classList.add(columnsData[idx].dataIndex);
}
},
editedCell() {
this.removeCell();
let tableRow = [...document.querySelectorAll('.ant-table-tbody > tr > td')];
let cellRef = this.$refs[this.selectedColumn];
cellRef.classList.add('editedCell');
for (let cell in tableRow) {
let div = tableRow[cell].querySelector('div')
if (div.classList.contains('editedCell')) {
tableRow[cell].classList.add('selectedCell')
}
}
},
removeCell(){
let tableRow = [...document.querySelectorAll('.ant-table-tbody > tr > td')];
for (let cell in tableRow) {
tableRow[cell].classList.remove('selectedCell')
let cellDiv = tableRow[cell].querySelector('div');
cellDiv.classList.remove('editedCell');
}
}
},
}
</script>
It was simpler than I thought it would be.它比我想象的要简单。 Just changed the edit method to this and now it's working:)
刚刚将编辑方法更改为此,现在可以使用了:)
edit(row, column) {
for (let idx in this.editableData) {
delete this.editableData[idx];
}
this.editableData[row + '|' + column] = this.tableData.data.filter((item) => row === item.key)[0][column];
},
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.