reactjs - 如何通过 React 上下文传递 props 和使用 HOC
问题描述
我需要做这样的事情
const CreateActivity = (props) => (
<AuthUserContext.Consumer>
{authUser =>
<CreateActivityShow email={authUser.email} {...props}/>
}
</AuthUserContext.Consumer>
const authCondition = (authUser) => !!authUser;
export default withAuthorization(authCondition)(CreateActivity);
这样我就可以在 createActivity 中正确使用我的 HOC 组件,但是在 CreateActivityShow this.props 上只有 this.props.email 而不是我应该使用 this.props.match 的 url 参数...
我试过这种方式
export default props => (
<AuthUserContext.Consumer>
{authUser =>
<CreateActivityShow {...props} email={authUser.email}/>
}
</AuthUserContext.Consumer>
)
现在我有了道具,但我不知道如何在这里使用我的 HOC
有没有办法同时做这两件事?
编辑:
我试过这个
export default withAuthorization(authCondition)( props => (
<AuthUserContext.Consumer>
{authUser =>
<CreateActivityShow {...props} email={authUser.email}/>
}
</AuthUserContext.Consumer>
))
现在我再次用 withAuthorization 包装了我的组件,但是道具现在没有被传递,我不知道为什么......
这是我的 HOC
const withAuthorization = (authCondition) => (Component) => {
class WithAuthorization extends React.Component {
componentDidMount() {
firebase.auth.onAuthStateChanged(authUser => {
if (!authCondition(authUser)) {
this.props.history.push(routes.SIGN_IN);
}
});
}
render() {
return (
<AuthUserContext.Consumer>
{authUser => authUser ? <Component /> : null}
</AuthUserContext.Consumer>
);
}
}
return withRouter(WithAuthorization);
}
export default withAuthorization;
解决方案
是的,所以问题出在WithAuthorization
组件中,您没有将 HOC 收到的道具传递给渲染的组件。你会这样写
const withAuthorization = (authCondition) => (Component) => {
class WithAuthorization extends React.Component {
componentDidMount() {
firebase.auth.onAuthStateChanged(authUser => {
if (!authCondition(authUser)) {
this.props.history.push(routes.SIGN_IN);
}
});
}
render() {
return (
<AuthUserContext.Consumer>
{authUser => authUser ? <Component {...this.props}/> : null}
</AuthUserContext.Consumer>
);
}
}
return withRouter(WithAuthorization);
}
export default withAuthorization;
推荐阅读
- c++ - 如何使用 std::is_same 检测通用引用参数类型
- openapi - /$metadata 在 Azure API 管理 (AAM) 上不受支持用于板载 OData V4 API
- html - 如何使用 CSS 和 HTML 更改链接的颜色和悬停效果?
- python - 带有 Python 变量的 JSON 字符串
- c# - 如何检测控制台应用程序何时被 C# 中的计划任务停止?
- python-3.x - 如何将数据框与多级列结构合并?
- iccube - icCube 多级层次结构 - 有时并非所有替代值都存在,如何克服“意外错误”?
- json - Nifi - 将根 json 元素拆分为不同的流文件
- javascript - 从 Django 模板中的选项渲染选定的图像
- postgresql - 从 v.9 升级到 v.11 后,PostgreSQL 中简单字典生成的词素对于非拉丁语言不会小写