在 Vuetify 中拖动列 v-data-table

Dragging columns in a Vuetify v-data-table

我想在 v-data-table 中按 headers 拖动列。我已经使用 directives/sortablejs 走了很远,但我无法弄清楚以下内容:

任何 help/insight 将不胜感激!

我在以下位置有此设置的代码笔: https://codepen.io/uglyhobbitfeet/pen/NWWKVza

代码笔最重要的部分是:

<v-data-table v-sortable-table

directives: {
  'sortable-table': {
    ...
  }
}

我通过在 data-table 上使用键和自定义 onEnd 方法走了一条略有不同的路线。工作代码在这里:

https://codepen.io/uglyhobbitfeet/pen/ExxaNGO

<v-data-table :headers="headers" :items="desserts"
  sort-by="calories" 
  v-sortable-table="{onEnd:sortTheHeadersAndUpdateTheKey}"
  :key="anIncreasingNumber" >

我将 ekjcfn3902039 的实现的核心细节放在这里,这样您就不必对伟大的 Pen 中发生的所有其他事情进行分类。全部归功于 him/her.

  1. 将 SortableJS 添加到您的项目中(通过 CDN 或通过 NMP 安装由您决定。)
  2. 将 SortableJS 导入您的 .Vue 文件。
  3. 把这个功能加到你的上面<script>区:
    function watchClass(targetNode, classToWatch) {
      let lastClassState = targetNode.classList.contains(classToWatch);
      const observer = new MutationObserver((mutationsList) => {
        for (let i = 0; i < mutationsList.length; i++) {
          const mutation = mutationsList[i];
          if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
            const currentClassState = mutation.target.classList.contains(classToWatch);
            if (lastClassState !== currentClassState) {
              lastClassState = currentClassState;
              if (!currentClassState) {
                mutation.target.classList.add('sortHandle');
              }
            }
          }
        }
      });
      observer.observe(targetNode, { attributes: true });
    }
  1. 将这些道具添加到您的 v-data-table def:
    v-sortable-table="{onEnd:sortTheHeadersAndUpdateTheKey}"
    :key="anIncreasingNumber"
  1. 添加此数据变量:anIncreasingNumber: 1,
  2. 添加以下方法并将 this.tableHeaders 更改为您的 headers object:
    sortTheHeadersAndUpdateTheKey(evt) {
      const headersTmp = this.tableHeaders;
      const oldIndex = evt.oldIndex;
      const newIndex = evt.newIndex;
      if (newIndex >= headersTmp.length) {
        let k = newIndex - headersTmp.length + 1;
        while (k--) {
          headersTmp.push(undefined);
        }
      }
      headersTmp.splice(newIndex, 0, headersTmp.splice(oldIndex, 1)[0]);
      this.table = headersTmp;
      this.anIncreasingNumber += 1;
    }
  1. 添加此指令:
    directives: {
    'sortable-table': {
      inserted: (el, binding) => {
        el.querySelectorAll('th').forEach((draggableEl) => {
          // Need a class watcher because sorting v-data-table rows asc/desc removes the sortHandle class
          watchClass(draggableEl, 'sortHandle');
          draggableEl.classList.add('sortHandle');
        });
        Sortable.create(el.querySelector('tr'), binding.value ? { ...binding.value, handle: '.sortHandle' } : {});
      },
    },
  }

我在这支笔中将其浓缩到最低限度:https://codepen.io/bradlymathews/pen/QWyXpZv?editors=1010