【发布时间】:2019-07-07 23:00:34
【问题描述】:
useState 中的选择变量并不总是更新。 在下面的代码中,我显示了上下文文件和我的选择组件。上下文文件保存我的反应应用程序的全局状态,并且选择组件通过 setChoices 方法来更新 GameContext 中的状态。我的 setChoices 方法应该更新每个选项的值,但状态只是随机更新,而不是每次更新。
//GameContext file
import React, { createContext, useState } from 'react';
export const GameContext = createContext();
const GameContextProvider = props => {
const [gameItems, setGameItems] = useState({
user: {choice: null, score: 0},
cpu: {choice: null, score: 0}
})
const setChoices = (userChoice, cpuChoice) => {
setGameItems({
...gameItems,
user:{...gameItems.user, choice: userChoice},
cpu: {...gameItems.cpu, choice: cpuChoice}
});
}
const cpuScore = () => {
setGameItems({
...gameItems,
cpu:{...gameItems.cpu, score: gameItems.cpu.score + 1}
})
return (
<GameContext.Provider value={{gameItems, setChoices}}>
{ props.children }
</GameContext.Provider>
)
}
//choices component
import React, { useContext } from 'react';
import { GameContext } from '../contexts/GameContext';
const Choices = (props) => {
const { setChoices } = useContext(GameContext);
const getCpuChoice = () => {
const cpuChoices = ['r', 'p', 's'];
const randomIndex = Math.floor((Math.random() * 3));
const cpuDecision = cpuChoices[randomIndex];
return cpuDecision
}
const playGame = (e) => {
const userChoice = e.target.id;
const cpuChoice = getCpuChoice();
setChoices(userChoice, cpuChoice);
cpuScore();
}
return (
<div>
<h1>Make Your Selection</h1>
<div className="choices">
<i className="choice fas fa-hand-paper fa-10x" id="p" onClick={playGame}></i>
<i className="choice fas fa-hand-rock fa-10x" id="r" onClick={playGame}></i>
<i className="choice fas fa-hand-scissors fa-10x" id='s' onClick={playGame}></i>
</div>
</div>
)
}
我希望用户和 cpu 的选择属性在每次调用 setChoices 时都会更新。我更新状态的方式有问题吗?
【问题讨论】:
标签: reactjs react-hooks