vue 中 element-ui Tree树形控件的拖动排序

2020-09-06  本文已影响0人  lazy_tomato

START

一.整理需求

二.写个demo玩一玩?

1.我的树状图数据 (其实就是微信官方给的测试数据)

{
      menu: {
        button: [
          {
            type: "click",
            name: "今日歌曲",
            key: "V1001_TODAY_MUSIC",
            sub_button: [
              {
                type: "view",
                name: "难忘今宵",
                url: "http://www.baidu.com/",
                sub_button: [],
              },
            ],
          },
          {
            type: "click",
            name: "歌手简介",
            key: "V1001_TODAY_SINGER",
            sub_button: [
              {
                type: "view",
                name: "张宇",
                url: "http://www.soso.com/",
                sub_button: [],
              },
              {
                type: "view",
                name: "林俊杰",
                url: "http://v.qq.com/",
                sub_button: [],
              },
            ],
          },
          {
            name: "菜单",
            sub_button: [
              {
                type: "view",
                name: "搜索",
                url: "http://www.soso.com/",
                sub_button: [],
              },
              {
                type: "view",
                name: "视频",
                url: "http://v.qq.com/",
                sub_button: [],
              },
              {
                type: "click",
                name: "赞一下我们",
                key: "V1001_GOOD",
                sub_button: [],
              },
              {
                type: "miniprogram",
                name: "wxa",
                url: "http://mp.weixin.qq.com",
                appid: "wx286b93c14bbf93aa",
                pagepath: "pages/lunar/index",
              },
            ],
          },
        ],
      },
    };

2.开始写树状图 (官网拖动的案例)

<template>
  <div>
    <el-tree
      :data="data"
      node-key="id"
      default-expand-all
      @node-drag-start="handleDragStart"
      @node-drag-enter="handleDragEnter"
      @node-drag-leave="handleDragLeave"
      @node-drag-over="handleDragOver"
      @node-drag-end="handleDragEnd"
      @node-drop="handleDrop"
      draggable
      :allow-drop="allowDrop"
      :allow-drag="allowDrag"
    ></el-tree>
  </div>
</template>
<script>
export default {
  data() {
    return {
      data: [
        {
          id: 1,
          label: "一级 1",
          children: [
            {
              id: 4,
              label: "二级 1-1",
              children: [
                {
                  id: 9,
                  label: "三级 1-1-1",
                },
                {
                  id: 10,
                  label: "三级 1-1-2",
                },
              ],
            },
          ],
        },
        {
          id: 2,
          label: "一级 2",
          children: [
            {
              id: 5,
              label: "二级 2-1",
            },
            {
              id: 6,
              label: "二级 2-2",
            },
          ],
        },
        {
          id: 3,
          label: "一级 3",
          children: [
            {
              id: 7,
              label: "二级 3-1",
            },
            {
              id: 8,
              label: "二级 3-2",
              children: [
                {
                  id: 11,
                  label: "三级 3-2-1",
                },
                {
                  id: 12,
                  label: "三级 3-2-2",
                },
                {
                  id: 13,
                  label: "三级 3-2-3",
                },
              ],
            },
          ],
        },
      ],
      defaultProps: {
        children: "children",
        label: "label",
      },
    };
  },
  methods: {
    handleDragStart(node, ev) {
      console.log("drag start", node);
    },
    handleDragEnter(draggingNode, dropNode, ev) {
      console.log("tree drag enter: ", dropNode.label);
    },
    handleDragLeave(draggingNode, dropNode, ev) {
      console.log("tree drag leave: ", dropNode.label);
    },
    handleDragOver(draggingNode, dropNode, ev) {
      console.log("tree drag over: ", dropNode.label);
    },
    handleDragEnd(draggingNode, dropNode, dropType, ev) {
      console.log("tree drag end: ", dropNode && dropNode.label, dropType);
    },
    handleDrop(draggingNode, dropNode, dropType, ev) {
      console.log("tree drop: ", dropNode.label, dropType);
    },
    allowDrop(draggingNode, dropNode, type) {
      if (dropNode.data.label === "二级 3-1") {
        return type !== "inner";
      } else {
        return true;
      }
    },
    allowDrag(draggingNode) {
      return draggingNode.data.label.indexOf("三级 3-2-2") === -1;
    },
  },
};
</script>

