mirror of https://github.com/ElemeFE/element
Table: remove some html DOM operations (#13643)
parent
96b1577ec2
commit
a54802c71a
|
@ -1,5 +1,5 @@
|
||||||
import { getCell, getColumnByCell, getRowIdentity } from './util';
|
import { getCell, getColumnByCell, getRowIdentity } from './util';
|
||||||
import { getStyle, hasClass, addClass, removeClass } from 'element-ui/src/utils/dom';
|
import { getStyle, hasClass } from 'element-ui/src/utils/dom';
|
||||||
import ElCheckbox from 'element-ui/packages/checkbox';
|
import ElCheckbox from 'element-ui/packages/checkbox';
|
||||||
import ElTooltip from 'element-ui/packages/tooltip';
|
import ElTooltip from 'element-ui/packages/tooltip';
|
||||||
import debounce from 'throttle-debounce/debounce';
|
import debounce from 'throttle-debounce/debounce';
|
||||||
|
@ -103,42 +103,6 @@ export default {
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
watch: {
|
|
||||||
'store.states.hoverRow'(newVal, oldVal) {
|
|
||||||
if (!this.store.states.isComplex) return;
|
|
||||||
const el = this.$el;
|
|
||||||
if (!el) return;
|
|
||||||
const tr = el.querySelector('tbody').children;
|
|
||||||
const rows = [].filter.call(tr, row => hasClass(row, 'el-table__row'));
|
|
||||||
const oldRow = rows[oldVal];
|
|
||||||
const newRow = rows[newVal];
|
|
||||||
if (oldRow) {
|
|
||||||
removeClass(oldRow, 'hover-row');
|
|
||||||
}
|
|
||||||
if (newRow) {
|
|
||||||
addClass(newRow, 'hover-row');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'store.states.currentRow'(newVal, oldVal) {
|
|
||||||
if (!this.highlight) return;
|
|
||||||
const el = this.$el;
|
|
||||||
if (!el) return;
|
|
||||||
const data = this.store.states.data;
|
|
||||||
const tr = el.querySelector('tbody').children;
|
|
||||||
const rows = [].filter.call(tr, row => hasClass(row, 'el-table__row'));
|
|
||||||
const oldRow = rows[data.indexOf(oldVal)];
|
|
||||||
const newRow = rows[data.indexOf(newVal)];
|
|
||||||
if (oldRow) {
|
|
||||||
removeClass(oldRow, 'current-row');
|
|
||||||
} else {
|
|
||||||
[].forEach.call(rows, row => removeClass(row, 'current-row'));
|
|
||||||
}
|
|
||||||
if (newRow) {
|
|
||||||
addClass(newRow, 'current-row');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
table() {
|
table() {
|
||||||
return this.$parent;
|
return this.$parent;
|
||||||
|
@ -247,6 +211,10 @@ export default {
|
||||||
classes.push('current-row');
|
classes.push('current-row');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rowIndex === this.store.states.hoverRow) {
|
||||||
|
classes.push('hover-row');
|
||||||
|
}
|
||||||
|
|
||||||
if (this.stripe && rowIndex % 2 === 1) {
|
if (this.stripe && rowIndex % 2 === 1) {
|
||||||
classes.push('el-table__row--striped');
|
classes.push('el-table__row--striped');
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import debounce from 'throttle-debounce/debounce';
|
import debounce from 'throttle-debounce/debounce';
|
||||||
import merge from 'element-ui/src/utils/merge';
|
import merge from 'element-ui/src/utils/merge';
|
||||||
import { hasClass, addClass, removeClass } from 'element-ui/src/utils/dom';
|
|
||||||
import { orderBy, getColumnById, getRowIdentity, getColumnByKey } from './util';
|
import { orderBy, getColumnById, getRowIdentity, getColumnByKey } from './util';
|
||||||
|
|
||||||
const sortData = (data, states) => {
|
const sortData = (data, states) => {
|
||||||
|
@ -193,17 +192,6 @@ TableStore.prototype.mutations = {
|
||||||
changeSortCondition(states, options) {
|
changeSortCondition(states, options) {
|
||||||
states.data = sortData((states.filteredData || states._data || []), states);
|
states.data = sortData((states.filteredData || states._data || []), states);
|
||||||
|
|
||||||
const { $el, highlightCurrentRow } = this.table;
|
|
||||||
if ($el && highlightCurrentRow) {
|
|
||||||
const data = states.data;
|
|
||||||
const tr = $el.querySelector('tbody').children;
|
|
||||||
const rows = [].filter.call(tr, row => hasClass(row, 'el-table__row'));
|
|
||||||
const row = rows[data.indexOf(states.currentRow)];
|
|
||||||
|
|
||||||
[].forEach.call(rows, row => removeClass(row, 'current-row'));
|
|
||||||
addClass(row, 'current-row');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!options || !options.silent) {
|
if (!options || !options.silent) {
|
||||||
this.table.$emit('sort-change', {
|
this.table.$emit('sort-change', {
|
||||||
column: this.states.sortingColumn,
|
column: this.states.sortingColumn,
|
||||||
|
|
|
@ -1773,9 +1773,10 @@ describe('Table', () => {
|
||||||
<el-table-column prop="runtime" label="时长(分)" />
|
<el-table-column prop="runtime" label="时长(分)" />
|
||||||
</el-table>
|
</el-table>
|
||||||
`,
|
`,
|
||||||
|
data() {
|
||||||
created() {
|
return {
|
||||||
this.testData = getTestData();
|
testData: getTestData()
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}, true);
|
}, true);
|
||||||
setTimeout(_ => {
|
setTimeout(_ => {
|
||||||
|
@ -1835,4 +1836,80 @@ describe('Table', () => {
|
||||||
}, DELAY);
|
}, DELAY);
|
||||||
}, DELAY);
|
}, DELAY);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('keep highlight row when data change', done => {
|
||||||
|
const vm = createVue({
|
||||||
|
template: `
|
||||||
|
<el-table :data="testData" highlight-current-row row-key="release">
|
||||||
|
<el-table-column prop="name" label="片名" />
|
||||||
|
<el-table-column prop="release" label="发行日期" />
|
||||||
|
<el-table-column prop="director" label="导演" />
|
||||||
|
<el-table-column prop="runtime" label="时长(分)" sortable />
|
||||||
|
</el-table>
|
||||||
|
`,
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
testData: getTestData()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}, true);
|
||||||
|
setTimeout(() => {
|
||||||
|
let rows = vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr');
|
||||||
|
triggerEvent(rows[2], 'click', true, false);
|
||||||
|
setTimeout(() => {
|
||||||
|
expect(rows[2].classList.contains('current-row')).to.be.true;
|
||||||
|
const data = getTestData();
|
||||||
|
data.splice(0, 0, {
|
||||||
|
id: 8,
|
||||||
|
name: 'Monsters, Inc.',
|
||||||
|
release: '2018-02-01',
|
||||||
|
director: 'Peter Docter',
|
||||||
|
runtime: 92
|
||||||
|
});
|
||||||
|
data[2].name = 'Modified Name';
|
||||||
|
vm.testData = data;
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
rows = vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr');
|
||||||
|
expect(rows[3].classList.contains('current-row')).to.be.true;
|
||||||
|
destroyVM(vm);
|
||||||
|
done();
|
||||||
|
}, DELAY);
|
||||||
|
}, DELAY);
|
||||||
|
}, DELAY);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('keep highlight row after sort', done => {
|
||||||
|
const vm = createVue({
|
||||||
|
template: `
|
||||||
|
<el-table :data="testData" highlight-current-row row-key="release">
|
||||||
|
<el-table-column prop="name" label="片名" />
|
||||||
|
<el-table-column prop="release" label="发行日期" />
|
||||||
|
<el-table-column prop="director" label="导演" />
|
||||||
|
<el-table-column prop="runtime" label="时长(分)" sortable />
|
||||||
|
</el-table>
|
||||||
|
`,
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
testData: getTestData()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}, true);
|
||||||
|
setTimeout(() => {
|
||||||
|
let rows = vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr');
|
||||||
|
triggerEvent(rows[1], 'click', true, false);
|
||||||
|
setTimeout(() => {
|
||||||
|
expect(rows[1].classList.contains('current-row')).to.be.true;
|
||||||
|
const cells = vm.$el.querySelectorAll('.el-table__header-wrapper thead th > .cell');
|
||||||
|
triggerEvent(cells[3], 'click', true, false);
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
rows = vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr');
|
||||||
|
expect(rows[3].classList.contains('current-row')).to.be.true;
|
||||||
|
destroyVM(vm);
|
||||||
|
done();
|
||||||
|
}, DELAY);
|
||||||
|
}, DELAY);
|
||||||
|
}, DELAY);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue