Bootstrap-vue 复选框,选中时检查附加选项

Posted

技术标签:

【中文标题】Bootstrap-vue 复选框,选中时检查附加选项【英文标题】:Bootstrap-vue Checkbox, Check additional options when selected 【发布时间】:2020-08-14 09:02:23 【问题描述】:

当用户选中其中一个复选框时,我还要做的是检查default 选项。

我已经创建了我遇到的错误的 sn-p, 通常我认为这是因为我的嵌套组件。

但我遇到了错误 您可能在 watcher 中有一个无限更新循环,表达式为“localChecked”

即使在这个简单的代码 sn-p 上。

vue js 脚本

new Vue(
  el: "#app",
  data: 
    application: [
            
        app_name : 'Netflix',
        app_default : 'videoshare_default',
        options : [
           text : 'Video Stream', value : 'video_streaming',
           text : 'Download Video' , value : 'video_download',
           text : 'Share Video' , value : 'videoshare_default'
        ]
      ,
            
        app_name : 'Messenger',
        app_default : 'message',
        options : [
             text : 'Messaging', value : 'message',
           text : 'Voice Calls' , value : 'voice_calls',
           text : 'Video Calls' , value : 'video_calls',
           text : 'Media Sharing' , value : 'file_transfer'
        ]
            
    ],
    selected : []
  ,
  methods: 
    selectDefault: function(data,$event)
        this.selected[data.app_name].push(data.videoshare_default)
    
  
)

html

<div id="app">
  <b-col v-for="(data , index) in application" v-bind:key="index" class="p-2" cols="5">
    <b-form-group :label="data.app_name" label-class="font-weight-bold">
      <b-form-checkbox-group                            
         @input="selectDefault(data,$event)"
         v-model="selected[data.app_name]"
         :options="data.options"
         name="application[]"
         stacked
      ></b-form-checkbox-group>
    </b-form-group>
  </b-col>
</div>

小提琴:

https://jsfiddle.net/tomexsans/194m0jdq/1/

或者除了我正在做的事情之外,还有其他方法可以做到这一点。

【问题讨论】:

你想要的是这样的 (jsfiddle.net/6kvew3zf/1) 吗? @Hiws 这就是我想要的。是的,您应该将此添加为答案,以便我接受。感谢您在代码中添加 cmets。 【参考方案1】:

您的selected 属性是一个数组,但您想使用键值对,这就是为什么您需要将其设为对象,该对象将存储每个应用程序类型的数组。

为确保 Vue 保持响应式,您需要使用 Vue.setthis.$set 方法向对象添加属性,如果该属性已存在于该对象中.

b-form-checkbox-group 上的 $event 返回整个选定值数组,这是我们不想要的。这就是为什么我在事件上使用.native 修饰符,所以我可以访问单击的复选框及其值。

new Vue(
  el: "#app",
  data: 
    application: [
        app_name: 'Netflix',
        app_default: 'videoshare_default',
        options: [
            text: 'Video Stream',
            value: 'video_streaming'
          ,
          
            text: 'Download Video',
            value: 'video_download'
          ,
          
            text: 'Share Video',
            value: 'videoshare_default'
          
        ]
      ,
      
        app_name: 'Messenger',
        app_default: 'message',
        options: [
            text: 'Messaging',
            value: 'message'
          ,
          
            text: 'Voice Calls',
            value: 'voice_calls'
          ,
          
            text: 'Video Calls',
            value: 'video_calls'
          ,
          
            text: 'Media Sharing',
            value: 'file_transfer'
          
        ]
      
    ],
    selected: 
  ,
  methods: 
    selectDefault(data, event) 
      /*  Return if the checkbox was unchecked */
      if (!event.target.checked) return;
      /* Return if the selected value was the default */
      if (data.app_default === event.target.value) return;

      /* Init the array if it doesn't exist yet.*/
      if (!this.selected[data.app_name]) 
        this.$set(this.selected, data.app_name, []);
      

      const nestedSelected = this.selected[data.app_name];
      /* Push in the default value if it doesn't exist alreayd */
      if (!nestedSelected.find(value => value === data.app_default)) 
        this.selected[data.app_name].push(data.app_default)
      
    
  
)
<link href="https://unpkg.com/bootstrap@4.4.1/dist/css/bootstrap.min.css" rel="stylesheet"/>
<link href="https://unpkg.com/bootstrap-vue@2.3.0/dist/bootstrap-vue.css" rel="stylesheet"/>

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.js"></script>
<script src="https://unpkg.com/bootstrap-vue@2.3.0/dist/bootstrap-vue.js"></script>

<div id="app">
  <b-col v-for="(data , index) in application" v-bind:key="index" class="p-2" cols="5">
    <b-form-group :label="data.app_name" label-class="font-weight-bold">
      <b-form-checkbox-group
         v-model="selected[data.app_name]"
         @input.native="selectDefault(data, $event)"
         :options="data.options"
         name="application[]"
         stacked
       ></b-form-checkbox-group>
    </b-form-group>
  </b-col>
  
   selected 
</div>

【讨论】:

以上是关于Bootstrap-vue 复选框,选中时检查附加选项的主要内容,如果未能解决你的问题,请参考以下文章

PHP JQuery Checkbox - 如果复选框被预先选中,它不会在未选中时删除“选中”属性

在 Rails3 中选中或取消选中时,如何让复选框触发 ajax 调用?

JTable Checkbox 应在选中时启动计时器

该复选框在未选中时不能返回 False,但在选中时可以返回 True

Vue的全选功能实现思路

最初未选中时未触发复选框命令