el-table 实现隐藏列切换时引起列表重绘抖动

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了el-table 实现隐藏列切换时引起列表重绘抖动相关的知识,希望对你有一定的参考价值。

参考技术A 工作中用到了elementui table 去实现列表显示数据。由于table的列数过多,产品要求可以让用户自己设置显示的列数。于是利用v-if 结合el-table-column实现了table的自定义列数显示。虽然功能实现了,但在操作某一列数据由隐藏变为显示的瞬间,页面会有抖动的现象。经过一段时间的查找,发现elementui在重新渲染table时td内部的div高度被重新计算了(div高度=table容器高度/行数),进而导致整个table的高度变化,给人的感觉table在抖动。解决的版本就是给td内部的div固定一个高度。该div有自己的class属性.el-table .cell 。重写该属性的样式表.el-table .cellheight: 20px !important;,问题得以解决。

如何在 SwiftUI 中触发状态更改/重绘切换更改

【中文标题】如何在 SwiftUI 中触发状态更改/重绘切换更改【英文标题】:How trigger state change / redraw on toggle change in SwiftUI 【发布时间】:2021-07-05 03:57:45 【问题描述】:

我有一些项目并在视图上显示项目计数。我有一个切换,可以减少计数/项目列表中显示的内容。当我使用切换时,项目计数不会更新。我在这里想念什么?为简洁起见减少/模拟示例。

struct SampleView: View 

    @State var items:[Item]
    @State var easyMode:Bool = false
    @State var filtered:[Item] = []

    init(...) 
        // Fill items and filtered array
    

    var body: some View 

            Toggle(isOn: $easyMode, label:
                Text("Easy mode")
            )
            .onChange(of: self.easyMode, perform:  value in
                filtered = filterItems()
                //         ^^ This is running but not
                //            updating stuff
            )
            // This text field does not update when filter changes
            Text(String(filtered.count) + " items")
    

我尝试让 filterItems 在 @State var countLabel:String 中生成文本字符串并更新文本,但存在后台线程问题。所以我认为 filterItems 没有做任何事情有一些奇怪之处,因为它在一个单独的线程上。我错过了什么?谢谢!!

【问题讨论】:

【参考方案1】:

你可以试试这个:

.onChange(of: self.easyMode)  value in
    DispatchQueue.main.async 
       filtered = filterItems()
    

【讨论】:

【参考方案2】:

我刚刚获取了您的代码并使其可编译。

struct SOTest: View 
    @State var items:[String]
    @State var easyMode:Bool = false
    @State var filtered: [String]
    
    init() 
        let tmp = ["1","2_","3","4_","5_","6"]
        self.items = tmp
        self.filtered = tmp.filterStrings()
    

    var body: some View 

            Toggle(isOn: $easyMode, label:
                Text("Easy mode")
            )
            .onChange(of: self.easyMode, perform:  value in
                
                if value 
                    filtered = items.filterStrings()
                 else 
                    filtered = items
                
            )
            Text(String(filtered.count) + " items")
    


extension Array where Element == String 
    func filterStrings() -> [String] 
        self.filter $0.contains("_") 
    

一切正常。

可能您在原始代码中做错了什么,在您的问题中您丢失了一些重要的东西。

尝试在这里查看我的答案,也许您会找到隐藏问题的解决方案:SwiftUI: Forcing an Update

并且....顺便说一句,这里有更简单的方法:

struct SOTest: View 
    @State var items:[String]
    @State var easyMode:Bool = false
    @State var filtered: [String]

    init() 
        let tmp = ["1","2_","3","4_","5_","6"]
        self.items = tmp
        self.filtered = tmp.filterStrings()
    

    var body: some View 
        Toggle(isOn: $easyMode, label:
            Text("Easy mode")
        )
        
        if easyMode 
            Text(String(filtered.count) + " items")
        
        else 
            Text(String(items.count) + " items")
        
    

【讨论】:

哇!太棒了。嗯,这令人困惑,我花了一个小时试图找出它为什么不起作用....我正在慢慢地将代码从真实项目复制并粘贴到测试项目中,以找出问题所在

以上是关于el-table 实现隐藏列切换时引起列表重绘抖动的主要内容,如果未能解决你的问题,请参考以下文章

eltable滚动文字抖动

在开发中使用el-table宽度不一致出现抖动问题

在开发中使用el-table宽度不一致出现抖动问题

在开发中使用el-table宽度不一致出现抖动问题

el-table使用时,动态赋值会出现闪烁的问题

el-tabs和el-table闪屏问题