国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于element UI 實現(xiàn) table 列 拖拽

這篇具有很好參考價值的文章主要介紹了基于element UI 實現(xiàn) table 列 拖拽。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

問題描述

在開發(fā)中遇到一個需求,即實現(xiàn)table列的拖拽,但是調(diào)研發(fā)現(xiàn),大部分是基于sorttable.js這個包實現(xiàn)的,但是通過實際應(yīng)用,發(fā)現(xiàn)sorttable.js用在操作element table 組件中并不是很舒服,總會莫名其妙的冒出一些異常bug,于是自行封裝一個table 列拖拽組件。

難點概括

①element table header插槽應(yīng)用

②drag知識點應(yīng)用

③splice()方法理解

演示代碼

<template>
  <div>
    <h1>基于element-ui table列拖拽實現(xiàn)</h1>
    <drag-head :head-columns="tableHead" :data="tableData"></drag-head>
  </div>
</template>
<script>
import DragHead from "./dragHead.vue";

export default {
  name: "DragHeadCase",

  components: { DragHead },

  data() {
    return {
      tableHead: [
        {
          label: "零零",
          prop: "v0",
          width: 150,
        },
        {
          label: "一一",
          prop: "v1",
          width: 150,
        },
        {
          label: "二二",
          prop: "v2",
          width: 150,
        },
        {
          label: "三三",
          prop: "v3",
          width: 150,
        },
        {
          label: "四四",
          prop: "v4",
          width: 300,
        },
        {
          label: "五五",
          prop: "v5",
        },
        {
          label: "六六",
          prop: "v6",
        },
        {
          label: "七七",
          prop: "v7",
        },
        {
          label: "八八",
          prop: "v8",
        },
        {
          label: "九九",
          prop: "v9",
        },
      ],

      tableData: [
        {
          v0: "2016-05-02",
          v1: "王小虎",
          v2: "上海",
          v3: "普陀區(qū)",
          v4: "上海市普陀區(qū)金沙江路 1518 弄",
          v5: 200333,
          v6: "2016-05-02",
          v7: "王小虎",
          v8: "上海",
          v9: "普陀區(qū)",
        },
        {
          v0: "2016-05-02",
          v1: "王小虎",
          v2: "上海",
          v3: "普陀區(qū)",
          v4: "上海市普陀區(qū)金沙江路 1518 弄",
          v5: 200333,
          v6: "2016-05-02",
          v7: "王小虎",
          v8: "上海",
          v9: "普陀區(qū)",
        },
        {
          v0: "2016-05-02",
          v1: "王小虎",
          v2: "上海",
          v3: "普陀區(qū)",
          v4: "上海市普陀區(qū)金沙江路 1518 弄",
          v5: 200333,
          v6: "2016-05-02",
          v7: "王小虎",
          v8: "上海",
          v9: "普陀區(qū)",
        },
        {
          v0: "2016-05-02",
          v1: "王小虎",
          v2: "上海",
          v3: "普陀區(qū)",
          v4: "上海市普陀區(qū)金沙江路 1518 弄",
          v5: 200333,
          v6: "2016-05-02",
          v7: "王小虎",
          v8: "上海",
          v9: "普陀區(qū)",
        },
        {
          v0: "2016-05-02",
          v1: "王小虎",
          v2: "上海",
          v3: "普陀區(qū)",
          v4: "上海市普陀區(qū)金沙江路 1518 弄",
          v5: 200333,
          v6: "2016-05-02",
          v7: "王小虎",
          v8: "上海",
          v9: "普陀區(qū)",
        },
      ],
    };
  },
};
</script>

table 列 拖拽組件實現(xiàn)代碼

<template>
  <div style="width: 1000px">
    <el-table
      ref="elTable"
      border
      style="width: 100%"
      v-bind="$attrs"
      v-on="$listeners"
      :key="headKey"
      :cell-class-name="cellClassName"
      :header-cell-class-name="cellClassName"
    >
      <!-- 循環(huán)表頭 -->
      <template v-for="(col, index) in tableHead">
        <el-table-column
          :key="index"
          :prop="col.prop"
          :align="col.align || 'center'"
          :width="col.width || 100"
        >
          <!-- 通過插槽為表頭綁定mousedown和dragover方法 -->
          <template slot="header" slot-scope="{ column, $index }">
            <span
              @mousedown="handleMounseDown($event, column, $index)"
              @dragover="handleDragover($event, column, $index)"
            >
              {{ col.label }}
            </span>
          </template>
        </el-table-column>
      </template>
    </el-table>
  </div>