3.因为官网的数据结构和我们的数据接口有些不一样,所以我们稍加修改一下

<template>
  <div>
    <el-tree
      :data="data.menu.button"
      :props="defaultProps"
      node-key="id"
      default-expand-all
      @node-drag-start="handleDragStart"
      @node-drag-enter="handleDragEnter"
      @node-drag-leave="handleDragLeave"
      @node-drag-over="handleDragOver"
      @node-drag-end="handleDragEnd"
      @node-drop="handleDrop"
      draggable
    ></el-tree>

    <!-- 上面注释掉的属性
     :allow-drop="allowDrop"
      :allow-drag="allowDrag"
    -->
  </div>
</template>
<script>
export default {
  data() {
    return {
      // 修改一下数据,让数据符合我们的要求
      data: {
        menu: {
          button: [
            {
              type: "click",
              name: "今日歌曲",
              key: "V1001_TODAY_MUSIC",
              sub_button: [
                {
                  type: "view",
                  name: "难忘今宵",
                  url: "http://www.baidu.com/",
                  sub_button: [],
                },
              ],
            },
            {
              type: "click",
              name: "歌手简介",
              key: "V1001_TODAY_SINGER",
              sub_button: [
                {
                  type: "view",
                  name: "张宇",
                  url: "http://www.soso.com/",
                  sub_button: [],
                },
                {
                  type: "view",
                  name: "林俊杰",
                  url: "http://v.qq.com/",
                  sub_button: [],
                },
              ],
            },
            {
              name: "菜单",
              sub_button: [
                {
                  type: "view",
                  name: "搜索",
                  url: "http://www.soso.com/",
                  sub_button: [],
                },
                {
                  type: "view",
                  name: "视频",
                  url: "http://v.qq.com/",
                  sub_button: [],
                },
                {
                  type: "click",
                  name: "赞一下我们",
                  key: "V1001_GOOD",
                  sub_button: [],
                },
                {
                  type: "miniprogram",
                  name: "wxa",
                  url: "http://mp.weixin.qq.com",
                  appid: "wx286b93c14bbf93aa",
                  pagepath: "pages/lunar/index",
                },
              ],
            },
          ],
        },
      },
      //   修改一下啊显示规则,
      //   1.label(显示的文字)对应 我们数据中的name
      // 2.children(下级菜单名)对应 我们数据中的sub_button
      defaultProps: {
        children: "sub_button",
        label: "name",
      },
    };
  },

  methods: {
    handleDragStart(node, ev) {
      console.log("drag start", node);
    },
    handleDragEnter(draggingNode, dropNode, ev) {
      console.log("tree drag enter: ", dropNode.label);
    },
    handleDragLeave(draggingNode, dropNode, ev) {
      console.log("tree drag leave: ", dropNode.label);
    },
    handleDragOver(draggingNode, dropNode, ev) {
      console.log("tree drag over: ", dropNode.label);
    },
    handleDragEnd(draggingNode, dropNode, dropType, ev) {
      console.log("tree drag end: ", dropNode && dropNode.label, dropType);
    },
    handleDrop(draggingNode, dropNode, dropType, ev) {
      console.log("tree drop: ", dropNode.label, dropType);
    },

    // 这个地方就是拖动的限制条件 ,暂时注释掉

    // allowDrop(draggingNode, dropNode, type) {
    //   if (dropNode.data.label === "二级 3-1") {
    //     return type !== "inner";
    //   } else {
    //     return true;
    //   }
    // },
    // allowDrag(draggingNode) {
    //   return draggingNode.data.label.indexOf("") === -1;
    // },
  },
};
</script>

三.给拖动的树状图,进行限制

END

上一篇 下一篇

猜你喜欢

热点阅读