vue.js - Vue : binding with v-model in custom checkbox component doesn't work

标签 vue.js checkbox vuejs2 v-model

我正在尝试使用带有选项和值的数组中的 v-for 循环生成的选项构建一个自定义复选框组件。如何将 v-model 正确绑定(bind)到复选框组件,以便正确更新?

现在的问题是模型只更新到最新的选中复选框,并且没有提供包含所有选中选项的数组。

Vue.component('ui-checkbox', {
	 props: {   
    label: {
      type: String,
      required: true,
    },
    index: {
      type: Number
    },
    inputValue: {
      type: String
    }
  },
  methods: {
    onChange(e) {
      this.$emit('input', e.target.value);
    },
  },
	template: `<div>
    <input 
      :id="index"
      type="checkbox"
      :value="inputValue"
      @change="onChange" />
    <label :for="index">
      {{ label }}
    </label>
  </div>`,
})

new Vue({
  el: "#app",
  data: {
    checkOptions: [
      {
        label: 'Option 1',
        value: 'value of option 1',
      },
      {
        label: 'Option 2',
        value: 'value of option 2',
      },
      {
        label: 'Option 3',
        value: 'value of option 3',
      },
      {
        label: 'Option 4',
        value: 'value of option 4',
      },
    ],
    myCheckBoxModel: []
  },
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
   <span>checked Checkboxes: {{ myCheckBoxModel }} </span>
   <ui-checkbox
     v-for="(option, index) in checkOptions"
     v-model="myCheckBoxModel"
     :key="index"
     :index="index"
     :input-value="option.value"
     :label="option.label" />    
</div>

最佳答案

当你这样做

this.$emit('input', e.target.value);

它像
myCheckBoxModel = e.target.value

所以它只是将您单击的最后一个复选框的值分配给 myCheckBoxModel .
如果您想将所有选中的项目保留在 myCheckBoxModel 中,您需要执行以下操作:
  • 添加 value属性(property)给 ui-checkbox组件可以访问 myCheckBoxModel 的当前值. Value是此目标的默认属性名称(参见 vue guide)。
  • 在您的 onChange方法将当前值复制到变量中,因为它不好改变 value直接置业
  • 如果您的复选框被选中,则将对应的值推送到数组。如果未选中该复选框,则从数组
  • 中删除对应的值
  • 发射 input以结果数组为值的事件


  • Vue.component('ui-checkbox', {
        	 props: {   
            label: {
              type: String,
              required: true,
            },
            index: {
              type: Number
            },
            inputValue: {
              type: String
            },
            value: {
              type: Array
            }
          },
          methods: {
            onChange(e) {
              let currentValue = [...this.value]
              if (e.target.checked) {
                currentValue.push(e.target.value) 
              } else {
                currentValue = currentValue.filter(item => item !== e.target.value)
              }
              this.$emit('input', currentValue);
            },
          },
        	template: `<div>
            <input 
              :id="index"
              type="checkbox"
              :value="inputValue"
              @change="onChange" />
            <label :for="index">
              {{ label }}
            </label>
          </div>`,
        })
    
        new Vue({
          el: "#app",
          data: {
            checkOptions: [
              {
                label: 'Option 1',
                value: 'value of option 1',
              },
              {
                label: 'Option 2',
                value: 'value of option 2',
              },
              {
                label: 'Option 3',
                value: 'value of option 3',
              },
              {
                label: 'Option 4',
                value: 'value of option 4',
              },
            ],
           myCheckBoxModel: []
          }
        })
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
      <div id="app">
      checked Checkboxes:
           <span v-for="item in myCheckBoxModel"> {{ item }}; </span>
           <ui-checkbox
             v-for="(option, index) in checkOptions"
             v-model="myCheckBoxModel"
             :key="index"
             :index="index"
             :input-value="option.value"
             :label="option.label" />    
      </div>


    我不知道您是否需要以编程方式设置复选框状态,即当您更改 myCheckBoxModel 时复选框的状态相应改变。如果你这样做,你需要观看value您的 ui-checkbox 中的属性(property)组件:根据复选框的值是否在 value 中设置复选框的状态大批。在 created 中也这样做如果要通过 myChexkboxModel 初始化复选框的状态,则 Hook

    关于vue.js - Vue : binding with v-model in custom checkbox component doesn't work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58187290/

    相关文章:

    javascript - Vuex createNamespacedHelpers 不起作用

    jquery - 在html中,在没有JQuery的情况下选中2个复选框中的一个复选框

    vba - 如果选中复选框,则更改下一个工作表上单元格的单元格颜色

    vue.js - 在 gitlab-ci 中对 VueJS 应用程序进行端到端测试

    javascript - Vuejs - 在导出的类上使用函数 getProperties

    javascript - Vue中使用事件修饰符.prevent实现无重定向提交表单

    css - 在 Vue 模板文件中的伪元素内容或背景图片中使用 SVG

    javascript - VueJS $emit 无法将数据推送到父级

    vue.js - 如何使用 Quasar QexpansionItem 制作递归菜单

    javascript - 表格标题颜色复选框选中/取消选中