欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue3中使用vuedraggable實(shí)現(xiàn)拖拽el-tree數(shù)據(jù)分組功能

 更新時(shí)間:2024年02月23日 16:06:41   作者:suoh's Blog  
這篇文章主要介紹了vue3中使用vuedraggable實(shí)現(xiàn)拖拽el-tree數(shù)據(jù)分組功能,可以實(shí)現(xiàn)單個(gè)拖拽、雙擊添加、按住ctrl鍵實(shí)現(xiàn)多個(gè)添加,或者按住shift鍵實(shí)現(xiàn)范圍添加,添加到框中的數(shù)據(jù),還能拖拽排序,需要的朋友可以參考下

看效果:

        可以實(shí)現(xiàn)單個(gè)拖拽、雙擊添加、按住ctrl鍵實(shí)現(xiàn)多個(gè)添加,或者按住shift鍵實(shí)現(xiàn)范圍添加,添加到框中的數(shù)據(jù),還能拖拽排序

先安裝 vuedraggable 

這是他的官網(wǎng) vue.draggable中文文檔 - itxst.com

npm i vuedraggable -S

 直接粘貼代碼即可: 

index.vue 

<template>
  <div class="w-full h-full">
    <!-- 頁(yè)面拖拽組件 -->
    <div class="leftPart">
      <ElTree
        class="w100%"
        :data="$.treeData"
        ref="treeTableListRef"
        :props="$.defaultProps"
        highlight-current
        :expand-on-click-node="false"
        key="id"
        :default-expand-all="true"
        @node-click="(data, node) => $.tableFieldsNodeClick(data, node, treeTableListRef)"
      >
        <template #default="{ data }">
          <Draggable
            :list="[data]"
            ghost-class="ghost"
            chosen-class="chosenClass"
            animation="300"
            @start="onStart"
            @end="onEnd"
            group="group1"
            v-tooltip="`Tips:按住Ctrl或Shift進(jìn)行批量選擇`"
          >
            <template #item="{ element }">
              <div @dblclick="dbAddData(element)" style="user-select: none" class="item">
                {{ element.name }}
              </div>
            </template>
          </Draggable>
        </template>
      </ElTree>
    </div>
    <!-- 右側(cè)內(nèi)容 -->
    <div class="rightPart">
      <div class="flex">
        <div
          @mouseover="divMouseOver"
          @mouseleave="divMouselease"
          class="w-full rightContent"
          style="border: 1px solid #ccc"
        >
          <Draggable
            :list="state.list"
            ghost-class="ghost"
            group="group1"
            chosen-class="chosenClass"
            animation="300"
            @start="onStart"
            @end="onEnd"
            @add="addData"
            class="w-full dragArea"
          >
            <template #item="{ element }">
              <div class="item">
                {{ element.name }}
              </div>
            </template>
          </Draggable>
        </div>
      </div>
    </div>
  </div>
