搜尋

首頁  >  問答  >  主體

Vue 3自訂複選框元件綁定到所選值的陣列

我一直在嘗試建立一個帶有樣式複選框和相應標籤的簡單元件。所有選定複選框的值(字串)應儲存在一個陣列中。這適用於純 html 複選框:

<template>
  <div>
    <div class="mt-6">
      <div>
        <input type="checkbox" value="EVO" v-model="status" /> <label for="EVO">EVO</label>
      </div>
      <div>
        <input type="checkbox" value="Solist" v-model="status" /> <label for="Solist">Solist</label>
      </div>
      <div>
        <input type="checkbox" value="SPL" v-model="status" /> <label for="SPL">SPL</label>
      </div>
    </div>
    <div class="mt-3">{{status}}</div>
  </div>
</template>

<script setup>
  import { ref } from 'vue'
  
  let status = ref([]);
</script>

它會導致以下所需的情況:

現在,如果我用自訂複選框元件替換這些複選框,我將無法使其工作。如果我選中一個框,它發出的值似乎會替換 status 數組,而不是添加到其中或從中刪除,從而導致以下結果:

因此,由於某種原因,預設情況下會選中所有複選框,當我單擊其中一個複選框時,它們都會被取消選中,並且status 值會轉到false ,再次按一下任何一個複選框將選取所有複選框並使status true

現在,我知道在發射中返回是否選中該框會返回 true 或 false 值,但我不明白 Vue 如何使用本機複選框執行此操作以及如何使用我的組件實現此行為。

這是我的複選框元件的程式碼:

<template>
  <div class="mt-1 relative">
    <input
      type="checkbox"
      :id="id ?? null"
      :name="name"
      :value="value"
      :checked="modelValue ?? false"
      class="bg-gray-200 text-gold-500 rounded border-0 w-5 h-5 mr-2 focus:ring-2 focus:ring-gold-500"
      @input="updateValue"
    />
    {{ label }}
  </div>
</template>

<script setup>
  const props = defineProps({
    id: String,
    label: String,
    name: String,
    value: String,
    errors: Object,
    modelValue: Boolean,
  })
  
  const emit = defineEmits(['update:modelValue'])
  
  const updateValue = function(event) {
    emit('update:modelValue', event.target.checked)
  }
</script>

且父元件僅使用不同的範本:

<template>
  <div>
    <div class="mt-6">
      <Checkbox v-model="status" value="EVO" label="EVO" name="status"  />
      <Checkbox v-model="status" value="Solist" label="Solist" name="status" />
      <Checkbox v-model="status" value="SPL" label="SPL" name="status" />
    </div>
    <div class="mt-3">{{status}}</div>
  </div>
</template>

我試圖查看 StevenSiebert 的這個答案,但它使用一個對象,我想使用本機複選框複製原始的 Vue 行為。

我還參考了 v-model 上的官方 Vue 文檔,但不明白為什麼這對於本機複選框的工作方式與對於組件的工作方式不同。

P粉561749334P粉561749334363 天前674

全部回覆(1)我來回復

  • P粉893457026

    P粉8934570262023-12-22 15:09:31

    每個複選框的 v-model 都是相同的,可能類似於以下程式碼片段:

    const { ref } = Vue
    const app = Vue.createApp({
      setup() {
        const status = ref([{label: 'EVO', status: false}, {label: 'Solist', status: false}, {label: 'SPL', status: false}])
        return {
          status
        }
      },
    })
    app.component('Checkbox', {
      template: `
        <div class="mt-1 relative">
          <input
            type="checkbox"
            :id="id ?? null"
            :name="name"
            :value="value"
            :checked="modelValue ?? false"
            class="bg-gray-200 text-gold-500 rounded border-0 w-5 h-5 mr-2 focus:ring-2 focus:ring-gold-500"
            @input="updateValue"
          />
          {{ label }}
        </div>
      `,
      props:{
        id: String,
        label: String,
        name: String,
        value: String,
        errors: Object,
        modelValue: Boolean,
      },
      setup(props, {emit}) {
        const updateValue = function(event) {
          emit('update:modelValue', event.target.checked)
        }
        return {
          updateValue
        }
      }
    })
    app.mount('#demo')
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tailwindcss/2.2.18/tailwind.min.css" integrity="sha512-JfKMGsgDXi8aKUrNctVLIZO1k1iMC80jsnMBLHIJk8104g/8WTaoYFNXWxFGV859NY6CMshjktRFklrcWJmt3g==" crossorigin="anonymous" referrerpolicy="no-referrer" />
    <script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
    <div id="demo">
      <div>
        <div class="mt-6" v-for="box in status">
          <Checkbox v-model="box.status" :value="box.label" :label="box.label" name="status"></Checkbox>
        </div>
        <div class="mt-3">{{status}}</div>
      </div>
    </div>

    回覆
    0
  • 取消回覆