el-tree 和 el-switch 组合使用

1、效果

 

 

2、组件代码

<template>
  <div style="width: 370px">
    <div>
      <el-input placeholder="输入关键字进行过滤" v-model="filterText"
        >></el-input
      >
    </div>
    <el-tree
      :data="treeData"
      :props="defaultProps"
      :width="treeWidth"
      @node-click="handleNodeClick"
      node-key="id"
      :expand-on-click-node="false"
      :filter-node-method="filterNode"
      default-expand-all
      ref="mapTree"
    >
      <span class="custom-tree-node" slot-scope="{ data }">
        <span>{{ data.label }}</span>
        <span>
          <el-switch
            v-model="data.isChecked"
            active-color="#13ce66"
            inactive-color="#608060"
            :width="35"
            :active-value="true"
            :inactive-value="false"
            @change="switchOpenOrClose(data)"
          >
          </el-switch>
        </span>
      </span>
    </el-tree>
  </div>
</template>

<script>
export default {
  name: "SwitchTree",
  props: {
    treeData: {
      type: Array,
    },
    treeWidth: {
      type: Number,
      default: 200,
    },
  },
  data() {
    return {
      filterText: "",
      defaultProps: {
        children: "children",
        label: "label",
      },
    };
  },
  methods: {
    handleNodeClick() {},
    switchOpenOrClose(data) {
      this.$emit("openswitch", data);
      this.setSwitchStatus(data.id, this.treeData, data.isChecked);
    },
    filterNode(value, data) {
      if (!value) return true;
      return data.label.indexOf(value) !== -1;
    },
    setSwitchStatus(id, data, status) {
      let that = this;
      data.forEach((x) => {
        if (x.id == id) {
          x.isChecked = status;
          if (x.children) {
            x.children.forEach((o) => {
              that.setSwitchStatus(o.id, x.children, status);
            });
          }
        } else {
          if (x.children) {
            that.setSwitchStatus(id, x.children, status);
          }
        }
      });
      this.setParentSwitcStatus(this.treeData[0]);
    },
    setParentSwitcStatus(data) {
      let that = this;
      let isChecked = true;
      if (data.children) {
        data.children.forEach((x) => {
          if (!x.isChecked) {
            isChecked = false;
          }
          if (x.children) {
            that.setParentSwitcStatus(x);
          }
        });
      }
      data.isChecked = isChecked;
    },
  },
  watch: {
    filterText(val) {
      this.$refs.mapTree.filter(val);
    },
  },
};
</script>

<style scoped>
.custom-tree-node /deep/ .el-switch__core {
  width: 35px;
  height: 15px;
}
.custom-tree-node /deep/ .el-switch__core::after {
  height: 12px;
  width: 12px;
}

.custom-tree-node {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: space-between;
  font-size: 14px;
  padding-right: 8px;
}
</style>

  

3、使用示例

<template>
    <div>
      <switch-tree
        :treeData="data"
        @openswitch="openOrCloseSwitch"
      ></switch-tree>
    </div>
</template>

<script>
import SwitchTree from "./SwitchTree.vue";
export default {
  name: "HelloWorld",
  components: {
    SwitchTree,
  },
  props: {
    treeWith: {
      type: Number,
      default: 200,
    },
  },
  data() {
    return {
      filterText: "",
      data: [
        {
          id: 1,
          label: "一级",
          isChecked: false,
          children: [
            {
              id: 2,
              label: "二级 1-1",
              isChecked: false,
              children: [
                {
                  id: 3,
                  label: "三级 1-1-1",
                  isChecked: false,
                },
                {
                  id: 4,
                  label: "三级 1-1-2",
                },
              ],
            },
          ],
        },
        {
          id: 5,
          label: "一级",
          isChecked: true,
        },
      ],
    };
  },
  methods: {
   
    openOrCloseSwitch(data) {
      if (data.isChecked) {
        console.log("open");       
      } else {
        console.log("close");
      }
    },

  },

};
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>

 

 
posted @ 2022-03-03 10:09  小七要走  阅读(222)  评论(0编辑  收藏  举报