最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

場(chǎng)景

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

問(wèn)題

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

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

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

 const tbody = this.$refs.Scheduling.querySelectorAll('.ant-table-tbody') // 元素選擇器名稱根據(jù)實(shí)際內(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)了比較詭異的問(wèn)題。A和B拖拽交換位置之后,B和A又神奇的換回去了,整體都亂套了!很奇怪。
經(jīng)查看資料才發(fā)現(xiàn)
Vue的實(shí)現(xiàn)原理,在Vue2.0之前是通過(guò)defineProperty依賴注入和跟蹤的方式實(shí)現(xiàn)雙向綁定。針對(duì)v-for數(shù)組指令,如果指定了唯一的Key,則會(huì)通過(guò)高效的Diff算法計(jì)算出數(shù)組內(nèi)元素的差異,進(jìn)行最少的移動(dòng)或刪除操作。而Vue2.0之后在引入了Virtual Dom之后,Children元素的Dom Diff算法和前者其實(shí)是相似的,唯一的區(qū)別就是,2.0之前Diff直接針對(duì)v-for指令的數(shù)組對(duì)象,2.0之后則針對(duì)Virtual Dom。DOM Diff算法在這里不再贅述,這里解釋的比較清楚virtual-dom diff算法
假設(shè)我們的列表元素?cái)?shù)組是[‘A','B','C','D']
渲染出來(lái)后的DOM節(jié)點(diǎn)是[$A,$B,$C,$D]
那么Virtual Dom對(duì)應(yīng)的結(jié)構(gòu)就是[{elm:$A,data:'A'},
{elm:$B,data:'B'},
{elm:$C,data:'C'},
{elm:$D,data:'D'}]
假設(shè)拖拽排序之后,真實(shí)的DOM變?yōu)閇$B,$A,$C,$D]
此時(shí)我們只操作了真實(shí)DOM,改編了它的位置,而Virtual Dom的結(jié)構(gòu)并沒(méi)有改變,依然是[{elm:$A,data:'A'},
{elm:$B,data:'B'},
{elm:$C,data:'C'},
{elm:$D,data:'D'}]
此時(shí)我們把列表元素也按照真實(shí)DOM排序后變成[‘B','A','C','D']
這時(shí)候根據(jù)Diff算法,計(jì)算出的Patch為,VNode前兩項(xiàng)是同類型的節(jié)點(diǎn),所以直接更新,即把$A節(jié)點(diǎn)更新成$B,把$B節(jié)點(diǎn)更新成$A,真實(shí)DOM又變回了[$A,$B,$C,$D]
所以就出現(xiàn)了拖拽之后又被Patch算法更新了一次的問(wèn)題,操作路徑可以簡(jiǎn)單理解為
拖拽移動(dòng)真實(shí)DOM -> 操作數(shù)據(jù)數(shù)組 -> Patch算法再更新真實(shí)DOM
根本原因
根本原因是Virtual DOM和真實(shí)DOM之間出現(xiàn)了不一致。
所以在Vue2.0以前,因?yàn)闆](méi)有引入Virtual DOM,這個(gè)問(wèn)題是不存在的。
在使用Vue框架的時(shí)候要盡量避免直接操作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實(shí)現(xiàn)table行排序 的文章就介紹到這了,更多相關(guān)vue table行排序 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue封裝實(shí)現(xiàn)自動(dòng)循環(huán)滾動(dòng)的列表

    vue封裝實(shí)現(xiàn)自動(dòng)循環(huán)滾動(dòng)的列表

    在做數(shù)據(jù)大屏開(kāi)發(fā)的過(guò)程中,經(jīng)常出現(xiàn)需要對(duì)列表進(jìn)行自動(dòng)滾動(dòng)的需求,所以本文就來(lái)為大家介紹一下如何利用vue封裝一個(gè)自動(dòng)循環(huán)滾動(dòng)的列表吧
    2023-09-09
  • 使用異步組件優(yōu)化Vue應(yīng)用程序的性能

    使用異步組件優(yōu)化Vue應(yīng)用程序的性能

    這篇文章主要介紹了使用異步組件優(yōu)化Vue應(yīng)用程序的性能,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-04-04
  • vue中使用過(guò)濾器filters的this為undefined的問(wèn)題

    vue中使用過(guò)濾器filters的this為undefined的問(wèn)題

    這篇文章主要介紹了vue中使用過(guò)濾器filters的this為undefined的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 詳解vuex 漸進(jìn)式教程實(shí)例代碼

    詳解vuex 漸進(jìn)式教程實(shí)例代碼

    Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開(kāi)發(fā)的狀態(tài)管理模式。通過(guò)本文給大家分享vuex 漸進(jìn)式教程實(shí)例代碼,從入門(mén)級(jí)帶你慢慢深入使用vuex,感興趣的朋友一起看看吧
    2018-11-11
  • axios對(duì)請(qǐng)求各種異常情況處理的封裝方法

    axios對(duì)請(qǐng)求各種異常情況處理的封裝方法

    今天小編就為大家分享一篇axios對(duì)請(qǐng)求各種異常情況處理的封裝方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • Vue Axios異步與數(shù)據(jù)類型轉(zhuǎn)換問(wèn)題淺析

    Vue Axios異步與數(shù)據(jù)類型轉(zhuǎn)換問(wèn)題淺析

    總的來(lái)說(shuō)這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過(guò)程。希望通過(guò)這道題能給你帶來(lái)一種解題優(yōu)化的思路,Axios是一個(gè)開(kāi)源的可以用在瀏覽器端和Node JS的異步通信框架,主要作用就是實(shí)現(xiàn)AJAX異步通信
    2023-01-01
  • vue中ref的用法小結(jié)

    vue中ref的用法小結(jié)

    在項(xiàng)目中使用ref時(shí)有時(shí)候直接取值,有時(shí)候返回的卻是一個(gè)數(shù)組,不知其中緣由,后查了一下ref用法,在這里給大家分享vue中ref的用法,感興趣的朋友一起看看吧
    2023-11-11
  • 詳解vue之頁(yè)面緩存問(wèn)題(基于2.0)

    詳解vue之頁(yè)面緩存問(wèn)題(基于2.0)

    本篇文章主要介紹了vue之頁(yè)面緩存問(wèn)題(基于2.0),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • vue.js滾動(dòng)條插件vue-scroll的基本用法

    vue.js滾動(dòng)條插件vue-scroll的基本用法

    在移動(dòng)端或PC,頁(yè)面的部分內(nèi)容常常需要我們讓其在頁(yè)面滾動(dòng),這篇文章主要給大家介紹了關(guān)于vue.js滾動(dòng)條插件vue-scroll的基本用法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • vue下canvas裁剪圖片實(shí)例講解

    vue下canvas裁剪圖片實(shí)例講解

    在本篇文章里小編給大家整理了關(guān)于vue下canvas裁剪圖片實(shí)例講解內(nèi)容,需要的朋友們可以參考下。
    2020-04-04

最新評(píng)論

盱眙县| 高陵县| 泸州市| 郁南县| 梧州市| 清水县| 五原县| 姚安县| 阿瓦提县| 闵行区| 开封县| 淳安县| 体育| 丁青县| 镇坪县| 临江市| 台南县| 乌拉特后旗| 福安市| 互助| 合水县| 灌南县| 揭西县| 富蕴县| 富锦市| 鄂托克前旗| 独山县| 综艺| 黎川县| 丘北县| 额敏县| 舒兰市| 永春县| 东明县| 饶河县| 鹿邑县| 如东县| 绥阳县| 汤阴县| 绩溪县| 巴彦县|