el-select多选时change事件和remove-tag事件发生冲突

742 阅读1分钟

问题描述

做项目的过程中使用el-select组件又踩到了一个坑,就是多选的时候触发remove-tag事件也会触发change事件,因为是两个事件处理函数,所以就会导致change事件处理函数里的逻辑又会被执行一次~~

于是赶紧写了个demo:

<template>
  <div>
    <el-select multiple v-model="selectValue" @change="handleChange" @remove-tag="handleRemove">
      <el-option v-for="(item, index) in list" :key="index" :label="item.label" :value="item.value"></el-option>
    </el-select>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectValue: [],
      list: [
        {
          label: "111",
          value: 1
        },
        {
          label: "222",
          value: 2,
        }
      ]
    }
  },
  methods: {
    handleChange() {
      console.log("change...")
    },
    handleRemove() {
      console.log("remove...")
    }
  }
}
</script>

image.png

全部勾选然后对其进行删除就会发现会触发change事件并且优先于remove-tag事件。

解决方法

在handleChange事件使用this.$nextTick方法将处理逻辑推迟下一个事件循环中,这样change事件就会在remove-tag事件之后触发。

handleChange() {
      this.$nextTick(() => {
        console.log("change...")
      })
 },

image.png

那么接下来再只用一个变量来进行区分即可。

<script>
export default {
  data() {
    return {
      selectValue: [],
      removeFlag:false,
      list: [
        {
          label: "111",
          value: 1
        },
        {
          label: "222",
          value: 2,
        }
      ]
    }
  },
  methods: {
    handleChange() {
      this.removeFlag = false;
      this.$nextTick(() => {
        if (!this.removeFlag) {
          console.log("change...")
        }
      })
    },
    handleRemove() {
      this.removeFlag = true;
      console.log("remove...")
    }
  }
}
</script>

image.png

这不扣波6吗?