el-table设置prop也可以通过property进行设置

截屏2022-05-28 下午4.41.11.png

隐藏属性showTooltipWhenOverflow,设置后效果跟showOverflowTooltip一样截屏2022-05-28 下午4.36.18.png

column上面设置renderHeader属性是不起作用的,只会在控制台给你一个警告而已

截屏2022-05-28 下午4.41.54.png
测试:如下代码会出现浏览器警告,并且render函数没有效果没有效果

  1. // template
  2. <el-table
  3. :data="tableData"
  4. style="width: 100%">
  5. <el-table-column
  6. type="index"
  7. :render-header="renderHeader"
  8. width="50">
  9. </el-table-column>
  10. </el-table>
  11. // script
  12. methods: {
  13. renderHeader(h) {
  14. return h('div', 'test')
  15. }
  16. }

截屏2022-05-28 下午4.47.56.png

使用slot,必须加上slot-scope属性,否则slot无效??

  1. <el-table
  2. :data="tableData"
  3. style="width: 100%">
  4. <el-table-column
  5. type="index"
  6. width="50">
  7. <template slot="header" slot-scope="scope">这是一个表头</template>
  8. </el-table-column>
  9. </el-table>

目前在源码里面做打印,发现如果不加slot-scope,则下面代码获取的是undefined,所以html渲染时,解析没有slot-scope则不进行渲染了

  1. column.renderHeader = (h, scope) => {
  2. // * $scopedSlots实际上获取的是slot-scope
  3. const renderHeader = this.$scopedSlots.header;
  4. return renderHeader ? renderHeader(scope) : column.label;
  5. };

el-table和el-table-column的关系不一般

el-table属于一个父组件,el-table-column是一个子组件,但是这个子组件只是提供了一个容器,放到el-table组件的一个div中,作为一个默认插槽
el-table-column不直接进行渲染,只是提供各种属性给父组件el-table,然后父组件再跟进column的属性进行渲染在不同的地方

  1. // el-table的template
  2. <div class="el-table">
  3. <!-- 放<el-table-column>子组件的插槽,就这一点小地方 -->
  4. <div class="hidden-columns" ref="hiddenColumns"><slot></slot></div>
  5. <!-- 下面一堆都是el-table组件的渲染节点 -->
  6. <!-- 。。。。 -->
  7. </div>

表格筛选功能filtered-value字段单独使用没有筛选效果

filtered-value字段表示默认的渲染,这个字段是一个table-column上的属性,不要写错地方了
filtered-value字段必须有配合filter-method才能发挥作用,如下代码:

  1. execFilter() {
  2. const states = this.states;
  3. const { _data, filters } = states;
  4. let data = _data;
  5. Object.keys(filters).forEach((columnId) => {
  6. const values = states.filters[columnId];
  7. if (!values || values.length === 0) return;
  8. const column = getColumnById(this.states, columnId);
  9. if (column && column.filterMethod) {
  10. data = data.filter((row) => {
  11. return values.some(value => column.filterMethod.call(null, value, row, column));
  12. });
  13. }
  14. });
  15. states.filteredData = data;
  16. },

fixed属性只作用于第一级header,也就是如果有列合并,如果在嵌套的column设置fixed是无效的

  1. // getHeaderCellClass方法
  2. getHeaderCellClass(rowIndex, columnIndex, row, column) {
  3. // ......
  4. // ......
  5. // *如果是第一行表头并且
  6. // !为啥一定是第一行,我看html结构还真是没有is-hidden,我看就算所有都没有is-hidden似乎也没问题:fixed只作用于第一级header,合并的子header设置了fixed属性无用
  7. if (rowIndex === 0 && this.isCellHidden(columnIndex, row)) {
  8. classes.push('is-hidden');
  9. }
  10. // ......
  11. // ......
  12. }