#javascript #reactjs #state
Вопрос:
Я учусь реагировать, и я думаю, что мне не хватает чего-то фундаментального в обновлении компонентов состояния / рендеринга.
const allFalse = new Array(data.length)
const allTrue = new Array(data.length)
allFalse.fill(false)
allTrue.fill(true)
const [memoryStatus, setMemoryStatus] = useState(allFalse)
const [baseValue, setBaseValue] = useState(false)
На данный момент в игре на память есть 5 карт (только что изученных здесь), и в зависимости от состояния памяти определяется, отображается ли та или иная сторона (правда / ложь).
При нажатии на карту я, очевидно, хочу изменить значение этой карты в массиве. Я делаю это с помощью этой функции:
const handleChange = (position) => {
const newMemoryStatus = memoryStatus.map((item, index) =>
{
if(index === position) {
return !item
}
else return item
}
)
// i really dont understand why this does not change the state
setMemoryStatus[newMemoryStatus]
}
Часть рендеринга-это:
<div className={styles.container}>
{data.map((item, index) => {
return (
<div
key={index}
onClick={() => {handleChange(index)}}
className={styles.card}
>
{!memoryStatus[index] amp;amp; <Image
src={item.img}
width="100px"
height="100px"
/>}
<span>
<center>
{memoryStatus[index] ? item.latinName : ''}
</center>
</span>
</div>
)})
}
</div>
На всякий случай, если это имеет значение, мои данные выглядят так:
const data = [
{
name: 'Staande geranium',
latinName: 'Pelargonium zonate',
img: '/../public/1.png'
},
{
name: 'Groot Afrikaantje',
latinName: 'Tagetes Erecta',
img: '/../public/2.png'
},
{
name: 'Vuursalie',
latinName: 'Salvia splendens',
img: '/../public/3.png'
},
{
name: 'Kattenstaart',
latinName: 'Amaranthus caudatus',
img: '/../public/4.png'
},
{
name: 'Waterbegonia',
latinName: 'Begonia semperflorens',
img: '/../public/5.png'
}]
Что я делаю не так??
Комментарии:
1. Не могли бы вы дать нам вывод
console.log(newMemoryStatus)
handleChage
функции in, преждеsetMemoryStatus[newMemoryStatus]
чем проверять, правильно ли обновляется массив, пожалуйста?
Ответ №1:
setMemoryStatus
является функцией, поэтому при ее вызове вы должны использовать круглые скобки ()
вместо скобок []
. Линия для вызова должна быть:
setMemoryStatus(newMemoryStatus);
Комментарии:
1. о, вау, я смотрю на это уже 6 часов … типично. огромное спасибо!!