Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

133
Vistas
Set State inside method onClick

I am trying to set the state inside a method, i have a simple voting system (Yes or No) if you click Yes the state needs to be a string up and if you click No the state needs to be down

I am having trouble merging the method voteHandler and setVote

Here is my component :

import React, { useState, useContext } from 'react';
import {AnswerContext} from './AnswerWrapper';

const AnswerItem = (props) => {

    let indexPlus;

    const indexCount = (index) => {
        indexPlus = index;
        return indexPlus;
    }

    const { active, setActive } = useContext(AnswerContext)

    const [vote, setVote] = useState();

    const voteHandler = (e, index) => {
        e.preventDefault();
        setActive(index);
        setVote(""); // this might be "up" or "down"
        // I am sending this to a parent component
        props.onVote ({
            vote : vote,
            answerID : index
        })
    }

    return (
        <div>
            <button onClick={(e) => voteHandler(e, props.index)}>Yes <span>({props.ups !== null ? props.ups : 0 })</span></button>
            <button onClick={(e) => voteHandler(e, props.index)}>No <span>({props.downs !== null ? props.downs : 0 })</span></button>
        </div>
    )
}

export default AnswerItem;
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

You can send the value when you bind the onClick:

<button onClick={(e) => voteHandler(e, props.index, 'up')}>Yes <span>({props.ups !== null ? props.ups : 0 })</span></button>
<button onClick={(e) => voteHandler(e, props.index, 'down')}>No <span>({props.downs !== null ? props.downs : 0 })</span></button>

And use that in your voteHandler:

    const voteHandler = (e, index, value) => {
        e.preventDefault();
        setActive(index);
        setVote(value); // this might be "up" or "down"
        // I am sending this to a parent component
        props.onVote ({
            vote : vote,
            answerID : index
        })
    }

Warning

When you do:

        setVote(value); // this might be "up" or "down"
        // I am sending this to a parent component
        props.onVote ({
            vote : vote,
            answerID : index
        })

You will not get the updated vote since setState is asynchronous. If you want to call props.onVote on every vote and active change, use a useEffect:

const AnswerItem = (props) => {

    let indexPlus;

    const indexCount = (index) => {
        indexPlus = index;
        return indexPlus;
    }

    const { active, setActive } = useContext(AnswerContext)

    const [vote, setVote] = useState();
   
    useEffect(() => {
        props.onVote ({
            vote : vote,
            answerID : active
        })
    }, [vote, active])

    const voteHandler = (e, index) => {
        e.preventDefault();
        setActive(index);
        setVote("");
    }

    return (
        <div>
            <button onClick={(e) => voteHandler(e, props.index)}>Yes <span>({props.ups !== null ? props.ups : 0 })</span></button>
            <button onClick={(e) => voteHandler(e, props.index)}>No <span>({props.downs !== null ? props.downs : 0 })</span></button>
        </div>
    )
}
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda