Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

182
Visualizações
Componente de casilla de verificación personalizada de Vue 3 con modelo v y variedad de elementos

Necesito desesperadamente su ayuda chicos.

Básicamente, tengo un componente de casilla de verificación personalizado con un modelo v . Uso un bucle v-for en el componente para mostrar casillas de verificación con los nombres de la matriz. En el componente principal tengo dos columnas Disponible y Seleccionado. La idea es que si marque una de las casillas de la columna Disponible , debería aparecer en la columna Seleccionado . El problema es que muestra letra por letra y no el nombre completo.

Puedo lograr el resultado deseado sin tener un componente de casilla de verificación, pero dado que necesitaré muchas casillas de verificación en mi proyecto, quiero tener un componente para él.

Siga el enlace para el código: CodeSandBox

No importa la diferencia en el estilo.

El problema:

Problema

El resultado deseado:

Resultado deseado

about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Hay dos problemas. El primer problema es que tiene su v-model v establecido en v-model="filter.filterCollection" , por lo que una casilla de verificación que seleccione se almacenará en la matriz como una cadena y si selecciona otra casilla de verificación, la cadena se sobrescribe. El segundo problema es que llamas a esa cadena almacenada como una matriz. Eso hace que su cadena, que es una matriz de letras, se represente para cada letra. Entonces 'Número' es como ["N", "u", "m", "b", "e", "r"] .

Para resolver su problema, debe almacenar cada selección con su propia referencia en su v-model . Para cubrir sus necesidades de listado correcto y eliminación correcta, debe aplicar los siguientes cambios:

Tu casilla de verificación

 <Checkbox v-for="(item, index) in items" :key="item.id" :label="item.name" :id="index" :isChecked="isChecked(index)" // this is new @remove-selected-filter="removeSelectedFilter" // This is new :modelValue="item.name" v-model="filter.filterCollection[index]" // Change this />

tu v-modelo

 filter: { filterCollection: {} // Object instead of array }

Métodos en FilterPopUp.vue

 methods: { removeSelectedFilter(index) { delete this.filter.filterCollection[index]; }, isChecked(index) { return !!this.filter.filterCollection[index]; } }

Su Checkbox.vue:

 <template> <label> <p>{{ label }}</p> <input type="checkbox" :id="id" :value="modelValue" :checked="isChecked" @change="emitUncheck($event.target.checked)" @input="$emit('update:modelValue', $event.target.value)" /> <span class="checkmark"></span> </label> </template> <script> export default { name: "Checkbox", props: { modelValue: { type: String, default: "" }, isChecked: Boolean, label: { type: String }, value: { type: Array }, id: { type: Number }, }, methods: { emitUncheck(event) { if(!event){ this.$emit('remove-selected-filter', this.id); } } } }; </script>

Esto ahora debería mostrar sus elementos correctamente, eliminar los elementos correctamente y anular la selección de las casillas de verificación después de eliminar los elementos.

about 4 years ago · Juan Pablo Isaza Relatório

0

StevenSiebert ha señalado correctamente sus errores.

Pero su solución no es completa, ya que los filtros no se eliminarán de la colección al desmarcar uno de ellos.

Aquí está mi solución completa de su casilla de verificación que funciona como se esperaba:

Casilla de verificación.vue

 <template> <label> <p>{{ label }}</p> <input type="checkbox" :id="id" v-model="checked" @change="$emit('change', { id: this.id, checked: this.checked})" /> <span class="checkmark"></span> </label> </template> <script> export default { name: "Checkbox", props: { modelValue: { type: Boolean, default: false }, label: { type: String }, id: { type: Number }, }, emits: ["change"], data() { return { checked: this.modelValue }; } }; </script>

FilterPopUp.vue

 <template> ... <Checkbox v-for="(item, index) in items" :key="index" :label="item.name" :id="index" @change="onChange" /> ... </template> <script> ... methods: { removeSelectedFilter(index) { this.filter.filterCollection.splice(index, 1); }, onChange(args) { const {id, checked} = args; const item = this.items[id].name; if (checked) { if (this.filter.filterCollection.indexOf(item) < 0) { this.filter.filterCollection.push(item); } } else { this.filter.filterCollection = this.filter.filterCollection.filter( i=> i != item); } }, }, ...

Aquí está el CodeSandbox de trabajo:

https://codesandbox.io/s/pensive-shadow-ygvzb?file=/src/components/Checkbox.vue

Claro, hay muchas maneras de hacerlo. Si alguien tiene una forma mejor y más corta de hacerlo, publique su solución. Será interesante mirarlo.

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda