我正在做一个项目,每次单击SelectCard
函数时,我都必须显示卡片并重新排序它们。问题是,在单击该函数并且setPictures
方法成功更新pictures
变量后,HTML不会呈现新值。
我已经尝试在每次对pictures
重新排序时创建不同的ID,但仍然得到相同的结果。
下面是我的代码:
import { useState, useEffect } from 'react';
import '../styles/main.css';
import HarryPotter from '../images/Harry-Potter.png';
import AlbusDumbledore from '../images/Albus-Dumbledore.jpg';
import BellatrixLestrange from '../images/Bellatrix-Lestrange.png';
import Boddy from '../images/Dobby.png';
import { v4 } from 'uuid';
function Main(){
var arrPictures = [
{
id: 1,
name: "Harry Potter",
src: HarryPotter
},
{
id: 2,
name: "Albus Dumbledore",
src: AlbusDumbledore,
},
{
id: 3,
name: "Bellatrix Lestrange",
src: BellatrixLestrange,
},
{
id: 4,
name: "Boddy",
src: Boddy,
},
];
const [score, setScore]=useState(0);
const [highest, setHighest]=useState(0);
const [pictures, setPictures]=useState(arrPictures);
function shuffleArray(arr) {
for (let i = arr.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[arr[i], arr[j]] = [arr[j], arr[i]];
}
return arr;
}
async function SelectCard(){
const arr = shuffleArray(pictures);
await setPictures(arr);
console.log(pictures);
}
return (
<main>
<div id="score">
<p>Current score: { score }</p>
<p>Highest score: { highest }</p>
</div>
<div id="instructions">
<p>Click to select a different card each round.</p>
</div>
<div id="cards">
{pictures.map((picture) => (
<div className="card" key={ picture.id } onClick={ SelectCard }>
<img src={ picture.src } alt="Harry Potter character."></img>
<p>{ picture.name }</p>
</div>
))}
</div>
</main>
);
}
export default Main;
1条答案
按热度按时间hmae6n7t1#
我解决了你的问题!
您的选择卡功能应该是这样的
说明:由于JS中的对象保存为链接,React不会看到您的状态变化之间的差异,因为类似的对象一直在传递。您需要创建新的对象来更新状态。
P.S1你不需要异步函数SelectCard和它里面的await。另外,你应该保持命名函数的约定,把它重命名为selectCard。
P.S2你根本不需要前两个状态(也许你以后会解决它,然后就可以了)。你可以只创建一个变量:)
希望能帮上忙