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

150
Visualizações
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 Respostas
Responde à pergunta

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 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