</template>
<script setup lang="ts">
import Draggable from "vuedraggable";
import { useData } from "./hooks/drag";
const treeTableListRef = ref();
let { $data: $ } = useData();
const state = reactive<any>({
  //需要拖拽的數(shù)據(jù),拖拽后數(shù)據(jù)的順序也會(huì)變化
  list: [],
});
//拖拽開(kāi)始的事件
const onStart = () => {
  console.log("開(kāi)始拖拽");
};
const divMouseOver = (e: any) => {};
const divMouselease = (e: any) => {};
//拖拽結(jié)束的事件
const onEnd = () => {
  console.log("結(jié)束拖拽");
};
// 雙擊添加
const dbAddData = (data: any) => {
  let i = state.list.findIndex((a: any) => a.id == data.id);
  if (data.children) return; //父級(jí)節(jié)點(diǎn)不添加
  if (i == -1) state.list.push(data);
};
// 批量添加
const addData = () => {
  // 拿到所有nodes節(jié)點(diǎn)數(shù)組
  const nodes = treeTableListRef.value.store._getAllNodes();
  nodes.map((a: any) => {
    if ($.selectNodes.includes(a.id)) {
      state.list.push(a.data);
    }
    // 排除父級(jí),只添加子級(jí)
    state.list = state.list.filter((a: any) => !a.children);
    // 去重
    state.list = [...new Set(state.list)];
  });
};
onMounted(() => {});
onBeforeMount(() => {
  window.addEventListener("keydown", handleKeyDown);
  window.addEventListener("keyup", handleKeyUp);
});
// 按下為true
const handleKeyDown = (event: any) => {
  // 代表按下的是ctrl鍵
  if (event.key == "Control") {
    $.ctrlKeyPressed = true;
  }
  // 代表按下的是shift鍵
  if (event.key == "Shift") {
    $.shiftKeyPressed = true;
  }
};
// 釋放為false
const handleKeyUp = (event: any) => {
  // 代表按下的是ctrl鍵
  if (event.key == "Control") {
    $.ctrlKeyPressed = false;
  }
  // 代表按下的是shift鍵
  if (event.key == "Shift") {
    $.shiftKeyPressed = false;
  }
};
</script>
<style scoped lang="scss">
.leftPart {
  width: 20%;
  height: 100%;
  float: left;
  border-right: 1px dashed #ccc;
}
.rightPart {
  padding: 20px;
  width: 60%;
  height: 100%;
  float: left;
}
.list_drap {
  min-width: 120px;
  max-height: 86px;
  min-height: 22px;
  overflow-y: auto;
  height: auto;
}
.rightContent {
  border-radius: 4px;
  min-height: 30px;
  display: flex;
}
.dragArea {
  padding: 10px 5px;
  flex-grow: 1;
  .item {
    float: left;
    min-width: 50px;
    display: inline;
    margin: 0 3px 2px 3px;
    background-color: rgb(235, 241, 255);
    color: #3370ff;
    font-size: 12px;
    cursor: all-scroll;
    user-select: none;
    height: 20px;
    line-height: 20px;
    padding-left: 9px;
    padding-right: 9px;
    background: #ececfd;
    color: #333333;
    font-size: 12px;
  }
}
</style>

drag.ts

