element-ui el-table fixed踩坑

项目中在el-table中的索引栏添加了el-dropdown作为弹窗工具栏,并且需要悬浮这一行时就弹出,如下图:
在这里插入图片描述
最初通过添加refs属性在cell-mouse-enter中去调用el-dropdown组件实例的show以及hide方法,但当el-table-column添加了fixed属性后出现错位以及重复渲染的问题,原因是el-table实际为fixed行生成了两份实例,refs只能获取到隐藏的那一项的实例,故调用方法时调用的实际不是显示出来的实例的方法,导致定位错误,以及直接悬浮在dropdown时显示两个下拉选单
最初想通过直接操作dom,运用模拟事件触发mouseenter以及mouseleave事件开启和关闭,但是MouseEvent导致cell-mouse-enter以及cell-mouse-leave在切换行时错误的重复触发,难以解决,如下
在这里插入图片描述
所以通过ref直接获取表格实例,在表格实例中寻找子组件的实例触发,如下:

// 因使用fixed后,ref获取的不是实际显示出来的vue实例,故只能从fixedBodyWrapper中一层一层找,
// 实际渲染的元素基本不会变,如实际应用中有变化建议递归查找
this.$refs[`tableRef`].$refs['fixedBodyWrapper'].firstElementChild.children[1].children[rowIndex].children[0].children[0].children[0].__vue__.show()

添加其他配置或者自定义其他项目后可能会导致位置变化,但我这里是封装好的基本不会有变动,所以偷懒了,实际应用建议可以通过递归查找自己的目标元素

或者也可以自行改写el-table的fixed的渲染方式,如:https://juejin.cn/post/7129129207220666382

### 解决 `el-table` 组件中 `fixed` 属性失效的问题 当遇到 `el-table` 的 `fixed` 属性导致样式错乱或功能异常的情况时,可以尝试以下几种解决方案: #### 方案一:调用 `doLayout()` 方法 在获取到表格的数据之后,通过 Vue 实例访问表格组件并调用其内置的方法来重新计算布局。这有助于修复由于数据变化引起的固定列显示问题。 ```javascript this.$nextTick(() => { this.$refs.multipleTable.doLayout(); }); ``` 此操作应在确保 DOM 已更新的情况下执行,因此通常放在异步请求完成后的回调函数里[^4]。 #### 方案二:调整 CSS 样式 如果上述方法未能解决问题,则可以通过自定义 CSS 来强制设定 `.el-table__fixed` 和 `.el-table__fixed-right` 类的高度为 100%,从而保证固定的侧边栏能够正确跟随父容器的高度变化。 ```css .table-fixed { /deep/ .el-table__fixed, /deep/ .el-table__fixed-right { height: 100% !important; } } ``` 需要注意的是 `/deep/` 是用于穿透 scoped 样式的特殊语法,在某些版本的 Webpack 或其他构建工具中可能需要替换为 `>>>` 或者移除它取决于具体的配置环境。 #### 方案三:处理指针事件冲突 对于因鼠标交互引发的问题(如X轴滚动条无法正常工作),可通过修改特定类名下的 CSS 设置,允许子元素接收点击和其他输入动作的同时阻止外部干扰。 ```css .el-table__fixed, .el-table__fixed-right { pointer-events: none; td { pointer-events: auto; } } ``` 这段代码使得只有单元格内的内容可被选中和触发相应行为,而不会影响整个固定区域外层的行为[^3]。 综上所述,针对不同场景下可能出现的具体表现形式采取相应的措施往往能有效改善由 `fixed` 引起的各种视觉及功能性缺陷。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红莲R-LotusX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值