封装一个带查询功能的树形省市区(el-tree)

 查询效果:点击左边省市区右边显示相应的信息

组件myy_tree.vue页面

<template>
  <div>
    <el-tree
      class="filter-tree"
      :data="items"
      ref="tree"
      :render-content="renderItem"
      :node-key="defaultProps.id"
      :props="defaultProps"
      :expand-on-click-node="false"
      @node-click="handleNodeClick"
    ></el-tree>
  </div>
</template>

<script>
export default {
  name: "myy-tree",
  props: {
    items: {
      type: Array,
      required: true,
    },
  },
  data() {
    return {
      trees: [],
      defaultProps: {
        children: "items",
        id: "code",
      },
      checkList: [],
    };
  },
  created() {},
  methods: {
    handleNodeClick(e, v, i) {
      this.checkList = [];
      this.getParent(v);
      this.$emit("selectDidChange", this.checkList);

      // console.log(v)
      if (v.childNodes.length > 0 && v.expanded == false) {
        v.expanded = true;
      }

    },
    getParent(node) {
      // console.log("node", node);
      if (!node.parent) return; //无父节点
      this.checkList.unshift(node.data);
      this.getParent(node.parent);
    },
    renderItem(h, { node, data, store }) {
      if (data.attr != null && data.attr.count != null && data.attr.count > 0) {
        return (
          <div>
            {data.name}
            <span style="color:red">({data.attr.count})</span>
          </div>
        );
      } else {
        return <span>{data.name}</span>;
      }
    },
  },
};
</script>
<style lang="less">
.el-tree-node:focus > .el-tree-node__content {
  background-color: #409eff;
  color: #fff; //节点的字体颜色
  font-weight: bold;
}
</style>

在页面上使用:

import Myytree from "../../components/xxxx/myy_tree";
  components: {
    Myytree,
  },

<div class="box-left">
    <div style="overflow-y: scroll; height: 100%">
        <myytree v-bind:items="trees" @selectDidChange="treeSelectDidChange"></myytree>
    </div>
</div>
  trees: [],
   // 获取接口树数据
    companyssq() {
      get("/xxxxx/xxx/ssq").then((res) => {
        this.trees = res.items;
      });
    },

   //选中的时候触发
    treeSelectDidChange(res) {
           console.log(res,"选中的数据");
           var treesearch = {}; //声明一个空的对象
            if (res.length > 0) {
                treesearch["选中的第一层数据"] = res[0].name; //查询看一下后端要code还是name
            }
            if (res.length > 1) {
                treesearch["选中的第二层数据"] = res[1].name;
            }
            if (res.length > 2) {
                treesearch["选中的第三层数据"] = res[2].name;
            }
           this.treesearch = treesearch; //赋值给this.treesearch请求列表的时候把它传给后端完成查询操作
    },

 treesearch: {},
 get("/xxxxx/list", {
        pIndex: this.pIndex,
        pSize: this.pSize,
        ...this.treesearch,
      }).then(res => {});

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以将el-select和el-tree封装成一个自定义组件,例如:SelectableTree。 首先,在组件的template中,可以使用el-select和el-tree的模板,并将它们放在一起。同时,在el-select中添加一个v-model来绑定选中的值。 ```html <template> <div class="selectable-tree"> <el-select v-model="selectedNode" placeholder="请选择" @change="handleSelectionChange"> <el-option v-for="node in nodes" :key="node.id" :label="node.label" :value="node"></el-option> </el-select> <el-tree :data="treeData" :props="treeProps" @node-click="handleNodeClick"></el-tree> </div> </template> ``` 在script中,需要定义props和data,同时还需要定义computed属性来将el-tree的data转换为适合el-select使用的数据。 ```javascript <script> export default { name: 'SelectableTree', props: { nodes: { type: Array, required: true }, treeProps: { type: Object, required: true } }, data() { return { selectedNode: null, treeData: [] } }, computed: { selectData() { return this.nodes.map(node => { return { label: node.label, value: node } }) } }, methods: { handleSelectionChange(value) { this.$refs.tree.setCurrentKey(value.id) }, handleNodeClick(data, node) { this.selectedNode = data } }, created() { this.treeData = this.nodes.map(node => { return { label: node.label, id: node.id, children: node.children || [] } }) } } </script> ``` 最后,在使用组件时,只需传入el-select和el-tree的props和数据即可。 ```html <template> <div> <selectable-tree :nodes="nodes" :tree-props="treeProps"></selectable-tree> </div> </template> <script> import SelectableTree from "./SelectableTree.vue"; export default { name: "App", components: { SelectableTree, }, data() { return { nodes: [ { 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", }, ], }, ], treeProps: { children: "children", label: "label", }, }; }, }; </script> ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值