<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Vue使用Sortable步驟詳解

        來源:懂視網 責編:小采 時間:2020-11-27 19:51:04
        文檔

        Vue使用Sortable步驟詳解

        Vue使用Sortable步驟詳解:這次給大家帶來Vue使用Sortable步驟詳解,Vue使用Sortable的注意事項有哪些,下面就是實戰案例,一起來看一下。之前開發一個后臺管理系統,里面用到了Vue和Element-UI這個組件庫,遇到一個挺有意思的問題,和大家分享一下。場景是這樣,在一個列表展示頁上,
        推薦度:
        導讀Vue使用Sortable步驟詳解:這次給大家帶來Vue使用Sortable步驟詳解,Vue使用Sortable的注意事項有哪些,下面就是實戰案例,一起來看一下。之前開發一個后臺管理系統,里面用到了Vue和Element-UI這個組件庫,遇到一個挺有意思的問題,和大家分享一下。場景是這樣,在一個列表展示頁上,

        渲染出來后的DOM節點是

        [$A,$B,$C,$D]

        那么Virtual Dom對應的結構就是

        [{elm:$A,data:'A'},
        {elm:$B,data:'B'},
        {elm:$C,data:'C'},
        {elm:$D,data:'D'}]

        假設拖拽排序之后,真實的DOM變為

        [$B,$A,$C,$D]

        此時我們只操作了真實DOM,改編了它的位置,而Virtual Dom的結構并沒有改變,依然是

        [{elm:$A,data:'A'},
        {elm:$B,data:'B'},
        {elm:$C,data:'C'},
        {elm:$D,data:'D'}]

        此時我們把列表元素也按照真實DOM排序后變成

        [‘B','A','C','D']

        這時候根據Diff算法,計算出的Patch為,VNode前兩項是同類型的節點,所以直接更新,即把$A節點更新成$B,把$B節點更新成$A,真實DOM又變回了

        [$A,$B,$C,$D]

        所以就出現了拖拽之后又被Patch算法更新了一次的問題,操作路徑可以簡單理解為

        拖拽移動真實DOM -> 操作數據數組 -> Patch算法再更新真實DOM

        根本原因

        根本原因是Virtual DOM和真實DOM之間出現了不一致。

        所以在Vue2.0以前,因為沒有引入Virtual DOM,這個問題是不存在的。

        在使用Vue框架的時候要盡量避免直接操作DOM

        解決方案

        1、通過設置key唯一標志每一個VNode,這也是Vue推薦的使用v-for指令的方式。因為在判斷兩個VNode是否為同類型時會調用sameVnode方法,優先判斷key是否相同

        function sameVnode (a, b) {
         return (
         a.key === b.key &&
         a.tag === b.tag &&
         a.isComment === b.isComment &&
         isDef(a.data) === isDef(b.data) &&
         sameInputType(a, b)
         )
        }

        2、因為根本原因是真實DOM和VNode不一致,所以可以通過把拖拽移動真實DOM的操作還原,即在回調函數里,把[$B,$A,$C,$D]還原成[$A,$B,$C,$D],讓DOM的操作交還給Vue

        拖拽移動真實DOM ->還原移動操作 -> 操作數據數組 -> Patch算法再更新真實DOM

        代碼如下

        var app = new Vue({
         el: '#app', 
         mounted:function(){
         var $ul = this.$el.querySelector('#ul')
         var that = this
         new Sortable($ul, {
         onUpdate:function(event){
         var newIndex = event.newIndex,
         oldIndex = event.oldIndex
         $li = $ul.children[newIndex],
         $oldLi = $ul.children[oldIndex]
         // 先刪除移動的節點
         $ul.removeChild($li) 
         // 再插入移動的節點到原有節點,還原了移動的操作
         if(newIndex > oldIndex) {
         $ul.insertBefore($li,$oldLi)
         } else {
         $ul.insertBefore($li,$oldLi.nextSibling)
         }
         // 更新items數組
         var item = that.items.splice(oldIndex,1)
         that.items.splice(newIndex,0,item[0])
         // 下一個tick就會走patch更新
         }
         })
         },
         data:function() {
         return {
         message: 'Hello Vue!',
         items:[{
         key:'1',
         name:'1'
         },{
         key:'2',
         name:'2'
         },{
         key:'3',
         name:'3'
         },{
         key:'4',
         name:'4'
         }]
         }
         },
         watch:{
         items:function(){
         console.log(this.items.map(item => item.name))
         }
         }
         })

        3.暴力解決!不走patch更新,通過v-if設置,直接重新渲染一遍。當然不建議這么做,只是提供這種思路~

         mounted:function(){
         var $ul = this.$el.querySelector('#ul')
         var that = this
         var updateFunc = function(event){
         var newIndex = event.newIndex,
         oldIndex = event.oldIndex
         var item = that.items.splice(oldIndex,1)
         that.items.splice(newIndex,0,item[0])
         // 暴力重新渲染!
         that.reRender = false
         // 借助nextTick和v-if重新渲染
         that.$nextTick(function(){
         that.reRender = true
         that.$nextTick(function(){
         // 重新渲染之后,重新進行Sortable綁定
         new Sortable(that.$el.querySelector('#ul'), {
         onUpdate:updateFunc
         })
         })
         })
         }
         new Sortable($ul, {
         onUpdate:updateFunc
         })
         },

        相信看了本文案例你已經掌握了方法,更多精彩請關注Gxl網其它相關文章!

        推薦閱讀:

        vue-cli怎樣做出跨域請求

        Angular5對組件標簽添加樣式class步驟說明

        JS怎樣實現運算符重載

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Vue使用Sortable步驟詳解

        Vue使用Sortable步驟詳解:這次給大家帶來Vue使用Sortable步驟詳解,Vue使用Sortable的注意事項有哪些,下面就是實戰案例,一起來看一下。之前開發一個后臺管理系統,里面用到了Vue和Element-UI這個組件庫,遇到一個挺有意思的問題,和大家分享一下。場景是這樣,在一個列表展示頁上,
        推薦度:
        標簽: VUE 使用vue sortable
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 成人无码a级毛片免费| 免费一级毛片在线播放放视频| 免费污视频在线观看| 亚洲色自偷自拍另类小说| 精选影视免费在线 | 亚洲日韩精品无码专区网址| 花蝴蝶免费视频在线观看高清版 | igao激情在线视频免费| 亚洲国产精品丝袜在线观看| 人妻免费久久久久久久了| 国产成人亚洲精品91专区手机| 插鸡网站在线播放免费观看| 亚洲福利在线视频| 久久精品国产免费观看| 亚洲欧美综合精品成人导航| 免费在线观看黄网| 91精品成人免费国产| 亚洲精品网站在线观看你懂的| 免费中文熟妇在线影片| 美女羞羞视频免费网站| 亚洲国产精品一区二区成人片国内| 污视频在线免费观看| 亚洲色在线无码国产精品不卡| 亚洲Av无码乱码在线znlu| 青青操免费在线视频| 亚洲乱码一区av春药高潮| 国产成人青青热久免费精品| 精精国产www视频在线观看免费| 亚洲免费视频在线观看| 大学生美女毛片免费视频| 久久成人永久免费播放| 亚洲欧洲日本国产| 亚洲AV蜜桃永久无码精品| 一级毛片在线免费观看| 小说区亚洲自拍另类| 久久精品国产亚洲av麻豆色欲| 日本免费人成黄页网观看视频| 九九精品成人免费国产片| 亚洲爆乳少妇无码激情| 亚洲AV无码成人网站久久精品大| 成人毛片手机版免费看|