export function useData() {
  const $data: any = reactive({
    ctrlKeyPressed: false,
    shiftKeyPressed: false,
    shiftKeyFelid: [],
    defaultProps: {
      children: "children",
      label: "name",
    },
    treeData: [
      {
        name: "一級(jí)1",
        id: 1,
        children: [
          {
            name: "二級(jí)1",
            id: 2,
            children: [
              {
                name: "三級(jí)1",
                id: 2,
              },
              {
                name: "三級(jí)2",
                id: 4,
              },
              {
                name: "三級(jí)3",
                id: 5,
              },
              {
                name: "三級(jí)4",
                id: 6,
              },
              {
                name: "三級(jí)5",
                id: 7,
              },
            ],
          },
          {
            name: "二級(jí)2",
            id: 8,
          },
          {
            name: "二級(jí)3",
            id: 9,
          },
          {
            name: "二級(jí)4",
            id: 10,
          },
          {
            name: "二級(jí)5",
            id: 11,
          },
        ],
      },
      {
        name: "一級(jí)2",
        id: 12,
        children: [
          {
            name: "二級(jí)1",
            id: 13,
          },
          {
            name: "二級(jí)2",
            id: 14,
          },
          {
            name: "二級(jí)3",
            id: 15,
          },
          {
            name: "二級(jí)4",
            id: 16,
          },
          {
            name: "二級(jí)5",
            id: 17,
          },
        ],
      },
    ],
    selectNodes: [],
    treeTableListRef: null,
  });
  // 節(jié)點(diǎn)選中事件
  $data.tableFieldsNodeClick = (nodeData: any, node: any, treeTableListRef: any) => {
    const nodes = treeTableListRef.store._getAllNodes(); //所有node節(jié)點(diǎn)
    const ishas = $data.selectNodes.includes(node.id);
    // 遞歸遍歷節(jié)點(diǎn)數(shù)組進(jìn)行ID存放
    function addSelectId(arr: any) {
      for (const item of arr) {
        $data.selectNodes.push(item.id);
        if (Array.isArray(item.childNodes) && item.childNodes.length) {
          addSelectId(item.childNodes);
        }
      }
    }
    // 遞歸遍歷刪除節(jié)點(diǎn)id
    function delSelectId(arr: any) {
      for (const item of arr) {
        const index = $data.selectNodes.findIndex((x: any) => x == item.id);
        $data.selectNodes.splice(index, 1);
        if (Array.isArray(item.children) && item.children.length) {
          delSelectId(item.children);
        }
      }
    }
    // 按住了ctrl鍵,可以進(jìn)行單個(gè)多選
    if ($data.ctrlKeyPressed) {
      // 如果為true代表當(dāng)前選中的節(jié)點(diǎn)已存在
      if (ishas) {
        // 查找當(dāng)前選中的節(jié)點(diǎn)的索引
        const index = $data.selectNodes.findIndex((x: any) => x == node.id);
        // 刪除父節(jié)點(diǎn)
        $data.selectNodes.splice(index, 1);
        // 刪除子節(jié)點(diǎn)
        if (Array.isArray(node.childNodes) && node.childNodes.length) {
          delSelectId(node.childNodes);
        }
      } else {
        // 否則當(dāng)前選中的節(jié)點(diǎn)不存在,就加入到已選節(jié)點(diǎn)數(shù)組序列
        $data.selectNodes.push(node.id);
        // 防止選中的是父節(jié)點(diǎn),就需要遞歸將子節(jié)點(diǎn)加入
        if (Array.isArray(node.childNodes) && node.childNodes.length) {
          addSelectId(node.childNodes);
        }
      }
      node.isCurrent = !node.isCurrent;
      // 按下了shift鍵,可以進(jìn)行范圍多選
    } else if ($data.shiftKeyPressed) {
      // 先清空
      $data.selectNodes = [];
      // 將當(dāng)前節(jié)點(diǎn)放入
      $data.selectNodes.push(node.id);
      $data.shiftKeyFelid.push(node.id);
      if ($data.shiftKeyFelid.length > 1) {
        // 首索引
        const sIndex = nodes.findIndex((x: any) => x.id == $data.shiftKeyFelid[0]);
        // 尾索引
        const eIndex = nodes.findIndex((x: any) => x.id == $data.shiftKeyFelid[$data.shiftKeyFelid.length - 1]);
        // 根據(jù)首尾索引,存入中間節(jié)點(diǎn)
        const s = sIndex < eIndex ? sIndex : eIndex; //取小值當(dāng)開(kāi)頭索引
        const e = sIndex < eIndex ? eIndex : sIndex; //取大值當(dāng)結(jié)尾索引
        for (let i = s; i < e; i++) {
          $data.selectNodes.push(nodes[i].id);
        }
      }
    } else {
      // 否則就是單機(jī)選擇
      $data.shiftKeyFelid = [];
      $data.selectNodes = [];
      $data.selectNodes = [node.id];
    }
    // 下面是對(duì)已選中的節(jié)點(diǎn),進(jìn)行高亮展示
    // 通過(guò)控制elementui中節(jié)點(diǎn)上的isCurrent屬性
    // isCurrent為true是高亮,否則取消高亮
    for (const item of nodes) {
      if ($data.selectNodes.includes(item.id)) {
        item.isCurrent = true;
      } else {
        item.isCurrent = false;
      }
    }
  };
  return {
    $data: $data,
  };
}

