element tree 上移下移排序

对选中的tree做上下移动操作
需要下标判断当前的位置,用以判断上移下移的显示,和获取上下位置的tree的id

难点:目前不知道当前tree的下标

解决方法:tree有个node,可以获取当前tree所有内容,其中parent.childNodes 可以获取到当前tree的列表,对这个列表循环判断得出下标。

效果:
在这里插入图片描述
在这里插入图片描述
代码片段:

       <el-tree
          :data="data"
          :props="defaultProps"
          node-key="id"
          @node-click="handleNodeClick"
          :expand-on-click-node="false"
          :default-expanded-keys="selectArr"
          :show-close="false"
          ref="tree"
          @node-expand="statusData.actived=false"
          @node-collapse="statusData.actived=false"
        >
          <span class="custom-tree-node" slot-scope="{ node, data }" @click="act(data,node)">
            <span>{{ node.label }}</span>
            <span class="gc-fl-right iconBlock">
              <i
                class="el-icon-more icon"
                :class="(statusData.pid==data.id&&statusData.actived)?'select':''"
                @click.stop="editDialog(data)"
              ></i>
              <div class="editlayer" v-if="statusData.pid==data.id&&statusData.actived">
                <p @click.stop="addsecondary(data.id,data.name)">添加子部门</p>
                <p @click.stop="editmenu(data.id,data.name)">修改名称</p>
                <p @click.stop="del(2,data.id,data.name)">删除</p>
                <p v-if="statusData.treeIndex>0" @click="sort(1,data,node)">上移</p>
                <p
                  v-if="statusData.treeIndex<(statusData.treeLength-1)"
                  @click="sort(2,data,node)"
                >下移</p>
              </div>
            </span>
          </span>
        </el-tree>
data(){
  return{
      statusData: {
        actived: false, //是否显示tree的操作框
        isAdd: 0, //0表格显示 1添加人员显示 2详情显示 3编辑人员显示
        pid: 0, //左侧选中的id
        pName: "", //右侧显示的title
        total: 0, //右侧显示的人员数量,
        treeIndex: 0, //选中tree的id
        treeLength: 0 //选中tree的那层的长度
      },
      selectArr: [],
      data: [], //tree数据
      defaultProps: {
        children: "child",
        label: "name"
      },
  }
},
methods: {
 //切换选项,右侧表格内容更新
    act(data, node) {
      this.statusData.pid = data.id;
      this.statusData.pName = data.name;
      this.statusData.actived = false;
      this.statusData.isAdd = 0;
      let parentList = node.parent.childNodes;
      let index = "";
      parentList.forEach((item, indexs) => {
        if (item.key == data.id) {
          index = indexs;
        }
      });
      this.statusData.treeIndex = index; //下标
      this.statusData.treeLength = parentList.length;
    },
    
   sort(type, data, node) {
      let index = this.statusData.treeIndex;
      let parentList = node.parent.childNodes;
      let config = {
        current_id: data.id
      };
      if (type == 1) {
        config.exchange_id = parentList[index - 1].key; //上移
      } else {
        config.exchange_id = parentList[index + 1].key; //下移
      }
      httpApi
        .sortDepartment(config)
        .then(res => {
          if (res.code == "200") {
            this.$message({
              type: "success",
              message: res.msg
            });
            this.leftData(data.id);
            this.statusData.actived = false;
          } else {
            this.$message({
              type: "warning",
              message: res.msg
            });
          }
        })
        .catch(err => {
          this.$message({
            type: "warning",
            message: res.msg
          });
        });
    },

}
.el-tree {
      width: 250px;
      > .el-tree-node {
        > .el-tree-node__content {
          .custom-tree-node {
            span {
              font-weight: 500;
            }
          }
        }
      }
      .el-tree-node__expand-icon.el-icon-caret-right::before {
        font-size: 16px;
        color: #999999;
      }
      .is-leaf.el-tree-node__expand-icon.el-icon-caret-right::before {
        display: none;
      }
      .el-tree-node__content {
        height: 38px;
        line-height: 38px;
        padding-right: 10px;
        .custom-tree-node {
          width: 100%;
          height: 38px;
          line-height: 38px;
        }
      }
      .el-tree-node__content:hover {
        background-color: #fff;
      }
      .iconBlock {
        width: 20px;
        height: 100%;
        padding-top: 14px;
        .icon {
          display: none;
          transform: rotate(90deg);
        }
        .icon.select {
          color: #61c5c1;
        }
      }

      .el-tree-node > .el-tree-node__children {
        overflow: initial;
      }
      .is-current > .el-tree-node__content {
        height: 38px;
        line-height: 38px;
        background: #f4f7f6;
        border-radius: 4px;
        position: relative;
        .icon {
          display: block;
        }
        .editlayer {
          position: absolute;
          width: 110px;
          background: rgba(255, 255, 255, 1);
          border-radius: 4px;
          box-shadow: 0px 2px 12px 0px rgba(0, 0, 0, 0.15);
          right: -105px;
          top: 0px;
          color: #333333;
          z-index: 1000;
          padding: 10px;
          text-align: center;
          p {
            height: 34px;
            line-height: 34px;
          }
          p:hover {
            background: #f4f7f6;
            border-radius: 4px;
          }
        }

        .icon:hover + .editlayer {
          display: block;
          cursor: pointer;
        }
        .editlayer:hover {
          display: block;
          cursor: pointer;
          z-index: 1000;
        }
      }
    }
  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值