zoukankan      html  css  js  c++  java
  • 谷粒商城学习——P54商品服务-API-三级分类-修改-拖拽效果

    本节讲述了elementui tree 可拖拽节点的使用

    通过 draggable 属性可让节点变为可拖拽。

    allow-drop判定目标节点能否被放置。allow-drop是個函数类型的属性

    Function(draggingNode, dropNode, type)
    draggingNode当前拖动的节点

    dropNode要拖动到哪个节点
    type 参数有三种情况:'prev'、'inner' 和 'next',分别表示放置在目标节点前、插入至目标节点和放置在目标节点后

    本节源码:测试拖动发现有点小bug,估计原视频也有,不是大问题,学习为主就不纠结了
    <template>
      <div>
        <el-tree
          :data="menus"
          :props="defaultProps"
          show-checkbox=""
          node-key="catId"
          :expand-on-click-node="false"
          :default-expanded-keys="expandedkey"
          draggable
          :allow-drop="allowDrop"
        >
          <span class="custom-tree-node" slot-scope="{ node, data }">
            <span>{{ node.label }}</span>
            <span>
              <el-button
                v-if="node.level <= 2"
                type="text"
                size="mini"
                @click="() => append(data)"
              >
                Append
              </el-button>
              <el-button
                v-if="node.level <= 2"
                type="text"
                size="mini"
                @click="() => edit(data)"
              >
                edit
              </el-button>
              <el-button
                v-if="node.childNodes.length == 0"
                type="text"
                size="mini"
                @click="() => remove(node, data)"
              >
                Delete
              </el-button>
            </span>
          </span>
        </el-tree>
        <el-dialog
          :title="title"
          :visible.sync="dialogVisible"
          width="30%"
          :close-on-click-modal="false"
        >
          <el-form :model="category">
            <el-form-item label="分類名称">
              <el-input v-model="category.name" autocomplete="off"></el-input>
            </el-form-item>
          </el-form>
          <el-form :model="category">
            <el-form-item label="圖標">
              <el-input v-model="category.icon" autocomplete="off"></el-input>
            </el-form-item>
          </el-form>
          <el-form :model="category">
            <el-form-item label="計量單位">
              <el-input
                v-model="category.productUnit"
                autocomplete="off"
              ></el-input>
            </el-form-item>
          </el-form>
          <span slot="footer" class="dialog-footer">
            <el-button @click="dialogVisible = false">取 消</el-button>
            <el-button type="primary" @click="submitData">确 定</el-button>
          </span>
        </el-dialog>
      </div>
    </template>
    
    <script>
    //这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
    //例如:import 《组件名称》 from '《组件路径》';
    
    export default {
      data() {
        return {
          maxLevel: 0,
          title: "",
          dialogType: "",
          category: {
            name: "",
            parentCid: 0,
            catLevel: 0,
            showStatus: 1,
            sort: 0,
            catId: null,
            icon: "",
            productUnit: "",
          },
          dialogVisible: false,
          expandedkey: [],
          menus: [],
          defaultProps: {
            children: "children",
            label: "name",
          },
        };
      },
      created() {
        console.log(this.expandedkey);
        this.getMenus();
      },
      methods: {
        allowDrop(draggingNode, dropNode, type) {
          //1、被拖动的当前节点以及所在的父节点总层数不能大于3
          console.log("allowDrop:", draggingNode, dropNode, type);
          this.countNodeLevel(draggingNode);
          //当前正在拖动的节点+父节点所在的深度不大于3即可
          let deep = Math.abs(this.maxLevel - draggingNode.level) + 1;
          console.log("深度:", deep);
          if (type == "inner") {
            return deep + dropNode.level <= 3;
          } else {
            return deep + dropNode.parent.level <= 3;
          }
        },
        countNodeLevel(node) {
          //找到所有子节点,求出最大深度
          if (node.childNodes != null && node.childNodes.length > 0) {
            for (let i = 0; i < node.childNodes.length; i++) {
              if (node.childNodes[i].level > this.maxLevel) {
                this.maxLevel = node.childNodes[i].level;
              }
              this.countNodeLevel(node.childNodes[i]);
            }
          }
        },
        submitData() {
          if (this.dialogType == "add") {
            this.addCategory();
          } else if (this.dialogType == "edit") {
            this.editCategory();
          }
        },
        editCategory() {
          alert(this.dialogType);
          var { catId, name, icon, productUnit } = this.category;
          this.$http({
            url: this.$http.adornUrl("/product/category/update"),
            method: "post",
            data: this.$http.adornData({ catId, name, icon, productUnit }, false),
          }).then(({ data }) => {
            this.$message({
              message: "菜单修改成功",
              type: "success",
            });
            //关闭对话框
            this.dialogVisible = false;
            //刷新出新的菜单
            this.getMenus();
            //设置需要默认展开的菜单
            this.expandedkey = [this.category.parentCid];
          });
        },
        edit(data) {
          console.log(data);
          this.title = "修改分類";
          this.dialogType = "edit";
          this.dialogVisible = true;
    
          //发送请求获取当前节点最新的数据
          this.$http({
            url: this.$http.adornUrl(`/product/category/info/${data.catId}`),
            method: "get",
          }).then(({ data }) => {
            //请求成功
            console.log("要回显的数据", data);
            this.category.name = data.data.name;
            this.category.catId = data.data.catId;
            this.category.icon = data.data.icon;
            this.category.productUnit = data.data.productUnit;
            this.category.parentCid = data.data.parentCid;
            this.category.catLevel = data.data.catLevel;
            this.category.sort = data.data.sort;
            this.category.showStatus = data.data.showStatus;
          });
        },
        addCategory() {
          this.$http({
            url: this.$http.adornUrl("/product/category/save"),
            method: "post",
            data: this.$http.adornData(this.category, false),
          }).then(({ data }) => {
            this.$message({
              message: "菜单保存成功",
              type: "success",
            });
            //关闭对话框
            this.dialogVisible = false;
            //刷新出新的菜单
            this.getMenus();
            //设置需要默认展开的菜单
            this.expandedkey = [this.category.parentCid];
          });
        },
        remove(node, data) {
          let ids = [data.catId];
          console.log(ids);
          console.log(node);
          this.$confirm(`是否删除${data.name}菜单?`, "提示", {
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            type: "warning",
          })
            .then(() => {
              this.$http({
                url: this.$http.adornUrl("/product/category/delete"),
                method: "post",
                data: this.$http.adornData(ids, false),
              }).then(({ data }) => {
                this.$message({
                  message: "菜单删除成功",
                  type: "success",
                });
                this.getMenus();
                console.log(node.parent.data.catId);
                this.expandedkey = [node.parent.data.catId];
              });
            })
            .catch(() => {});
        },
        append(data) {
          this.dialogType = "add";
          this.title = "添加分類";
          this.dialogVisible = true;
          this.category.parentCid = data.catId;
          this.category.catLevel = data.catLevel * 1 + 1;
    
          this.category.catId = null;
          this.category.name = "";
          this.category.icon = "";
          this.category.productUnit = "";
          this.category.sort = 0;
          this.category.showStatus = 1;
        },
    
        getMenus() {
          this.$http({
            url: this.$http.adornUrl("/product/category/list/tree"),
            method: "get",
          }).then(({ data }) => {
            console.log("成功获取菜单", data.data);
            this.menus = data.data;
            console.log("thismenus", this.menus);
          });
        },
      },
    };
    </script>
    <style scoped>
    </style>
    View Code
     
  • 相关阅读:
    设置与获取Cookie
    事件对象详解
    兼容各浏览器的鼠标滚轮事件
    正则对象与正则表达式的基础学习
    Ajax 学习
    禅道使用流程概述
    Fiddler、Maven介绍
    Locust安装教程与使用
    常用工具软件包下载地址
    SVN合并步骤
  • 原文地址:https://www.cnblogs.com/yanan7890/p/14901988.html
Copyright © 2011-2022 走看看