返回

El-checkbox 绑定的值变化却无触发 Change 事件?

前端

踩坑事件:El-checkbox 绑定的值变化却无触发 Change 事件?

假设我们有如下代码片段:

<template>
  <el-checkbox v-model="checked"></el-checkbox>
  <button @click="changeValue">修改值</button>
</template>

<script>
  export default {
    data() {
      return {
        checked: false
      }
    },
    methods: {
      changeValue() {
        this.checked = !this.checked
      }
    }
  }
</script>

我们希望点击按钮后,checkbox 的值会发生变化,同时触发 change 事件。然而,当我们实际运行代码时,却发现 change 事件并未触发。

原因探究:

要理解为什么 change 事件没有触发,我们需要深入了解 Vue.js 的事件处理机制。在 Vue.js 中,事件处理主要通过 v-on 指令实现。v-on 指令将 HTML 元素与 JavaScript 事件绑定在一起,当事件发生时,相应的 JavaScript 函数就会被触发。

在我们的示例中,v-model 指令被用于处理 checkbox 的值变化。v-model 指令不仅会更新 checkbox 的值,还会触发相应的事件。然而,v-model 指令触发的事件是 input 事件,而不是 change 事件。

因此,当我们点击按钮修改 checkbox 的值时,实际上触发的并不是 change 事件,而是 input 事件。这就是为什么 change 事件没有触发的根本原因。

解决方案:

既然我们已经了解了问题的根源,就可以着手解决这个问题了。有两种方法可以实现我们的目标:

  1. 使用 @change 事件监听器

我们可以直接在 checkbox 元素上使用 @change 事件监听器来监听 change 事件。当 change 事件发生时,相应的 JavaScript 函数就会被触发。

<template>
  <el-checkbox v-model="checked" @change="handleChange"></el-checkbox>
  <button @click="changeValue">修改值</button>
</template>

<script>
  export default {
    data() {
      return {
        checked: false
      }
    },
    methods: {
      changeValue() {
        this.checked = !this.checked
      },
      handleChange() {
        console.log('Checkbox 的值发生了变化')
      }
    }
  }
</script>
  1. 使用 $emit 方法触发自定义事件

我们还可以在 checkbox 组件内部使用 $emit 方法来触发自定义事件。当自定义事件被触发时,父组件就可以监听该事件并做出相应的响应。

<template>
  <el-checkbox v-model="checked" @input="handleInput"></el-checkbox>
  <button @click="changeValue">修改值</button>
</template>

<script>
  export default {
    data() {
      return {
        checked: false
      }
    },
    methods: {
      changeValue() {
        this.checked = !this.checked
      },
      handleInput() {
        this.$emit('change', this.checked)
      }
    }
  }
</script>

在父组件中,我们可以使用 v-on 指令来监听自定义事件:

<template>
  <MyCheckbox @change="handleChange"></MyCheckbox>
</template>

<script>
  import MyCheckbox from './MyCheckbox.vue'

  export default {
    components: {
      MyCheckbox
    },
    methods: {
      handleChange(checked) {
        console.log('Checkbox 的值发生了变化', checked)
      }
    }
  }
</script>

总结:

通过本文,我们深入分析了 El-checkbox 绑定的值变化却无触发 Change 事件的问题,并提供了两种解决方案。希望这些解决方案能够帮助您在开发 Vue.js 应用时避免类似的问题。