Изначально хотел воспроизвести на jsfiddle, но не получилось, поэтому покажу скрины
vue版本:2.5.3
element-ui版本:1.4.13
浏览器:chrome 66.0.3359.170
Вы можете обнаружить, что таблица с фиксированной высотой имеет не только вертикальные полосы прокрутки, но и горизонтальные полосы прокрутки (прокручивать можно только немного), по сути, ширины достаточно для отображения.
Затем я поискал проблему в Интернете и нашел связанные с ней проблемы.GitHub.com/E?Fe/Голодный… GitHub.com/E?Fe/Голодный…
где вопрошающий под номером 78 дал решениеGitHub.com/Цин Вэй-ли/…
Одна вещь похожа на # 78, моя таблица также настроена, а заголовок и содержимое передаются как атрибуты, что может привести к неточному расчету ширины таблицы при первом рендеринге, в результате чего окончательная ширина превышает 2 пикселя (проверено на be border).width); но решение неприменимо. С одной стороны, проект принимает метод загрузки cdn. С другой стороны, я пробовал версию 1.4.13 и версию 1.0.1 решения. структура кода непоследовательна, и я не знаю элементную составляющую, поэтому пытаюсь разобраться сам.
Сначала вставьте код моей таблицы конфигурации для удобства использования позже
<template>
<div>
<el-table border :data="data" height="550" v-loading="isLoading">
<el-table-column v-for="{value, label, options} in columns" :key="value" :label="label" :prop="value">
<template slot-scope="{row}">
<span v-if="!options">{{row[value]}}</span>
<div v-else-if="options && options.filter">{{row[value] | filterData(options.filter)}}</div>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="{row}">
<!--这里可在父级插入自定义操作按钮-->
<slot :row="row"/>
</template>
</el-table-column>
</el-table>
<Pagination :total="total" @fetchData="$emit('fetchData')"/>
</div>
</template>
<script>
import Pagination from 'FORM/Pagination'
import {formatTimestamp} from 'UTILS'
export default {
props: {
isLoading: {
type: Boolean,
default: false,
required: true
},
columns: {
type: Array,
default: [],
required: true
},
data: {
type: Array,
default: [],
required: true
},
total: {
type: Number,
default: 0,
required: true
}
},
components: {
Pagination
},
filters: {
filterData: function (value, filter) {
if (!filter) return value
switch (filter) {
case 'formatDate':
return formatTimestamp(value)
break;
default:
return value
}
}
}
}
</script>
Вариант 1. Попробуйте изменить данные после рендеринга и дайте таблице перерисовать
в компоненте конфигурацииupdated
Хук обновляет данные столбца (уровень преобразования выполняется посередине, а свойства не изменяются напрямую), но таблица, похоже, не связывает данные в обоих направлениях (не уверен в этом, но когда я отлаживаю , содержимое измененной таблицы не может быть обновлено в режиме реального времени, поэтому мне нужно обновить просмотр), поэтому таблица не изменяется и не вызывает второй расчет ширины.
Вариант 2. Попробуйте удалить границу в 2 пикселя после рендеринга.
Отладка в браузере найдена для удаления.el-table
После левой и правой границel-table
Свяжите класс, снимите границу, но не слишком красивая граница. . .
Вариант 3: оставить расчет ширины браузеру
Также отладил в браузере и обнаружил, что.el-table__body-wrapper
Атрибут overflow скрыт и отображается снова, горизонтальная полоса прокрутки не появится, ее нужно добавить зановоoverflow: auto;
Заставляет браузер сам пересчитывать ширину таблицы, поэтому горизонтальную полосу прокрутки не нужно отображать, если ширины достаточно;
Таким образом:
<!-- template -->
<el-table ref="configurationTable" border :data="data" :height="height" v-loading="isLoading" :class="['configurationTable', {afterRenderClass: showAfterRenderClass}]">
<!-- xxx -->
</el-table>
// script
data () {
return {
showAfterRenderClass: false
}
},
updated () {
/**
* 用于隐藏固定高度时显示不必要的scrollX的定时器
* 这是el-table初次渲染时宽度计算的bug,可在渲染后通过重新赋予overflow: auto调整
*/
const handleScrollX = setInterval(() => {
// 检测是否已经生成table节点,如果不是就每隔0.5s检测一次
// 只有生成了真实节点才能够通过修改overflow属性让浏览器重新计算
if (this.$refs.configurationTable) {
this.showAfterRenderClass = true
clearInterval(handleScrollX)
}
}, 500)
}
/** style (注意不要设为scoped) */
/** configurationTable和afterRenderClass都是为了标记仅这个组件内修改 */
.configurationTable .el-table__body-wrapper {
overflow: hidden;
}
.afterRenderClass {
.el-table__body-wrapper {
overflow: auto;
}
}
Суммировать
Поскольку поддержка element-ui v1 прекращена, мы не будем упоминать о новых проблемах, а затем нам все еще нужно перейти на element-ui2 (если у вас есть инструмент миграции, вы можете порекомендовать его, и вы также можете порекомендовать его, если вы наступили на яму), в противном случае покиньте ее.Эта черная магия увеличивает затраты на обслуживание.