reactjs - 如何使用高阶组件访问状态

标签 reactjs redux higher-order-components

我想创建一个更高阶的组件来检查用户是否已登录。如果他们已经登录,我会显示该组件,如果没有,我想将他们重定向到登录页面。

有人可以解释一下我在这里做错了什么吗?

这是 HOC:

import React from 'react';
import { connect } from 'react-redux';

const withAuthentication = (Component) => {
  class WithAuthentication extends React.Component {
    componentDidMount() {
      console.log(this.props.sessionId);
    }

    render() {
      return this.props.sessionId ? <Component {...this.props} /> : null;
    }
  }

  const mapStateToProps = (state) => ({
    sessionId: state.auth.userInfo.authUserInfo.sessionId
  })
  return connect(mapStateToProps, null)(WithAuthentication);
}

export default withAuthentication;

然后我这样调用它:

....
import withAuthentication from './containers/withAuthentication';
const Hello = () => <h1> Hello</h1>;
....
<Route path="/" component={ withAuthentication(Hello) }/>

我删除了更多我认为与此无关的代码...

TIA 为您提供帮助!

更新:导致问题的代码似乎是这样的:

const mapStateToProps = (state) => ({
sessionId: state.auth.userInfo.authUserInfo.sessionId
})

错误:TypeError:无法读取未定义的属性“sessionId”

最佳答案

基本上,您正在将一个组件嵌套到另一个组件中,即功能组件在经过某种逻辑级别验证后返回另一个组件。 你正在做的事情看起来不错。您应该能够在像这样的功能组件中访问 Prop (而不是状态)

let aComponent(props)=>{
    return <p>{props.name}'s logged in status is {props.loggedIn}</p>
}

如果您正在使用这样的组件

<aComponent title="Hello" loggedIn={this.props.isLoggedIn}/> //isLoggedIn from redux store

此外,如果 withAuthentication 中逻辑/身份验证验证失败,您应该调用路由器 API 导航到所需的页面。 IE。 如果您使用的是 react-router

,您应该调用它
this.props.router.push('/login')

关于reactjs - 如何使用高阶组件访问状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53464181/

相关文章:

javascript - Heroku 应用程序仅适用于 Chrome 桌面//React.Js 应用程序

reactjs - 如何从 HOC 访问包装组件状态

javascript - 条件API调用并在react-select中发送数据

javascript - 如何将数组中的对象渲染到 React 中的另一个组件中?

javascript - React-router不渲染组件

javascript - 如何根据 Electron 菜单点击更改 Redux 状态?

reactjs - 如何将 react-draft-wysiwyg 自定义组件与 React-Final-Form 集成

javascript - React/Redux/Reselect - 即使在看到 reducer 中反射(reflect)的更改后,mapStateToProps 也会停止触发。

javascript - 使用 recompose 映射从上下文中消耗的 Prop

javascript - 如果在该函数之外设置状态,则 React JS 高阶组件不执行函数