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

169
Visualizações
¿Cuál es la forma correcta de calcular el precio dado en las casillas de verificación y la cantidad dentro de React?

Los clientes están seleccionando artículos de restaurante que tienen opciones como ingredientes. Estoy usando casillas de verificación para permitir que el cliente seleccione qué opciones, y cada casilla de verificación tiene el precio agregado de la opción dentro del atributo de valor HTML.

También hay un componente de cantidad que usa una devolución de llamada para modificar un estado React.

(ejemplo de casillas de verificación y selección de cantidad)

El código que se me ocurrió para manejar todo esto es el siguiente:

 const [basePrice, setBasePrice] = useState(0); const [price, setPrice] = useState(0); useEffect(() => { let insert = parseFloat(props.item.price); setBasePrice(insert.toFixed(2)); setPrice(insert.toFixed(2)); setQuant(1); }, [props.item]) useEffect(() => { calcPrice(); }, [quant]) const calcPrice = () => { let checked = document.querySelectorAll('input:checked'); let insert = parseFloat(basePrice); for (let i of checked) { insert += parseFloat(i.value); } insert *= parseFloat(quant); setPrice(insert.toFixed(2)); }

calcPrice() también se llama dentro del atributo onchange del div que contiene todas las casillas de verificación. Cada vez que un cliente hace clic en una casilla de verificación, llama a calcPrice() .

el primer useEffect() simplemente restablece el precio de visualización ( setPrice(insert.toFixed(2) ) y se ejecuta cada vez que el usuario selecciona un artículo diferente.

El problema que tengo es que cada vez que el cliente selecciona una opción, aumenta la cantidad y luego cambia a un artículo nuevo, no muestra el precio correcto. Llama al segundo useEffect() antes de dejar marcado = document.querySelectorAll() tiene la posibilidad de ejecutarse y utiliza las casillas marcadas del último elemento.

el precio tiene los $3 del último artículo

Pasé una semana y media completa tratando de combinar la cantidad y las casillas de verificación correctamente y, sabiendo que probablemente soy demasiado estúpido para ver la solución obvia, estoy pidiendo ayuda en esto.

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

0

Eventualmente, decidí agregar otra variable de estado "primero" que utilizo para determinar si la cantidad cambió o no debido a que el cliente hizo clic en otro elemento, evitando que se ejecute el segundo useEffect() antes de dejarlo marcado = document.querySelectorAll('input :marcado') tuvo la oportunidad de hacerlo.

No me gusta esta solución en absoluto. Funciona, me alegro, pero se siente pirateado. Aquí está el código:

 const ItemModal = (props) => { const [quant, setQuant] = useState(1); const [basePrice, setBasePrice] = useState(0); const [price, setPrice] = useState(0); const [first, setFirst] = useState(false); useEffect(() => { let insert = parseFloat(props.item.price); setBasePrice(insert.toFixed(2)); setPrice(insert.toFixed(2)); setQuant(1); setFirst(true); }, [props.item]) if (!first || quant > 1) { calcPrice(); } if (first) { setFirst(false); } }, [quant]) const calcPrice = () => { let checked = document.querySelectorAll('input:checked'); let insert = parseFloat(basePrice); for (let i of checked) { insert += parseFloat(i.value); } insert *= parseFloat(quant); setPrice(insert.toFixed(2)); }

la línea || quant > 1 es necesario en la declaración if dentro del segundo useEffect() porque, de lo contrario, el botón de cantidad no funcionará correctamente cuando se seleccione un nuevo elemento. El cliente debe presionar el botón de cantidad al menos dos veces antes de que comience a funcionar, ya que primero se establece en falso en el primer clic.

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