【发布时间】:2021-08-04 17:36:32
【问题描述】:
我在 App.js 中有一个全局变量 plyViewed,它设置在我的 App 组件之外。
let plyViewed = 0;
function App() {
它监控棋盘游戏的动作。板下方是一些导航按钮。如果你点击< 我做plyViewed--,如果你点击我做plyViewed++。你明白了。
这一切都很好,直到我重构!
我拿了导航按钮,谁的 JSX 代码都在 App() 函数中,并把它放在 <MoveButtons /> 中的 MoveButtons.js 中。所以,我想我可以将plyViewed 作为道具传递,然后在MoveButton 子组件中更新我的代码中的值。然后我发现道具是不可变的!现在我被卡住了。
下面的代码给出了我如何使用plyViewed 代码的示例。当有人点击导航按钮时,它会触发一个事件,触发代码更新plyViewed,尽管现在它不再工作了,因为它是一个道具。其余的游戏数据存储在一个名为 gameDetails 的对象中。
我像这样传递plyViewed:
<MoveButtons
plyViewed={plyViewed}
// etc.
/>
下面是我的MoveList 组件的简化版本。
plyViewed 在我的应用程序的多个区域中使用,例如gameDetails。我考虑过将它放在gameDetails 对象中,但我仍然遇到gameDetails 作为道具传递时不可变的问题。然后如果我将plyViewed 设置为状态变量,它就会变成异步的,因此不适合在计算中使用。
我认为这一切都错了吗?
export default function MoveButtons(props) {
return (
<Grid item xs={6}>
<Button
variant="contained"
color="primary"
size="large"
style={{ maxWidth: props.buttonWidth, minWidth: props.buttonWidth }}
onClick={() => {
if (props.plyViewed > 0) {
props.plyViewed--;
props.board.current.setPosition(props.fenHistory[props.plyViewed]);
props.setFen(props.fenHistory[props.plyViewed]);
props.setSelectedIndex(props.plyViewed);
}
}}
>
<NavigateBeforeIcon />
</Button>
<Button
variant="contained"
color="primary"
size="large"
style={{ maxWidth: props.buttonWidth, minWidth: props.buttonWidth }}
onClick={() => {
if (props.plyViewed < props.fenHistory.length - 1) {
props.plyViewed++;
props.board.current.setPosition(props.fenHistory[props.plyViewed]);
props.setFen(props.fenHistory[props.plyViewed]);
props.setSelectedIndex(props.plyViewed);
}
}}
>
<NavigateNextIcon />
</Button>
</Grid>
);
}
【问题讨论】:
-
嗨 Jon,尝试使用 Redux 管理全局状态
-
不可变道具的参考:
props.plyViewed++改变了 React 中的 props, which are immutable(即使不可执行)。 -
@AyoubGharbi 是的,我看了一下 Redux,虽然它对我来说似乎很复杂,并且想知道 Context 是否可能是一个更简单的解决方案?
标签: javascript reactjs