Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

191
Views
Elimine un componente específico mientras realiza una representación dinámica (VueJS)

Estoy creando un montón de componentes dinámicamente y todos estos componentes son iguales (literalmente no hay diferencia entre ellos). Cuando presiono el botón Intro, se crea un nuevo componente y, de hecho, me gustaría encontrar una manera de eliminar uno de estos componentes generados dinámicamente. Los componentes con los que estoy tratando son campos de entrada que tienen un botón en el lado derecho para la función de eliminación. Me esforcé mucho para crear la función de eliminación, pero en realidad no funciona y cada vez que presiono el botón Eliminar, literalmente elimina otro componente. Aquí está la aplicación . Me gustaría eliminar los componentes de forma correcta. Cada botón elimina su entrada relacionada

Aquí está el componente hijo

 <template> <div> <div class="dynamiccomponent" @keyup.enter="addNewInput"> <input type="text"> <button @click="deleteInput()">X</button> </div> </div> </template> <script> export default { methods:{ addNewInput(){ this.$emit('newInput') }, deleteInput(){ this.$emit('deleteInput') } } } </script> <style> .dynamiccomponent{ display:flex; margin-top:10px; } button{ background-color:red; } input[type="text"]{ border:none; background-color:#ccc; color:black; } </style>

Aquí está el componente principal:

 <template> <div class="parent"> <div class="flexbox" v-for="(input,index) in inputs" :key="index"> <DynamicInputs @newInput="addNewInput" @deleteInput=deleteInput(index) /> </div> </div> </template> <script> import DynamicInputs from './components/DynamicInputs.vue' export default { components:{ DynamicInputs, }, data(){ return{ id : 0, inputs : [[DynamicInputs,0]], } }, methods:{ addNewInput(){ this.id=this.id +1 this.inputs.push([DynamicInputs,this.id]) }, deleteInput(index) { console.log(index) this.inputs = this.inputs.filter(input => input[1] !== index) return this.inputs } } } </script>
about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Creo que su problema es que una vez que elimina un elemento que no es el último de la lista, sus índices que configura manualmente están desordenados.

si empiezo con:

 const inputs = [ ["a", 0], ["b", 1], ["c", 2] ]

y elimino el segundo elemento con el que termino:

 const inputs = [ ["a", 0], ["c", 2] ]

Los índices que establecí inicialmente ahora ya no son consistentes.

Mi consejo es seguir un enfoque completamente diferente.

  1. Definir una lista de entradas. Por ejemplo, las inputs = ["a", "b", "c"] se utilizarán para representar 3 DynamicInputs. A cada DynamicInput se le pasa una de esas cadenas.

  2. Comunique los cambios a un DynamicInput de regreso al padre. Esto se puede hacer mejor a través de v-model y una propiedad calculada basada en su prop. En la propiedad calculada, define un getter y un setter. En el setter, emite un evento de vuelta al elemento principal, de modo que el cambio de valor se puede realizar en el componente principal.

  3. eliminar mediante empalme. Con el empalme, puede decirle a una matriz dónde (y cuántos) elementos eliminar de la matriz

Así es como puede verse el componente principal

 <template> <div class="parent"> <div class="flexbox" v-for="(inputVal, index) in inputs" :key="index"> <DynamicInputs :input-value="inputVal" @change-input="changeInput($event, index)" @new-input="addNewInput" @delete-input="deleteInput(index)" /> </div> </div> </template> <script> import DynamicInputs from "./DynamicInput.vue"; export default { components: { DynamicInputs, }, data() { return { inputs: ["a", "b", "c", "d"], }; }, methods: { changeInput(data, index) { this.inputs[index] = data; }, addNewInput() { this.inputs.push(""); }, deleteInput(index) { this.inputs.splice(index, 1); }, }, }; </script>

y así es como el componente DynamicInput

 <template> <div> <div class="dynamiccomponent" @keyup.enter="addNewInput"> <input v-model="computedInput" type="text" /> <button @click="deleteInput()">X</button> </div> </div> </template> <script> export default { emit: ["new-input", "delete-input", "change-input"], props: ["input-value"], methods: { addNewInput() { this.$emit("new-input"); }, deleteInput() { this.$emit("delete-input"); }, }, computed: { computedInput: { get: function () { return this.inputValue; }, set: function (newVal) { this.$emit("change-input", newVal); }, }, }, }; </script> <style> .dynamiccomponent { display: flex; margin-top: 10px; } button { background-color: red; } input[type="text"] { border: none; background-color: #ccc; color: black; } </style>
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!