reactjs UseContext()不更新我的状态变量并跟踪以前的

8yparm6h  于 2022-12-22  发布在  React
关注(0)|答案(1)|浏览(312)

在ReactJS. TLDR中使用上下文时,我有一个非常具体的问题:我使用两个上下文,一个用于存储用户详细信息的用户,一个用于存储任务详细信息的任务。如果注册了新令牌(新登录),我的用户上下文将更新用户名

const [username, setUserName] = useState();
  const [token, setToken] = useState();

  useEffect(() => {
    const user = Pool.getCurrentUser();
    if (user) {
      setUserName(user.username);
    }
  }, [token]);

然后我有一个任务上下文,它使用用户上下文中的用户名执行一个获取API调用。但是当我查看日志时,它会跟踪以前的用户名,并且只在刷新时更新它。

function TasksProvider({ children }) {
  const { username } = useContext(AccountContext);
  //console.log(username);
  const [todos, setTodos] = useState([]);
  const fetchTasks = async () => {
    const result = await getAllTasks(username);
    setTodos(result);
  };

  useEffect(() => {
    fetchTasks();
  }, []);

下面是我的上下文提供程序

function ContextProvider({ children }) {
  return (
    <AccountContext>
      <CategoriesContext>
        <PathContext>
          <TasksContext>{children}</TasksContext>
        </PathContext>
      </CategoriesContext>
    </AccountContext>
  );
}

我基本上希望我的TaskContext在每次新用户登录时也有新的用户名。绝对不要跟踪以前的用户名。我已经尝试过状态,并试图在令牌发生变化时更新,但似乎无法理解它。

kt06eoxx

kt06eoxx1#

useEffect调用中缺少作为依赖项的username

useEffect(() => {
    fetchTasks();
  }, [username]);

如果添加了这个变量,那么每当用户名更改时都会调用fetchTasks()
您可以使用React文档中提到的eslint插件“eslint-plugin-react-hooks”来避免这些问题:https://reactjs.org/docs/hooks-rules.html#eslint-plugin

相关问题