首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >useCallback和React.memo访问状态

useCallback和React.memo访问状态
EN

Stack Overflow用户
提问于 2020-11-05 23:47:51
回答 1查看 231关注 0票数 0

我有一个functional component Board,在返回的JSX中,我遍历了一个2D数组,打印了一串正方形,并传递了一个处理程序和一些附加信息到每个正方形中。我想防止它们在Square接收相同的道具时重新渲染,这样Square组件就在React.memo()方法中。在我处理板子更新的板子组件中,我有useCallback的处理程序,所以我不会在重现过程中传递一个全新的函数。

我不明白的是,在clickHandler的主体中,我总是可以访问最新更新的2D数组,但我从来没有收到更改过的播放器,它总是停留在1。然而,状态本身被切换为2,反之亦然。如果我传递player作为依赖项,我所有的300+方块都会被obvs重新渲染。

我不会将状态作为一个道具传递给Square,我只是在棋盘上进行映射,并从棋盘本身传递值。

所以我的问题是,为什么我可以访问clickHandler中更新的棋盘,而不是播放器。因为当我点击我的一个方块时,它总是被player1获取,这是默认的。

链接到整个存储库(它只是几个组件):https://github.com/TreblaCodes/react-connect5

谢谢

代码语言:javascript
复制
    const [player, setPlayer] = useContext(PlayerContext)
    const [board, setBoard] = useContext(PositionsContext)

    const clickHandler = useCallback((x,y) => {
        let board_copy = [...board]
        board_copy[y][x] = player;
        setBoard(board_copy) 
        console.log(board) //updated
        setPlayer(player === 1 ? 2 : 1)
        console.log(player) // stays at 1
    },[])
EN

回答 1

Stack Overflow用户

发布于 2020-11-05 23:57:05

只需将player和board传入useCallback的第二个参数即可。然后,每当玩家或棋盘发生变化时,你就会得到回调的新实例。

如下所示:

代码语言:javascript
复制
const [player, setPlayer] = useContext(PlayerContext)
const [board, setBoard] = useContext(PositionsContext)

const clickHandler = useCallback((x,y) => {
    let board_copy = [...board]
    board_copy[y][x] = player;
    setBoard(board_copy) 
    console.log(board) //updated
    setPlayer(player === 1 ? 2 : 1)
    console.log(player) // stays at 1
},[player, board])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64700609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档