亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Vue?結(jié)合Sortablejs實現(xiàn)table行排序功能

 更新時間:2022年10月26日 11:38:02   作者:馬永猛  
在一個列表展示頁面上,使用了表格組件,原有組件本身不支持拖拽功能,需求要求在列表的基礎(chǔ)上支持行拖拽排序,因此引入了www.sortablejs.com插件,接下來通過本文給大家講解Vue?結(jié)合Sortablejs實現(xiàn)table行排序功能,需要的朋友可以參考下

Sortable.js是一款輕量級的拖放排序列表的js插件(雖然體積小,可是功能很強大)

官方Demo:http://rubaxa.github.io/Sortable/

場景

在一個列表展示頁面上,使用了表格組件,原有組件本身不支持拖拽功能,需求要求在列表的基礎(chǔ)上支持行拖拽排序。因此引入了www.sortablejs.com插件。

問題

引入Sortablejs后剛開始都很順利,效果的拖拽基本功能效果已實現(xiàn)。代碼如下

const tbody = this.$refs.Scheduling.querySelectorAll('.ant-table-tbody') // 元素選擇器名稱根據(jù)實際內(nèi)容替換
Sortable.create(tbody[0]) //具體Sortablejs的api文檔可查看官網(wǎng)

下一步就是保存數(shù)據(jù)
但是在保存數(shù)據(jù)的時候才發(fā)現(xiàn),數(shù)據(jù)并沒有修改,還是原來的數(shù)據(jù),接下來就來處理數(shù)據(jù)排序的問題,經(jīng)查看Sortablejs文檔引入了onEnd方法,也可用onUpdate方法
代碼修改如下

 const tbody = this.$refs.Scheduling.querySelectorAll('.ant-table-tbody') // 元素選擇器名稱根據(jù)實際內(nèi)容替換
  const _this = this
    Sortable.create(tbody[0], {
      onEnd({ newIndex, oldIndex }) {
      const currRow = _this.databases.splice(oldIndex, 1)[0]
      _this.databases.splice(newIndex, 0, currRow)
      }
    })

修改完之后本以為可以了,就去調(diào)試一下,就出現(xiàn)了比較詭異的問題。A和B拖拽交換位置之后,B和A又神奇的換回去了,整體都亂套了!很奇怪。
經(jīng)查看資料才發(fā)現(xiàn)
Vue的實現(xiàn)原理,在Vue2.0之前是通過defineProperty依賴注入和跟蹤的方式實現(xiàn)雙向綁定。針對v-for數(shù)組指令,如果指定了唯一的Key,則會通過高效的Diff算法計算出數(shù)組內(nèi)元素的差異,進行最少的移動或刪除操作。而Vue2.0之后在引入了Virtual Dom之后,Children元素的Dom Diff算法和前者其實是相似的,唯一的區(qū)別就是,2.0之前Diff直接針對v-for指令的數(shù)組對象,2.0之后則針對Virtual Dom。DOM Diff算法在這里不再贅述,這里解釋的比較清楚virtual-dom diff算法
假設(shè)我們的列表元素數(shù)組是[‘A','B','C','D']
渲染出來后的DOM節(jié)點是[$A,$B,$C,$D]
那么Virtual Dom對應的結(jié)構(gòu)就是[{elm:$A,data:'A'},
{elm:$B,data:'B'},
{elm:$C,data:'C'},
{elm:$D,data:'D'}]
假設(shè)拖拽排序之后,真實的DOM變?yōu)閇$B,$A,$C,$D]
此時我們只操作了真實DOM,改編了它的位置,而Virtual Dom的結(jié)構(gòu)并沒有改變,依然是[{elm:$A,data:'A'},
{elm:$B,data:'B'},
{elm:$C,data:'C'},
{elm:$D,data:'D'}]
此時我們把列表元素也按照真實DOM排序后變成[‘B','A','C','D']
這時候根據(jù)Diff算法,計算出的Patch為,VNode前兩項是同類型的節(jié)點,所以直接更新,即把$A節(jié)點更新成$B,把$B節(jié)點更新成$A,真實DOM又變回了[$A,$B,$C,$D]
所以就出現(xiàn)了拖拽之后又被Patch算法更新了一次的問題,操作路徑可以簡單理解為
拖拽移動真實DOM -> 操作數(shù)據(jù)數(shù)組 -> Patch算法再更新真實DOM
根本原因
根本原因是Virtual DOM和真實DOM之間出現(xiàn)了不一致。
所以在Vue2.0以前,因為沒有引入Virtual DOM,這個問題是不存在的。
在使用Vue框架的時候要盡量避免直接操作DOM

最后修改代碼如下

 onEnd({ newIndex, oldIndex }) {
         const currRowdom = tbody[0].children[newIndex]
         const oldRowdom = tbody[0].children[oldIndex]
         tbody[0].removeChild(currRowdom)
         if (newIndex > oldIndex) {
          tbody[0].insertBefore(currRowdom, oldRowdom)
        } else {
          tbody[0].insertBefore(currRowdom, oldRowdom.nextSibling)
        }

        const currRow = _this.databases.splice(oldIndex, 1)[0]
        _this.databases.splice(newIndex, 0, currRow)
        }

到此這篇關(guān)于Vue 結(jié)合Sortablejs實現(xiàn)table行排序 的文章就介紹到這了,更多相關(guān)vue table行排序 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論