我正在尝试通过构建 Web 应用程序来学习 React。由于我想一步一步地学习,所以目前我不使用 Redux,我只使用 React 状态,我有一个问题。
这是我的组件架构:
App.js
|
_________|_________
| |
Main.js Side.js
| |
Game.js Moves.js
如您所见,我有一个名为 的主文件App.js
,在左侧我们有Main.js
一个应用程序的中心部分,其中包含Game.js
我的游戏实际发生的位置。在右侧,我们有Side.js
一个侧边栏,我想在其中显示每个玩家在游戏中所做的动作。它们将显示在Moves.js
.
为了更清楚地思考国际象棋游戏。在左边你实际玩游戏,在右边你的动作将被列出。
现在我将向您展示我的代码并解释问题所在。
// App.js
const App = React.memo(props => {
let [moveList, setMovesList] = useState([]);
return (
<React.Fragment>
<div className="col-8">
<Main setMovesList={setMovesList} />
</div>
<div className="col-4">
<Side moveList={moveList} />
</div>
</React.Fragment>
);
});
// Main.js
const Main = React.memo(props => {
return (
<React.Fragment>
<Game setMovesList={props.setMovesList} />
</React.Fragment>
);
});
// Game.js
const Game= React.memo(props => {
useEffect(() => {
function executeMove(e) {
props.setMovesList(e.target);
}
document.getElementById('board').addEventListener('click', executeMove, false);
return () => {
document.getElementById('board').removeEventListener('click', executeMove, false);
};
})
return (
// render the game board
);
});
// Side.js
const Side= React.memo(props => {
return (
<React.Fragment>
<Moves moveList={props.moveList} />
</React.Fragment>
);
});
// Moves.js
const Moves= React.memo(props => {
let [listItems, setListItems] = useState([]);
useEffect(() => {
let items = [];
for (let i = 0; i < props.moveList.length; i++) {
items.push(<div key={i+1}><div>{i+1}</div><div>{props.moveList[i]}</div></div>)
}
setListItems(items);
return () => {
console.log('why this is being triggered on each move?')
};
}, [props.moveList]);
return (
<React.Fragment>
{listItems}
</React.Fragment>
);
});
正如您在我的代码中看到的那样,我已经在App.js
. 在左侧,我传递了根据玩家的动作更新状态的函数。在右侧,我传递状态以更新视图。
Game.js
我的问题是,组件内的每个单击事件都会Moves.js
卸载并且console.log
正在被触发,我没想到它会表现得像那样。我期待它只会在我将视图更改为另一个视图时卸载。
知道为什么会这样吗?如果我写的东西没有意义,请随时问我。