我有一个巨大的游戏对象,它在渲染时附加到画布上。我想在创建组件时只创建一次,直到组件被销毁才删除它。
(如果游戏是定期创建和销毁的,那么用户将失去他们的游戏状态。假设我不想编辑游戏以将存储放入Context
或Redux
或其他东西中,并希望保持游戏原样..)
我看到至少三种方法可以做到这一点:
function Game1() {
const [world, _] = useState(createWorld) // unused setter
useEffect(() => world.destroy, [])
const attachCanvas = useCallback(canvas => world.start(canvas))
return <canvas ref={attachCanvas}/>
}
function Game2() {
const [world, setWorld] = useState()
useEffect(() => {
const newWorld = createWorld()
setWorld(newWorld)
return newWorld.destroy
}, []) // <- adding setWorld and newWorld dependencies can create loops
const attachCanvas = useCallback(canvas => world.start(canvas))
return <canvas ref={attachCanvas}/>
}
function Game3() {
// Works but docs say that a memo may be called twice if the engine feels like it
const world = useMemo(createWorld, [])
...
}
有什么问题Game1
吗?有没有第四种更好的方法来创建和销毁状态一次?