代码之家  ›  专栏  ›  技术社区  ›  G-Man

如何用钩子处理设置状态的异步性

  •  0
  • G-Man  · 技术社区  · 4 年前

    const userList [ userList, setUserList ] = useState([]);
    
    const onEvent = (user) => {
        //then event fires again but previous setUserList has not finished setting the state
        //so it is not found in userList and then I find myself with 2 of the same users in the list
    
       if (userList.findIndex(u => u.name=== user.name) === -1)
          setUserList(userList=> [...userList, {name:user.name}]);
    }
    
    1 回复  |  直到 4 年前
        1
  •  3
  •   Nicholas Tower    4 年前

    setUserList的回调函数提供userList的最新值。所以在函数内部而不是外部执行检查。

    setUserList(previous => {
      if (previous.findIndex(u => u.name === user.name) === -1) {
        return [...previous, { name: user.name }];
      }
      return previous; // Since this line does not change the state, the component will not rerender
    });