</template>

<script>
export default {
  props: {
    headColumns: Array,
  },

  mounted() {
    /** 備用操作(如果需要對headColumns數(shù)組操作) */
    this.tableHead = this.headColumns;
  },

  data() {
    return {
      tableHead: [],

      // 拖拽狀態(tài)
      dragState: {
        start: -3, // 起始元素的 index 防止初始化cellStyle時序號、展開等默認樣式改變,最好小于-3
        end: -3, // 移動鼠標時所覆蓋的元素 index
        dragging: false, // 是否正在拖動
        direction: undefined, // 拖動方向
      },

      headKey: "dragHead", // 表頭數(shù)組變換位置時,重繪table(不更新該值,表頭數(shù)組變化時,頁面不會改變)

      scrollX: 0, // 初始x軸scroll位置(用于定位X軸滾動條)
    };
  },

  methods: {
    /** 鼠標摁下觸發(fā) */
    handleMounseDown(e, column, $index) {
      this.dragState.dragging = true;
      this.dragState.start = parseInt($index - 0);
      // 添加鼠標抬起事件  消除鼠標摁下立刻松開問題
      document.addEventListener("mouseup", this.handleMouseUp);
      // 添加拖拽結(jié)束事件
      document.addEventListener("dragend", this.handleMouseUp);

      // 對選中的表頭允許其拖拽
      const dragclass = ".el-table__header-wrapper ." + column.id;
      const dragDom = document.querySelectorAll(dragclass);
      dragDom.forEach((dom) => {
        // 允許表頭塊可以被拖拽 draggable 屬性 不允許拖拽dragover等相關(guān)拖拽事件無法觸發(fā)
        dom.setAttribute("draggable", true);
      });
    },

    /** 鼠標在拖拽移動時觸發(fā) */
    handleDragover(e, column, $index) {
      if (this.dragState.dragging) {
        // 獲取當前滾動條的位置
        const scrollDom = this.$refs.elTable.bodyWrapper;
        this.scrollX = scrollDom.scrollLeft;
        const index = parseInt($index - 0); // 記錄起始列
        /** 實時更改鼠標處于表頭的位置 */
        if (index - this.dragState.start !== 0) {
          this.dragState.direction =
            index - this.dragState.start < 0 ? "left" : "right"; // 判斷拖動方向
          this.dragState.end = parseInt($index - 0);
        } else {
          this.dragState.end = this.dragState.start;
          this.dragState.direction = null;
        }
      }
    },

    /** 鼠標抬起或拖拽結(jié)束觸發(fā) */
    handleMouseUp() {
      // 更新拖拽后的表頭
      this.headDraged(this.dragState);
      const { end } = this.dragState;
      // 初始化拖動狀態(tài)
      this.dragState = {
        start: end, //記錄最后拖動的位置
        end: -9,
        dragging: false,
        direction: undefined,
      };
      document.removeEventListener("mouseup", this.handleMouseUp);
      document.removeEventListener("dragend", this.handleMouseUp);

      setTimeout(() => {
        // 重置拖拽狀態(tài)
        this.dragState.start = -9;
      }, 500);
    },

    // 更新拖拽后的表頭
    headDraged({ start, end, direction }) {
      if (direction) {
        const originColumn = this.tableHead[start];
        // 有位置交換時,原先位置的元素刪除,再在目標處插入
        this.tableHead.splice(start, 1);
        this.tableHead.splice(end, 0, originColumn);
        this.headKey = new Date().getTime() + ""; // 更新table key值
        this.$nextTick(() => {
          // 因為表頭重繪后滾動條會移到最左端初始位置,因此如果是在中間部分拖拽,還需要把滾動條在定位到該位置
          this.$refs.elTable.bodyWrapper.scrollLeft = this.scrollX;
        });
      }
    },

    // 拖動虛線樣式設(shè)置
    cellClassName({ columnIndex }) {
      const { start, end, direction } = this.dragState;
      const target = columnIndex - 0;
      if (target === start) {
        // 被移動的元素
        return "drag_start";
      } else if (target === end) {
        // 要移動的位置
        return `drag_end_${direction}`;
      }
      return "";
    },
  },
};
</script>

