谷粒商城42 - 前端-商品服务-API-三级分类-删除-页面效果

菜单的删除需求分析

需求: 没有子菜单, 并且没有被其他地方引用的菜单, 可以删除.

使用树的两种方式, 可以实现树的删除 .
https://element.eleme.cn/#/zh-CN/component/tree

使用 scoped slot 更加的友好

前端页面

使用elementui的scoped slot ,复制其示例代码到catagory.vue中

并且对methods也进行复制, 在控制台中, 打印看其会传递什么参数

完整代码

<!--  -->
<template>
  <el-tree :data="menus" :props="defaultProps" @node-click="handleNodeClick">
    <!--  
        { node, data } 为解构的方式传递参数
        node 为当前的节点的值,  节点的名称
        data 为节点的数据 

    -->
    <span class="custom-tree-node" slot-scope="{ node, data }">
      <!-- 显示节点的名称  -->
      <span>{{ node.label }}</span>
      <span>
        <!-- 两个按钮    => 箭头函数 调用指定的方法 -->
        <el-button type="text" size="mini" @click="() => append(data)">Append</el-button>
        <el-button type="text" size="mini" @click="() => remove(node, data)">Delete</el-button>
      </span>
    </span>
  </el-tree>
</template>

<script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import 《组件名称》 from '《组件路径》';

export default {
  //import引入的组件需要注入到对象中才能使用
  components: {},

  data() {
    return {
      menus: [],
      defaultProps: {
        children: "children",
        label: "name",
      },
    };
  },
  methods: {
    handleNodeClick(data) {
      console.log(data);
    },
    getMenus() {
      this.$http({
        url: this.$http.adornUrl("/product/category/list/tree"),
        method: "get",
      }).then(({ data }) => {
        console.log("成功获取到菜单数据 .... ", data.data);
        this.menus = data.data;
      });
    },
    append(data) {
      console.log("append " , data);
    },
    remove(node, data) {
      console.log("remove" , node, data);
    }
  }
};
</script>
<style scoped>
</style>

点击某一个delete按钮, 可以看到打印的 node 和data 的数据, 可以看到 node为当前节点相关的信息. 而data为从后端数据库中获取的当前点击的节点信息.

加上 :expand-on-click-node="false" , 使其点击文字的时候,不拖放树形结构. 点击三角形的时候, 才显示或者缩放 .

同时去除其点击函数

对显示的树进行优化

使用vue的v-if 进行条件判断, 对指定条件的,才进行显示.

只有树形的层级是一级或者二级才展示append

只有没有子节点的才显示delele

显示勾选框


给每一行加上key


使用后端传递的唯一id


显示效果如下

完整的代码如下

<!--  -->
<template>
  <el-tree
    :data="menus"
    :props="defaultProps"
    :expand-on-click-node="false"
    show-checkbox
    node-key="catId"
  >
    <!--  
        { node, data } 为解构的方式传递参数
        node 为当前的节点的值,  节点的名称
        data 为节点的数据 

    -->

    <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.childNodes.length ==0"
          type="text"
          size="mini"
          @click="() => remove(node, data)"
        >Delete</el-button>
      </span>
    </span>
  </el-tree>
</template>

<script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import 《组件名称》 from '《组件路径》';

export default {
  //import引入的组件需要注入到对象中才能使用
  components: {},

  data() {
    return {
      menus: [],
      defaultProps: {
        children: "children",
        label: "name",
      },
    };
  },
  methods: {
    getMenus() {
      this.$http({
        url: this.$http.adornUrl("/product/category/list/tree"),
        method: "get",
      }).then(({ data }) => {
        console.log("成功获取到菜单数据 .... ", data.data);
        this.menus = data.data;
      });
    },
    append(data) {
      console.log("append ", data);
    },
    remove(node, data) {
      console.log("remove", node, data);
    },
  },
  //监听属性 类似于data概念
  computed: {},
  //监控data中的数据变化
  watch: {},
  //方法集合
  //生命周期 - 创建完成(可以访问当前this实例)  组件创建完成就发送请求
  created() {
    this.getMenus();
  },
  //生命周期 - 挂载完成(可以访问DOM元素)
  mounted() {},
  beforeCreate() {}, //生命周期 - 创建之前
  beforeMount() {}, //生命周期 - 挂载之前
  beforeUpdate() {}, //生命周期 - 更新之前
  updated() {}, //生命周期 - 更新之后
  beforeDestroy() {}, //生命周期 - 销毁之前
  destroyed() {}, //生命周期 - 销毁完成
  activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发.  页面被激活就会发送请求
};
</script>
<style scoped>
</style>

猜你喜欢

转载自blog.csdn.net/qq_33229669/article/details/107869055