html中 checkbox 的实现:

我们先来看看在html中 checkbox 的实现: <input type="checkbox">

其中 checked 属性用于控制控件是否被选中, onchange 事件,在元素值被改变时执行。

这里要注意:

当我们用js修改checked绑定的值时,并不会触发onchange事件 ,用鼠标点击会checkbox框会触发onchange事件。

如下边这段代码

< section id = "app" > < button onclick = "alterCheckboxValue()" > 切换! </ button > < input type = "checkbox" id = "checkbox1" onchange = "handleChange()" > </ section > < script > function alterCheckboxValue ( ) { const el = document . querySelector ( "#checkbox1" ); el. checked = !el. checked ; function handleChange ( e ) { console . log ( "触发change事件" ); </ script > </ body >

v-model指令

v-model 本质是个语法糖,它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。它实际上是做了两步动作:

  • 绑定数据value
  • 触发输入事件input
  • 看看下边这两段代码就清楚了:

    <input type="text" v-model="msg">
    // 等价于
    <input type="text" v-bind:value="msg" v-on:input="msg=$event.target.value">
    

    v-model :value="msg" ``@input="msg=$event.target.value"的语法糖,

  • :value="msg"是绑定了数据,value就是input输入框里的值;
  • @input="msg=$event.target.value"就是监听input输入框里值的变化,然后改变值。
  • 一句话概括就是,绑定数据并且监听数据改变

    出错的代码

    我们再来看看出错的代码

    <el-checkbox v-model="value" @change="HandleChange">
    

    根据上边内容,我们可以知道,这段代码中

  • v-model = "value" ****应该就是对input标签checked属性与value进行了一个绑定
  • @change = "HandleChange"就是onchange事件
  • 如果elmentUI没有做特殊处理,当我们通过JS修改value值时,也不会触发HandleChange方法

    el-checkbox源码:

    我们再来看看el-checkbox源码:

    参考:blog.csdn.net/tangran0526…

    查看源码可以看到,确实如我们所想,当绑定的值变化后,并没有触发这个 handleChange事件,而是触发了el-form父元素的change事件。

    watch: {
      		// el-checkbox绑定的值
          value(value) {
            this.dispatch('ElFormItem', 'el.form.change', value);
    

    重新封装el-checkbox,添加vaule的监听属性,触发change事件。

    <!--子组件-->
    <template>
      <el-checkbox v-model="model"/>
    </template>
    <script>
    export default {
      name: 'my-checkBox',
      props: {
        value: false,
        autoChange: {
          type: Function,
          default: () => {
      data() {
        return {
          selfModel: false,
      computed: {
        model: {
          get() {
            return this.value !== undefined
                ? this.value : this.selfModel
          set(val) {
            this.$emit('input', val)
            this.selfModel = val;
      watch: {
        value() {
          this.$emit('autoChange', this.value)
    </script>
    

    父组件中使用:

      <auto-checkbox v-model:value="item.checkBoxShow" @autoChange="layerChange(item)"/>
    复制代码
  • 一个合格(优秀)的前端都应该阅读这些文章
  • 一名【合格】前端工程师的自检清单
  • 2021年我的前端面试准备
  • 最近两周出去面试遇到的面试题(前端初级、长更)
  •