吐槽!iview的table元件

2022-09-06 02:12:11 字數 1996 閱讀 7721

為什麼要吐槽iview的table元件呢?

首先iview的table的使用體驗十分的不友好,每次修改資料都會重刷整個**,效能極差,因為重刷**會導致自動失焦等問題!

vue不是有diff演算法嗎?重刷**資料沒有發生變化部分是不會重新渲染的,效能為什麼會差呢?

是的,diff演算法是可以優化vnode的渲染問題,但是前提是key,tag等屬性沒有發生變化的情況,可是萬惡的iview table既然私自修改了key的值,導致diff的優化失效。

如何解決這個問題?

table元件data屬性接收的資料來源與實際操作的資料分離,例如:以下例子的tempdata與data。

export default

/>;

} },

],data:

},watch:,

}}

table元件的內容主題table-body元件,table-body的data屬性接收的是rebilddata

<

div

:class

="[prefixcls + '-body']"

:style

="bodystyle"

ref="body"

@scroll

="handlebodyscroll"

v-show

="!((!!localenodatatext && (!data || data.length === 0)) || (!!localenofiltereddatatext && (!rebuilddata || rebuilddata.length === 0)))"

>

<

table-body

ref="tbody"

:prefix-cls

="prefixcls"

:styleobject

="tablestyle"

:columns

="clonecolumns"

:data

="rebuilddata"

:columns-width

="columnswidth"

:obj-data

="objdata"

>

table-body

>

div>

table元件內部實現深度監聽了data屬性,當data的任意屬性發生變化就會重新生成rebuilddata。(深度拷貝乙份原有的data)為什麼要拷貝乙份呢?

解:為了防止table元件內部直接通過params.row直接修改資料來源,直接修改資料來源容易導致bug難追溯,資料容易錯亂等情況,增加維護成本!

watch: 

//here will trigger before clickcurrentrow, so use async

settimeout(() =>, 0);

},deep:

true

}, .....

}

生成新的data資料,並重置每一項資料的_rowkey屬性(該屬性被table-tr元件當作key來使用),_rowkey是全域性遞增的,每一次table重新render,_rowkey都會不斷遞增,導致diff演算法失效(導致**重新渲染的元凶)

makedatawithsortandfilter () ,

makedatawithsort ()

}if (sorttype !

== 'normal' && !iscustom) data

= this.sortdata(data,

sorttype, sortindex);

return data;

},// 生成新的data

makedata () );

return data;

},

獲取iview中表單元件Table的選中資料

背景 在做某系統的審批中心時,新增了審批訊息一鍵已讀和刪除功能,用iview的表單元件 table實現訊息列表展示,效果如下圖所示 在實現一鍵已讀或一鍵刪除時需要獲取當前訊息列表中所有選中項,通過與服務端api互動來改變訊息狀態或刪除訊息。iview官方文件僅提供單選 全選或者選中項發生變化時的監聽...

吐槽大會4 《吐槽大會4》是《吐槽大會》的終點嗎?

1月18日,吐槽大會4 最新一期如約開播。導演徐崢作為 主咖 帶著自己即將於大年初一上映的電影 囧媽 參加節目。節目播出之後,徐崢吐槽郭京飛 李誕讚吐槽大會沒有下一季 李庚希跟徐崢要易烊千璽演唱會門票 等話題接連登上微博熱搜榜,而在這之中最為觀眾注意的則是思文不僅喊話 囧系列 不要繼續了,同時也調侃...

iView修改Table元件中標題和內容的樣式

iview是乙個封裝的比較好的vue元件,所以當我們需要去修改其中部分元件的樣式時,就沒有修改普通css那麼容易了,但我們還是有方法去修改的,下面列出一種解決修改樣式問題的方案,親測有效。對於樣式的修改我們要用到的是table元件api中的兩個重要函式 render,renderheader,具體這...