到此這篇關(guān)于vue3中使用vuedraggable實(shí)現(xiàn)拖拽el-tree數(shù)據(jù)進(jìn)分組的文章就介紹到這了,更多相關(guān)vue draggable拖拽分組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue項(xiàng)目結(jié)構(gòu)目錄超詳細(xì)介紹

    vue項(xiàng)目結(jié)構(gòu)目錄超詳細(xì)介紹

    這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目結(jié)構(gòu)目錄超詳細(xì)介紹的相關(guān)資料,Vue項(xiàng)目目錄結(jié)構(gòu)是指在開(kāi)發(fā)Vue項(xiàng)目時(shí),為了更好地組織和管理代碼,將不同的文件按照一定的規(guī)則和層次結(jié)構(gòu)進(jìn)行分類(lèi)和存放的方式,需要的朋友可以參考下
    2023-12-12
  • 使用idea創(chuàng)建第一個(gè)Vue項(xiàng)目

    使用idea創(chuàng)建第一個(gè)Vue項(xiàng)目

    最近在學(xué)習(xí)vue,本文主要介紹了使用idea創(chuàng)建第一個(gè)Vue項(xiàng)目,文中根據(jù)圖文介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 詳解Vue如何實(shí)現(xiàn)顏色選擇與調(diào)色板功能

    詳解Vue如何實(shí)現(xiàn)顏色選擇與調(diào)色板功能

    顏色選擇和調(diào)色板是Web開(kāi)發(fā)中常用的功能,Vue作為一個(gè)流行的JavaScript框架,可以方便地實(shí)現(xiàn)顏色選擇和調(diào)色板功能,本文講講如何在Vue中進(jìn)行顏色選擇和調(diào)色板吧
    2023-06-06
  • Element-Plus實(shí)現(xiàn)動(dòng)態(tài)渲染圖標(biāo)的示例代碼

    Element-Plus實(shí)現(xiàn)動(dòng)態(tài)渲染圖標(biāo)的示例代碼

    在Element-Plus中,我們可以使用component標(biāo)簽來(lái)動(dòng)態(tài)渲染組件,本文主要介紹了Element-Plus?實(shí)現(xiàn)動(dòng)態(tài)渲染圖標(biāo)教程,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • vue-router3.0版本中 router.push 不能刷新頁(yè)面的問(wèn)題

    vue-router3.0版本中 router.push 不能刷新頁(yè)面的問(wèn)題

    這篇文章主要介紹了vue-router3.0版本中 router.push 不能刷新頁(yè)面的問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • elementui導(dǎo)出數(shù)據(jù)為xlsx、excel表格

    elementui導(dǎo)出數(shù)據(jù)為xlsx、excel表格

    本文主要介紹了elementui導(dǎo)出數(shù)據(jù)為xlsx、excel表格,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • vue路由切換之淡入淡出的簡(jiǎn)單實(shí)現(xiàn)

    vue路由切換之淡入淡出的簡(jiǎn)單實(shí)現(xiàn)

    今天小編就為大家分享一篇vue路由切換之淡入淡出的簡(jiǎn)單實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-10-10
  • Vue實(shí)現(xiàn)滑動(dòng)驗(yàn)證功能

    Vue實(shí)現(xiàn)滑動(dòng)驗(yàn)證功能

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)滑動(dòng)驗(yàn)證功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Vue組件間傳值的實(shí)現(xiàn)解析

    Vue組件間傳值的實(shí)現(xiàn)解析

    組件是?vue.js?最強(qiáng)大的功能之一,而組件實(shí)例的作用域是相互獨(dú)立的,這就意味著不同組件之間的數(shù)據(jù)無(wú)法相互引用,這篇文章主要介紹了Vue組件間傳值的實(shí)現(xiàn)
    2022-09-09
  • Vue?cli3?chainWepack使用方法示例詳解

    Vue?cli3?chainWepack使用方法示例詳解

    這篇文章主要為大家介紹了Vue?cli3?chainWepack使用方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評(píng)論