【UI】 elementUI的select-tree组合下拉框,选择后下拉框不收起

前言

在这里插入图片描述

问题:elementui 的 select 下拉框 搭配 树形菜单 tree 点击菜单 值虽然变化了,但select下拉框没收起

vue代码

<!--
 * @Description: select下拉搭配tree树形 选择
-->
<template>
  <div class="selectTree">
    <el-form ref="form" :model="form" label-width="80px">
      <el-form-item label="树型结构">
        <!-- 单选 -->
        <el-select
          v-model="form.treeData"
          placeholder="请选择"
          style="width: 16rem"
        >
          <!-- 多选 -->
          <!-- <el-select v-model="form.treeData" multiple placeholder="请选择" style="width: 16rem"> -->
          <el-option :value="treeDataValue" style="height: auto">
            <el-tree
              ref="tree"
              :data="data"
              default-expand-all
              node-key="id"
              :props="defaultProps"
              @node-click="handleNodeClick"
            />
          </el-option>
        </el-select>
      </el-form-item>
    </el-form>
  </div>
</template>
<script>
export default {
  data() {
    return {
      form: {
        treeData: "一级 1", // 单选
        // treeData: [], // 多选
      },
      treeDataValue: "1",
      data: [
        {
          id: 1,
          name: "一级 1",
          children: [
            {
              id: 4,
              name: "一级 1-1",
            },
          ],
        },
        {
          id: 2,
          name: "一级 2",
          children: [
            {
              id: 5,
              name: "二级 2-1",
            },
            {
              id: 6,
              name: "二级 2-2",
            },
          ],
        },
        {
          id: 3,
          name: "一级 3",
          children: [
            {
              id: 7,
              name: "二级 3-1",
            },
            {
              id: 8,
              name: "二级 3-2",
            },
          ],
        },
      ],
      defaultProps: {
        children: "children",
        label: "name",
      },
    };
  },
  created() {},
  methods: {
    // 点击树节点
    handleNodeClick(data, node, nodeData) {
      // select 单选
      this.treeDataValue = data;
      this.form.treeData = data.name;
      console.log(data);
      console.log(node.parent.data);
      console.log(nodeData);

      // select 多选(判重后添加到选择结果数组中)
      // this.treeDataValue = data
      // let num = 0;
      // this.form.treeData.forEach(item => {
      //     item == data.name ? num++ : num;
      // })
      // if(num == 0) {
      //     this.form.treeData.push(data.name)
      // }
    },
  },
};
</script>
<style lang="scss">
.el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover {
  background-color: #ffffff;
}
.el-select-dropdown__item.hover,
.el-select-dropdown__item:hover {
  background-color: #ffffff;
}
.el-select-dropdown__item.selected {
  font-weight: normal;
}
</style>

解决

1.给下拉框写个ref

<el-select
  v-model="form.treeData"
  placeholder="请选择"
  style="width: 16rem"
  ref="treeSelect"
>
  <el-option :value="treeDataValue" style="height: auto">
    <el-tree
      ref="tree"
      :data="data"
      default-expand-all
      node-key="id"
      :props="defaultProps"
      @node-click="handleNodeClick"
    />
  </el-option>
</el-select>

2.点击下拉框选项的时候判断值有没有赋值(即这个select下拉框的值有没有改变),写个监听,值改变了就收起树形菜单。

我这里是把下拉框显示的值treeDataValue,就写个watch监听它。

watch: {
  treeDataValue() {
    this.$refs.treeSelect.visible = false;
  },
},

至此问题解决

效果在这里插入图片描述

完整代码

vue文件

<!--
 * @Description: select下拉搭配tree树形 选择
-->
<template>
  <div class="selectTree">
    <el-form ref="form" :model="form" label-width="80px">
      <el-form-item label="树型结构">
        <!-- 单选 -->
        <el-select
          v-model="form.treeData"
          placeholder="请选择"
          style="width: 16rem"
          ref="treeSelect"
        >
          <!-- 多选 -->
          <!-- <el-select v-model="form.treeData" multiple placeholder="请选择" style="width: 16rem"> -->
          <el-option :value="treeDataValue" style="height: auto">
            <el-tree
              ref="tree"
              :data="data"
              default-expand-all
              node-key="id"
              :props="defaultProps"
              @node-click="handleNodeClick"
            />
          </el-option>
        </el-select>
      </el-form-item>
    </el-form>
  </div>
</template>
<script>
export default {
  data() {
    return {
      form: {
        treeData: "一级 1", // 单选
        // treeData: [], // 多选
      },
      treeDataValue: "1",
      data: [
        {
          id: 1,
          name: "一级 1",
          children: [
            {
              id: 4,
              name: "一级 1-1",
            },
          ],
        },
        {
          id: 2,
          name: "一级 2",
          children: [
            {
              id: 5,
              name: "二级 2-1",
            },
            {
              id: 6,
              name: "二级 2-2",
            },
          ],
        },
        {
          id: 3,
          name: "一级 3",
          children: [
            {
              id: 7,
              name: "二级 3-1",
            },
            {
              id: 8,
              name: "二级 3-2",
            },
          ],
        },
      ],
      defaultProps: {
        children: "children",
        label: "name",
      },
    };
  },
  created() {},
  watch: {
    treeDataValue() {
      this.$refs.treeSelect.visible = false;
    },
  },
  methods: {
    // 点击树节点
    handleNodeClick(data, node, nodeData) {
      // select 单选
      this.treeDataValue = data;
      this.form.treeData = data.name;
      console.log(data);
      console.log(node.parent.data);
      console.log(nodeData);

      // select 多选(判重后添加到选择结果数组中)
      // this.treeDataValue = data
      // let num = 0;
      // this.form.treeData.forEach(item => {
      //     item == data.name ? num++ : num;
      // })
      // if(num == 0) {
      //     this.form.treeData.push(data.name)
      // }
    },
  },
};
</script>
<style lang="scss">
.el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover {
  background-color: #ffffff;
}
.el-select-dropdown__item.hover,
.el-select-dropdown__item:hover {
  background-color: #ffffff;
}
.el-select-dropdown__item.selected {
  font-weight: normal;
}
</style>

下班~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fruge365

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值