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

Redux不允许在componentDidMount内部调度

越运锋
2023-03-14

null

我有一个React容器组件AppContainer来检测用户是否通过了身份验证。如果用户通过了身份验证,则显示路由、应用程序、报头等。如果用户未通过身份验证,则显示登录组件。

AppContainer是一个连接的组件(使用react-redux)。MapStateToPropsMapDispatchToProps如下所示:

const mapStateToProps = function(state) {
  return {
    isAuthenticated: state.Login.isAuthenticated,
  }
}

const mapDispatchToProps = function(dispatch, ownProps) {
  return {

    loginSuccess: (user) => {
      console.log("before dispatch")
      dispatch(loginSuccess(user))
    },

  }
}

正在调度的loginsuccess函数是一个操作创建器,它只是将用户信息存储在redux存储中。login.isauthenticated的默认状态为false。

componentdidmount()中,我检查this.props.isauthenticated(来自redux存储中的用户信息)是否为true。如果不是,我检查tokenid是否在localstorage中。如果令牌在localStorage中,我将分派loginsuccess操作将该信息添加到redux存储中。

然后,由于该信息在Redux存储中,组件将更新并显示受保护的材料。这个很管用。

我的componentdidmount函数如下:

  componentDidMount() {
    if (this.props.isAuthenticated) {
      console.log("REDUX AUTH'D")
    } else {

      if (localStorage.getItem("isAuthenticated") && !this.props.isAuthenticated) {

        console.log("BROWSER AUTHD, fire redux action")

        this.props.loginSuccess({
          profileObj: localStorage.getItem("profileObj"),
          tokenObj:   localStorage.getItem("tokenObj"),
          tokenId:    localStorage.getItem("tokenId"),
        })

      }

    }
  }

唯一的问题是我收到了以下警告:

警告:setState(...):只能更新已装入或正在装入的组件。这通常意味着在未挂载的组件上调用setState()。这是禁闭状态。请检查t组件的代码。

虽然给出的错误表明setState()有问题,但我没有在整个程序中的任何地方调用setState(),所以...但是删除componentDidMount中的This.Props.LoginSuccess({...也会删除错误。

“我的代码”中的log语句会在错误之前打印,并且如果存在身份验证,组件会按预期呈现受保护的信息。如果组件似乎在工作,为什么会出现此错误?

更新:

查看堆栈跟踪显示,它来自我正在使用的google-login实用程序。

这是该组件的代码:https://github.com/anthonyjgrove/react-google-login/blob/master/src/google.js

共有1个答案

邹玮
2023-03-14

这是NPM包提供的google-loginReact组件的一个问题。我根据Redux状态下的isAuthenticated值,有条件地呈现google-login组件(在它自己的容器组件中,在原始问题中没有显示),从而解决了这个问题。

 类似资料:
  • 问题内容: 我有一个基于Java的Web服务客户端,该客户端连接到Java Web服务(在Axis1框架上实现)。 我的日志文件中出现以下异常: 问题答案: 这通常是由XML声明前的空白引起的,但是它可以是任何文本,例如破折号或任何字符。我说这通常是由空白引起的,因为人们认为空白始终是可忽略的,但事实并非如此。 经常发生的另一件事是UTF-8 BOM(字节顺序标记),如果将文档作为字符流传递给XM

  • 问题内容: 遵循Restangular的文档,并包括以下示例: 我正在为angel.co做同样的事情 并不断出错 有什么办法吗? 问题答案: 服务器(api.angel.co)没有响应Access-Control标头,这导致此错误。 将XHR请求发送到与原始域不同的域时,Web浏览器正在检查服务是否允许这样做。在您的情况下,api.angel.co将需要在响应中包含标头(不是)。 假设您不能更改a

  • 问题内容: 我运行Intellij,当我尝试运行android应用程序时,总是出现内部错误:序言中不允许内容。我认为我已经尽力修复了所有问题,但没有任何效果。之前,我在AndroidManifest中没有做任何特别的事情,所以我不知道为什么它不起作用。 问题答案: 关闭Intellij想法 去你的工作区 删除.idea文件夹 打开您的项目并导入。

  • 问题内容: 我的代码中有内部类。我想授予对其实例的公共访问权限,但是只有外部类才可以创建此实例,就像在“私有”访问权限中一样。是否可以不做适当的小包装(或为每个这样的内部类创建公共接口)? (对不起,如果我的英语不好:P) 问题答案: 有可能的。将 内部类 声明为 public,但将其构造函数声明为private 。这样,您只能在封闭的类及其内部内部创建它,而不能从外部创建它。

  • 问题内容: 我正在尝试调用Web服务,但是遇到了奇怪的行为。我们的服务器上正在运行一个Web服务,但是该代码未向我们开放,因此无法看到墙后发生了什么。该服务的所有者公开了基于Web的测试客户端UI,该UI在文本框中输入内容,并显示对测试目的的响应。此输入框采用以下提到的格式输入 它在此UI上工作正常,但是当我尝试通过Java代码调用此Web服务时,它也将获得连接以及被该服务授权,但是当我尝试调用上

  • 我有一个包含XML(包括主体和元数据)的字符串对象。当我试图解析它时,我得到以下错误: 组织。xml。萨克斯。SAXParseException;行号:1;列数:1;prolog中不允许包含内容 我尝试使用函数,但它没有帮助。我需要一些关于如何编辑我的XML的帮助,以便允许它。