当前位置: 首页 > 知识库问答 >
问题:

钩子用户发送2次

扶开诚
2023-03-14

我有一个authentication.reducer.js与:

export default function(state = initialState, action ){
switch(action.type) {
    case SET_CURRENT_USER:
        return {
            ...state,
            isAuthenticated: !isEmpty(action.payload),
            user: action.payload
        }

    default: 
        return state;
}}

以及我的带有useReducer钩子的提供者上下文。以及一个useEffect钩子,用于调度操作“setCurrentUser”,并在客户端登录时将“isAuthenticated”设置为true。

import authReducer from "./reducers/authentication.reducer";
...
const [stateUser, dispatch] = useReducer(authReducer, {
    isAuthenticated: false,
    user: {}
});

useEffect(()=>{
    if (localStorage.jwt) {
        const decoded = localStorage.jwt;
      
        dispatch(setCurrentUser(decoded));
    }
},[])

我放了一个控制台。在我的组件中记录(stateUser.isAuthenticated),这将显示“false”(初始值),然后显示“true”(分派)
我需要将状态(stateUser.isAuthenticated)传递给其他子组件,但不需要传递初始值(“false”)。

我有一个仪表板组件(仅用于登录的用户),在我的useEffect中,我需要执行以下操作:

if(!context.stateUser.isAuthenticated) {
        props.history.push('/login');
        
}

在我的登录中:

if(context.stateUser.isAuthenticated) {
        props.history.push('/');
}

这很有效。如果我已登录并转到“/”即可,如果我转到“/”登录,则会重定向到“/”。

但问题是重新渲染在调度和用户减少。状态去:假-

如何防止这种影响?/-

共有1个答案

邬承悦
2023-03-14

我的建议是将isAuthenticated设置为null以启动,并且仅在状态显式设置为true或false时调用历史函数,如下所示:

if (context.stateUser.isAuthenticated === false) {
    props.history.push('/login');
}

if (context.stateUser.isAuthenticated === true) {
    props.history.push('/');
}

确保使用三重等于使比较成为严格的比较。

这有帮助吗?

编辑

如果您要这样做,您将需要调用setMONtUser,即使没有用户登录。

useEffect(()=>{
    const decoded = localStorage.jwt ? localStorage.jwt : "";
    dispatch(setCurrentUser(decoded));
},[])
 类似资料:
  • 问题内容: 我有一个将用户1的位置发送给用户2并将用户2的位置发送给用户1的代码。用户1的位置完美地发送给了用户2,用户2甚至向用户1发送了一条消息,但是它发送的位置是用户1的位置,而不是他(用户2)的位置。 这是我的代码: 谁能告诉我我在哪里做错了? pastebin.com/53ZJH3iN这是答复从用户1收到的短信的文件。与其发送用户2的位置,不如将用户1获得的相同位置发回给他。(这里的位置

  • 我正在尝试在Netty中开始使用HTTP/2。我尝试了“hello world”示例,它按预期工作。在示例中,管道如下所示: 服务器: SslHandler 应用程序协议协商处理程序 Http2ConnectionHandler 客户: SslHandler 应用程序协议协商处理程序 HttpToHttp2ConnectionHandler

  • 我想使用wordpress在我的网站上添加变体 我尝试了很多插件,但它们不能满足我的要求。 要求: 我想根据给定的变化变化价格: 任何人都可以引用插件或函数?

  • 主要内容:JAVA钩子OrientDB钩子类似于数据库术语中的触发器,它在用户应用程序中的每个CRUD操作之前和之后启用内部事件。可以使用挂钩编写自定义验证规则,强制执行安全性,或安排外部事件,例如针对关系DBMS进行复制。 OrientDB支持两种钩子 - 动态钩子 - 触发器,可以在类级别和/或文档级别构建。 Java(Native)钩子 - 触发器,可以使用Java类构建。 动态钩子 动态钩子比Java钩子更灵活

  • 我目前正在我的google open sheets脚本中使用此函数。。。 MailApp。sendEmail(电子邮件地址、电子邮件地址、主题、正文); 问题是我无法控制发件人的电子邮件地址。发件人电子邮件设置在哪里?我可以控制回复电子邮件地址,但这并不能真正解决我的问题。 有什么想法吗?谢谢

  • 钩子列表 全局钩子 名称 描述 init 在生成文档站点前触发. nav 在解析导航 nav.md 后和解析文档前触发 book:before 加载 book 页面之前调用 page:before 加载 page 文件之前调用 page 加载 page 文件之后调用 book 加载 book 页面之后调用 finish 在生成文档站点完成后触发. 模板钩子 名称 描述 参数 tpl:header