【发布时间】:2021-02-06 09:56:36
【问题描述】:
我正在尝试通过构建 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 正在被触发,我没想到它会这样。我原以为只有当我将视图更改为另一个视图时它才会卸载。
知道为什么会这样吗?如果我写的东西没有意义,请随时问我。
【问题讨论】:
标签: javascript reactjs state react-component-unmount