<style lang="scss" scoped>
::v-deep .el-table {
  .drag_start {
    opacity: 0.8;
    background-color: rgba(0, 0, 0, 0.938);
    color: #f3e8e8fd;
    transition: all 0.3s cubic-bezier(0.23, 1, 0.32, 1);
  }
  .drag_end_left {
    border-left: 2px dotted rgba(0, 0, 0, 0.938);
  }
  .drag_end_right {
    border-right: 2px dotted rgba(0, 0, 0, 0.938);
  }
}
</style>

然后我在操作的時候碰到一個報錯

[Violation ] Added non-passive event listener to ascroll- blocking 'mousewheel’event Consider marking event handler as ’ passive’to make the page more responsive. See https: com/feature/574554 3795965952

翻譯:

[沖突]在ascroll中添加了非被動事件偵聽器-阻塞“mousewheel”事件考慮將事件處理程序標記為“passive”,以使頁面更具響應(yīng)性。參見https:com/feature/574554 3795965952

解決辦法:

npm i default-passive-events -S
main.js import 'default-passive-events'

最后

該組件目前僅支持最簡單的拖拽效果,后續(xù)開發(fā)出兼容fixed、checkbox、expand 以及操作列的組件會及時更新文章,有興趣的朋友可以點贊收藏。

參考文獻

基于element UI 實現(xiàn) table 列 拖拽_element table列拖拽_淡然自若_blog的博客-CSDN博客

Added non-passive event listener to ascroll- blocking ‘mousewheel‘event Consider marking event handl_紳士的可怖的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-670786.html

