Hola gente de stackoverflow, sé que esto se ha preguntado un millón de veces. Sin embargo, no creo haber encontrado una respuesta a mi problema.
Para resumir, estoy actualizando un estado en mi aplicación nativa de reacción solo si una declaración es verdadera. Lo que estoy experimentando es que este estado no se actualiza de alguna manera.
const emptyArray = [] const [collapsed, setCollapsed] = useState(true); const [selectedGem, setSelectedGem] = useState(false); const [usedGem, setUsedGem] = useState(emptyArray); const [selectedPropType, setSelectedPropType] = useState('all'); const randomItem = (items) => { return items[Math.floor(Math.random()*items.length)]; } const getRandomQuestion = () => { let selectableGems = gems const maxGems = selectableGems.length; let tempGems = []; if(usedGem.length >= maxGems) { setUsedGem(emptyArray) } for (let i=0; i<maxGems; i++) { if(usedGem.length === 0 || usedGem.find(gem => gem === i) === undefined) { tempGems.push(i) } } const randomGemNumber = randomItem(tempGems) setUsedGem([...usedGem, randomGemNumber]) setSelectedGem(selectableGems[randomGemNumber]) } Básicamente if(usedGem.length >= maxGems) { ocurre solo cuando todas las gemas se han aleatorizado una vez (hay 130 elementos en la variable de gems ). Entonces esperaría que usedGem esté vacío for el pero este no es el caso.
He probado algunas soluciones que encontré sin suerte. ¡Sé que esto tiene que ver con async pero no puedo resolverlo! ¿Alguien podría ayudarme por favor?
Aquí esto podría ayudar. La cuestión es que no puede obtener una actualización instantánea después de configurar el estado
const getRandomQuestion = () => { let selectableGems = gems const maxGems = selectableGems.length; let tempGems = []; let gems = Array.from(usedGem); if(gems.length >= maxGems) { gems = [] } for (let i=0; i<maxGems; i++) { if(gems.length === 0 || gems.find(gem => gem === i) === undefined) { tempGems.push(i) } } const randomGemNumber = randomItem(tempGems) setUsedGem([...gems, randomGemNumber]) setSelectedGem(selectableGems[randomGemNumber]) }