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

111
Visualizações
Obtener múltiples valores de casilla de verificación de reaccionar no funciona

Tengo un pequeño proyecto de reacción que contiene un formulario, estoy tratando de obtener múltiples valores de una casilla de verificación, pero cada vez que hago clic en un elemento (casilla de verificación) por primera vez, comienza como nulo, luego cuando hago clic en otro elemento, Almacena el primer artículo. Me gustaría almacenar varios elementos de una casilla de verificación. Aquí está el código a continuación.

 import { useState } from "react"; const Toppings = () => { const [toppings, setToppings] = useState(null) const [toppingsArray, setToppingsArray] = useState([]) function handleCheck(event) { if (event.target.checked) { setToppings({ "type": event.target.id, "price": event.target.value }) console.log("toppings: ", toppings) toppingsArray.push(toppings) setToppingsArray([toppings]) console.log("toppings array: ", toppingsArray) } } return ( <> <h2>you can select multiple</h2> <form> <label htmlFor="pepperoni"> <input onChange={handleCheck} type="checkbox" name="pepperoni" id="pepperoni" value={300} /> pepperoni </label> <label htmlFor="cheese"> <input onChange={handleCheck} type="checkbox" name="cheese" id="cheese" value={200} /> cheese </label> <label htmlFor="onions"> <input onChange={handleCheck} type="checkbox" name="onions" id="onions" value={100} /> onions </label> </form> <p>you have selected {JSON.stringify(toppings)}</p> <p>you have {JSON.stringify(toppingsArray)}</p> </> ) } export default Toppings[enter image description here][1];
about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

Deshazte de la línea que dice toppingsArray.push(toppings) ya que toppingsArray está en estado, por lo que es inmutable

Agregue una línea que cambie la línea setToppingsArray a

 setToppingsArray(toppingsArray=>[...toppingsArray, toppings])

El enlace useState se puede usar como una función cuyo primer parámetro proporciona el estado inicial. Luego simplemente tomamos ese estado y lo extendemos en una matriz y agregamos lo nuevo


Tampoco hay razón para almacenar los ingredientes iniciales en el estado ya que no tiene interacción con el dom. Puede ser una const js

También debe tener un atributo marcado en las casillas de verificación que verifique si un complemento es la matriz de ingredientes.

about 4 years ago · Juan Pablo Isaza Relatório

0

Utilice este código.

 function handleCheck(event) { const item = { "type": event.target.id, "price": event.target.value }; if (event.target.checked) { setToppings(item); if(toppingsArray.map(val => val["type"]).indexOf(item["type"]) == -1) setToppingsArray([...toppingsArray, item]); } else { setToppingsArray(toppingsArray.filter(val => val["type"] != item["type"])); } }
about 4 years ago · Juan Pablo Isaza Relatório

0

Hay varias cosas que no están bien en su código.

  1. setState es una operación asíncrona, lo que significa que console.log("toppings: ", toppings) justo después de setState le mostrará el estado obsoleto.
  2. En la siguiente línea, está insertando los ingredientes en toppingsArray , pero los ingredientes contienen los datos obsoletos.
  3. En la siguiente línea, tiene setToppingsArray([toppings]) , que también es incorrecto porque ha enviado los datos a toppingsArray, por lo que necesita actualizar el estado pasando esa matriz, como este setToppingsArray(toppingsArray) .
  4. Además, mientras empuja los ingredientes en la matriz, debe verificar si los ingredientes ya existen o no.

Para resolver todos estos problemas, podría hacer algo como esto dentro de su función handleCheck :

 function handleCheck(event) { const newToppings = { type: event.target.id, price: event.target.value, }; if (event.target.checked) { setToppings(newToppings); toppingsArray.findIndex(top => top.type === newToppings.type) < 0 && setToppingsArray([...toppingsArray, newToppings]); } else { setToppingsArray(toppingsArray.filter(top => top.type !== newToppings.type)); } }
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