到了這里,關(guān)于基于element UI 實現(xiàn) table 列 拖拽的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • vue element ui table組件列寬可以拖拽調(diào)整大小,某一列可以禁止拖拽調(diào)整大小

    vue element ui table組件列寬可以拖拽調(diào)整大小,某一列可以禁止拖拽調(diào)整大小

    ?只需要在 el-table-column 標簽中添加 :resizable=\\\"false\\\" 即可 ? 參考鏈接: https://chat.xutongbao.top/

    2024年01月21日
    瀏覽(26)
  • 基于element-ui的table實現(xiàn)樹級表格操作及單元格合并

    基于element-ui的table實現(xiàn)樹級表格操作及單元格合并

    如題,公司業(yè)務(wù)需求,數(shù)據(jù)結(jié)構(gòu)比較復(fù)雜,需要在一張表內(nèi)實現(xiàn)多級樹狀數(shù)據(jù)展示及同屬性的單元格合并,并在表格內(nèi)實現(xiàn)增刪改操作。 網(wǎng)上翻閱了很多實例,沒有能解決所有需求的案例,于是自己實現(xiàn)了一套。 時間匆忙,邏輯有優(yōu)化的地方還請無償指出! 最終效果如下

    2024年02月14日
    瀏覽(27)
  • Vue+Element-UI 實現(xiàn)前端分頁功能,利用el-table和el-pagination組件實現(xiàn)表格前端分頁

    Vue+Element-UI 實現(xiàn)前端分頁功能,利用el-table和el-pagination組件實現(xiàn)表格前端分頁

    Vue+Element-UI 實現(xiàn)前端分頁功能,利用el-table和el-pagination組件實現(xiàn)表格前端分頁: ????????當table的數(shù)據(jù)量比較大的時候,一個屏幕展示不出全部的數(shù)據(jù),這個時候就需要分頁顯示。而多數(shù)情況下都是做的后端分頁,就是將分頁參數(shù)和查詢條件一并傳到后端,后端將當前頁要

    2024年01月20日
    瀏覽(31)
  • JavaScript與前端框架Element UI

    一、JavaScript概述 JavaScript(簡稱JS)是一種輕量級、解釋性的、基于對象的腳本語言,用于Web開發(fā)中的客戶端腳本。它是HTML和CSS的一部分,用于在瀏覽器中實現(xiàn)動態(tài)交互。 JavaScript最初由Netscape公司的Brendan Eich于1995年開發(fā),旨在為網(wǎng)頁添加動態(tài)內(nèi)容。不同于編譯型語言如Java和

    2024年04月29日
    瀏覽(21)
  • 基于vue+Element UI的文件上傳(可拖拽上傳)

    基于vue+Element UI的文件上傳(可拖拽上傳)

    drag: 支持拖拽上傳 action:必選參數(shù),上傳的地址 ref:這里主要是用于文件上傳完成后清除文件的 on-remove:文件列表移除文件時的鉤子 auto-upload:是否在選取文件后立即進行上傳 on-change:文件狀態(tài)改變時的鉤子,添加文件、上傳成功和上傳失敗時都會被調(diào)用 注:這里使用的

    2023年04月08日
    瀏覽(30)
  • 基于Element-ui 封裝穿梭框(左側(cè)樹 右側(cè)列表,可全選,列表可拖拽)

    基于Element-ui 封裝穿梭框(左側(cè)樹 右側(cè)列表,可全選,列表可拖拽)

    Element-ui提供的穿梭框只支持列表,根據(jù)實際需求自己寫了一個左邊是樹結(jié)構(gòu),右邊是列表結(jié)構(gòu)的穿梭框,(如果需要兩邊都是樹結(jié)構(gòu)的話,需要把右側(cè)的邏輯參考左側(cè)改一改)拖拽使用了 vuedraggable 插件

    2024年02月11日
    瀏覽(51)
  • vue+element ui實現(xiàn)圖片上傳并拖拽進行圖片排序

    用到的技術(shù)棧: vue2 element Ui vue-dragging 第一步: 安裝 第二步: 引入 Video_23-11-13_10-17-30 end~~~ 如有錯誤或觀點不一致的請評論留言共同討論,本人前端小白一枚,根據(jù)自己實際項目遇到的問題進行總結(jié)分享,謝謝大家的閱讀!

    2024年01月24日
    瀏覽(28)
  • Element Ui Tree組件實現(xiàn)增、刪、改、查、拖拽節(jié)點 的樹形結(jié)構(gòu)

    Element Ui Tree組件實現(xiàn)增、刪、改、查、拖拽節(jié)點 的樹形結(jié)構(gòu)

    介紹:首先組件 | Element官網(wǎng)某些功能都具備了,這里我就把這些功能結(jié)合在一起更完美的使用,其次 編輯節(jié)點 官網(wǎng)是沒有實例,所以這里搞了一套較完整的功能,其次編輯和添加,這里直接使用了彈窗(顧及到多個參數(shù)設(shè)置),接下來效果圖展示! 效果圖如下: 1,其中點

    2024年02月13日
    瀏覽(88)
  • vue 實現(xiàn)element-ui 表格的行拖拽排序 (Sortable)

    Sortable它是一個比較簡單好用的拖拽排序工具 1.首先是安裝下載Sortable (npm install?sortablejs --save) 2.在要進行拖拽的頁面引入Sortable (import Sortable from \\\'sortablejs\\\') 3.寫個方法去處理你需要的數(shù)據(jù),這里需要注意一下需要等待元素渲染完成后再執(zhí)行此方法 ?4.處理好數(shù)據(jù)以后再去

    2024年02月11日
    瀏覽(28)
  • vue+element ui+vuedraggable實現(xiàn)表格內(nèi)不同格子間標簽的拖拽

    vue+element ui+vuedraggable實現(xiàn)表格內(nèi)不同格子間標簽的拖拽

    最近有個需求是實現(xiàn)在表格內(nèi)上下不同格子間標簽的拖拽,然而element ui并沒有提供此類api,后面我導(dǎo)入vuedraggable包實現(xiàn)了此需求,效果見視頻。 demo視頻: element ui表格內(nèi)標簽拖拽demo 首先要去下載vuedraggable包 去package.json文件里看包是否下載成功 下載完成后新建頁面 頁面完整

    2024年04月29日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包