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

149
Vistas
La actualización del estado de reacción no funciona con setState

Bien entonces es simple

Tengo una serie de respuestas dentro de una serie de preguntas. el usuario tiene la opción de seleccionar más de una respuesta.

Cuando se selecciona una respuesta, el texto debe cambiar a seleccionada y no seleccionada si no está seleccionada.

Estos son los pasos que he probado para actualizar mi estado

paso 1 usando el mapa

 setTestInfo((state) => { const allStateQuestions = state.info.questions; const currentQuestion = allStateQuestions.filter( (question) => question.id === questionId )[0]; const allAnswersMap = currentQuestion.answers.map((answer) => answer.id === answerId ? (() => { answer.is_chosen = !answer.is_chosen; return answer; })() : answer ); currentQuestion.answers = allAnswersMap; return { ...state, info: { ...state.info, questions: allStateQuestions, }, }; });

paso 2 usando buscar

 setTestInfo((state) => { const allStateQuestions = state.info.questions; const currentQuestion = allStateQuestions.filter( (question) => question.id === questionId )[0]; const currentAnswer = currentQuestion.answers.find( (answer) => answer.id === parseInt(answerId) ); currentAnswer.is_chosen = !currentAnswer.is_chosen; // i even went to the extend of reassigning it yet it doesn't work currentQuestion.answers.filter((answer) => answer.id === answerId)[0] = currentAnswer; return { ...state, info: { ...state.info, questions: allStateQuestions, }, }; });

Bueno, después de usar las lógicas de muestra anteriores, ninguna de ellas parece funcionar. Gracias de antemano.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Tema

Estás mutando el estado en ambos casos. Cubriré el primer fragmento.

 setTestInfo((state) => { const allStateQuestions = state.info.questions; // <-- reference to state const currentQuestion = allStateQuestions.filter( // <-- reference to state (question) => question.id === questionId )[0]; const allAnswersMap = currentQuestion.answers.map((answer) => answer.id === answerId ? (() => { answer.is_chosen = !answer.is_chosen; // <-- state mutation!! return answer; })() : answer ); currentQuestion.answers = allAnswersMap; // <-- state mutation!! return { ...state, info: { ...state.info, questions: allStateQuestions, // <-- saved reference back into state }, }; });

El objeto currentQuestion.answers del estado state.info.questions se mutó y la referencia de la matriz state.info.questions nunca cambió, por lo que React no "ve" esto como una actualización y no activa una nueva representación.

Solución

Aplicar el patrón de actualización inmutable. Debe copiar superficialmente todas las actualizaciones en una nueva matriz y referencias de objetos.

 setTestInfo((state) => { return { ...state, info: { ...state.info, // new questions array questions: state.info.questions.map(question => question.id === questionId ? { // new question object ...question, // new answers array answers: question.answers.map(answer => answer.id === answerId ? { // new answer object ...answer, is_chosen: !answer.is_chosen, } : answer ), } : question ), }, }; });
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