如何在React中按名称全局禁用/隐藏/替换组件?

时间:2018-09-28 18:52:02

标签: reactjs featuretoggle

我有一个大型的React应用程序,并且我想从配置或全局级别完全禁用一些组件。在呈现任何组件之前,是否可以使用任何可以调用的全局挂钩?如果是这样,我想我可以检查组件的名称,如果名称在禁用列表中,则返回null。你会怎么做?

3 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点:

React's Context API允许您在组件树的每个级别传递道具,因此您可以将它们用作标记来启用/禁用组件。但是,应谨慎使用。

Higher Order Components基本上只是返回组件的函数。您可以将组件包装在逻辑中以根据需要呈现它们。

或者当然,您可以使用redux之类的全局状态管理器来设置全局状态。

答案 1 :(得分:0)

有很多方法可以做到这一点,因此,我将仅描述一种简单的方法:使用引用并相应地更新状态。

完整的功能在线隐藏/显示沙箱:codesandbox.io ReactJS Feature Hide/Show Demo

定义了两个类,class Feature extends React.Componentclass App extends React.Componentrender()的{​​{1}}是...

<Feature/>

render() { if (!this.state.enabled) { return <div />; } return ( <div className="Feature"> <h1>My Feature!</h1> </div> ); } 中启用/禁用功能的选项将像这样处理显示/隐藏...

<App />

当然,您需要确保 handleOnClick(e) { if (e.target.checked) { this.feature.setState({ enabled: true }); } else { this.feature.setState({ enabled: false }); } } 拥有引用集...

<Feature />

答案 2 :(得分:0)

  1. 如果您需要最简单的解决方案,只需使用浏览器全局变量并在render中进行检查即可。

    render() { if( window.globalFlag ) return null return ( <div> feature content...

    缺点:

    • 修改组件
    • 使用全局范围,
    • 一些不必要的代码可以更早地运行(例如constructor(例如componentDidMount)。
  2. 使用HOC -包装组件-使用Redux或上下文API与全局存储连接。

    <FlagsProvider store={flagStore}> <SomeComponent_1> <SomeComponent_2> <FlagsConsumer flag="someFeatureFlag"> <SomeFeatureComponent />

    <FlagsConsumer/>连接到存储(redux连接将是一个内部包装器-组成HOC),并有条件地呈现<SomeFeatureComponent />(或为null)。

    当然,HOC可以将收到的道具传递给包装的组件-它可以在功能上透明。

  3. 不要重新发明轮子-使用一些现成的module,阅读教程,使用google搜索。

HOC还可以起到A / B测试的作用。