簡體   English   中英

Vue 只允許數組中的一個元素為真

[英]Vue allow only one element in array be true

我在 vue 中創建了多個帶有復選框的輸入字段,我希望只有一個可以為真。 因此,如果用戶點擊一個其他的應該是假的,這樣只有最后一次點擊的復選框是真的。

我的代碼是這樣的:

new Vue({
  el: "#app",
  data: {
      selected: null,
      options: [
          {"id": 1, "title": "One", "value": false},
          {"id": 2, "title": "Two", "value": false },
          {"id": 3, "title": "Three", "value": false},
      ]
  },
  watch: {
    selected(selected) {
      this.options.forEach((option, index) => {
        option.id == selected ? option.value = true : option.value = false;
      });
    }
  }

不幸的是,我的觀察者工作不正常。 如果有人能告訴我如何糾正它,我會很高興。 我希望最后一個真正的元素總是唯一的真正元素,手表將選項中的所有其他元素設置為假。

如果我正確理解了您的要求,您仍然可以使用單選按鈕來完成。 您可以指定要在selected變量中使用的值,如下所述: https://v2.vuejs.org/v2/guide/forms.html#Radio-1 這意味着您可以設置一個觀察者,然后相應地改變選項列表:

selected: function (newVal) {
    this.options.forEach(option => {
      if (option.id === newVal) option.value = true
      else option.value = false
    })
    console.log(this.options)
}

這是一個沙箱,可以看到它的實際效果: https://codesandbox.io/s/heuristic-goldberg-lilsw

更新:剛剛看到你想使用 buefy 的</b-switch> 您仍然可以通過從input事件調用 function 來執行類似的操作,然后根據剛剛更改的元素更改選項列表。 像這樣的東西:

<div v-for="(option,index) in options" :key="index">
      <div class="box">
        <div class="field">
           <b-switch v-model="option.value" @input="(modelValue) => onSwitchChanged(modelValue, option.id)">
            {{ option.title }}
           </b-switch>
          <label :for="index">{{ option.title }}</label>
        </div>
    </div>
</div>

function onSwitchChanged(modelValue, id) {
    if (!modelValue) return
    this.options.forEach(option => {
      if (option.id === id) option.value = true
      else option.value = false
    })
}

如果您希望只選擇一個,那么您必須使用radio按鈕。 Checkbox具有 select all But One by One 的選項。

沒有watch你可以使用methods 將索引傳遞給方法。

<input 
   type="checkbox"
   :id="index" 
   :value="option.id" 
   @click="selectAnOption(index)"
>

方法:

methods: {
  selectAnOption(index) {
   this.options[index].value = true
  }
}

完整代碼在這里: https://jsfiddle.net/8ktdp9ew/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM