问题描述
我学习React并有一个问题。我有4个React Component
,它们是同一HOC的使用者。
我希望其中一个不要Consume
从HOC渲染。
这有可能吗?在包装组件或HOC中,它在哪里做?
HOC提供商:
render() {
const { currentUser } = this.props;
return (
<AuthUserContext.Provider value={authUser}>
<Component {...this.props} />
</AuthUserContext.Provider>
);
}
消费者之一:
<AuthUserContext.Consumer>
{authUser =>
authUser ? (
<NavigationAuth authUser={authUser} />
) : (
<NavigationNonAuth />
)
}
</AuthUserContext.Consumer
之所以我希望一个组件不使用HOC渲染,是因为HOC在App.js中像这样export default withAuthentication(App);
const App = () => (
<Router>
<div>
<Navigation />
<hr />
<Route exact path={ROUTES.LANDING} component={LandingPage} />
<Route path={ROUTES.SIGN_UP} component={SignUpPage} />
<Route path={ROUTES.SIGN_IN} component={SignInPage} />
<Route
path={ROUTES.PASSWORD_FORGET}
component={PasswordForgetPage}
/>
<Route path={ROUTES.HOME} component={HomePage} />
<Route path={ROUTES.ACCOUNT} component={AccountPage} />
<Route path={ROUTES.ADMIN} component={AdminPage} />
</div>
</Router>
);
export default withAuthentication(App)
App.js仅在启动时呈现一次,对吗?因此,它不需要HOC的额外渲染,因此我想防止这种情况。
更新
这是一个Codesandbox,直接指向具有withAuthentication(App);
包装器的App.js。
您会看到,withAuthentication
提供商每次都引发所有“消费者”解雇,如果您需要value
也可以。但是您会在App.js中看到<Navigation />
组件已呈现,并且它还具有一个<AuthUserContext.Consumer>
。
因此,withAuthentication
渲染时发生的情况是App,js也被渲染,并且不需要。
我在withAuthentication
中做了一些类似的代码,以使App.js仅呈现一次:
render() {
const { currentUser } = this.props;
let { authUser,once } = this.state;
// ALl changes to user object will trigger an update
if (currentUser) authUser = currentUser;
const renderAuthButton = () => {
if (once) {
this.state.once = false;
return (
<AuthUserContext.Provider value={authUser}>
<Component {...this.props} />
</AuthUserContext.Provider>
);
}
return (
<AuthUserContext.Provider value={authUser}>
<Component />
</AuthUserContext.Provider>
);
};
return <div>{renderAuthButton()}</div>;
}
但是我觉得这可能不是一个好主意,或者甚至不是一个坏主意。 App.js是否可以这样渲染,因为它可以渲染整个应用程序树
我学习React,所以我可能会完全不在这里,请指教!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)