【问题标题】:React Redux HOCReact Redux HOC
【发布时间】:2018-07-08 12:18:16
【问题描述】:

我正在尝试创建一个简单的 React HOC,以根据 Redux 状态中是否存在特定值来决定是否渲染组件。

我的 HOC 看起来像这样:

const HOC = (ComponentA, value, ComponentB) => {
    const wrapper = props => {
        props.componentDecision.key === value ? (
            <ComponentA {...props} />
        ) : (
            <ComponentB {...props} />
        );
    };

    return connect(({ componentDecision }) => ({ componentDecision }), null)(wrapper);
};

当我将它与路由等一起使用时一切正常,但对于像 React-Bootstrap Tabs 这样的组件,我无法使用我的 HOC 隐藏/传递道具到选项卡,如下所示:

<Tabs ...>
 <Tab ..>
 {HOC(Tab, 'dynamicTab', null)} // passing null to hide it if value isn't dynamicTab
</Tabs>

我相信问题是因为 Redux 的 connect() HOC 被返回。我尝试通过扩展 ComponentA 并返回 super.render() 来在我的 HOC 中进行继承反转,以免在 DOM 树中引入 connect(),但这样做我必须处理 Redux 的 store.getState()store.unsubscribe() 等。

有什么更好的方法来做这样的事情?如何创建这个 HOC 以连接到 redux 状态但仍返回传入的原始组件?将道具作为函数参数传递给我的 HOC 看起来不太好。

【问题讨论】:

    标签: javascript reactjs redux


    【解决方案1】:

    与Routes一起使用时,你只需要将组件传递给Route,但是在render函数中,你需要像这样渲染它

    const DynamicTab = HOC(Tab, 'dynamicTab', null);
    

    然后在组件的render方法中;

    <Tabs ...>
     <Tab ..>
       <DynamicTab />
    </Tabs>
    

    【讨论】:

    • 正如我所说,这不起作用,因为DynamicTab 现在将在Tabs 的子代中引入connect() 并且永远不会渲染。
    猜你喜欢
    • 2019-04-06
    • 2018-04-16
    • 1970-01-01
    • 2019-03-07
    • 2018-02-15
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多