【问题标题】:React native: export default App with multiple module wrapsReact Native:导出具有多个模块包装的默认应用程序
【发布时间】:2018-07-05 08:46:29
【问题描述】:

我的 react native 项目中有以下 App.js:

class App extends Component {

    render() {
        return (
          <ApolloProvider store={store} client={client}>
        <AppWithNavigationState />
        </ApolloProvider>

      );
    }

}
export default App = codePush(App);

我正在尝试将 aws amplify 身份验证器添加到我的项目 (https://github.com/aws/aws-amplify/blob/master/media/quick_start.md#react-native-development) 但步骤告诉我添加:

export default withAuthenticator(App);

^^ 当我已经将 codePush 包裹在我要导出的 App 组件周围时,我该怎么做?

【问题讨论】:

    标签: javascript react-native aws-amplify


    【解决方案1】:

    TL;DR: withAuthenticator 基本上是一个 higher order component ,它接受一个组件,对其进行装饰(即提供一些特殊的道具或各种自定义)并返回一个由您传入的组件组成的新组件。所以在您的情况下,如果您想要多个 HOC ,你可以简单地说-

    export default withAuthenticator(codePush(App))
    

    如果你有 5 个装饰器,那么从可读性的角度来看,这种语法可能会变得很糟糕。在这种情况下,使用新的装饰器语法很有用。有了它,你可以做一些整洁的事情,比如 -

    @mySpecialDecoratorThatDoesNiceThings
    @withAuthenticator
    @codePush
    export default class App extends Component {
    ...
    }
    

    如果您使用的是 babel,请查看这个 transform-decorators babel 插件以确保正确地转译了装饰器。

    【讨论】:

    • 谢谢萨加尔!我把 HOC 放在什么顺序有关系吗?如果是这样,将 codepush 组件作为最高顺序不是更有意义吗?
    • 取决于 HOC 的功能和需要导出的内容,这可能会或可能不会很重要。如果您的 HOC 之一,例如codePush 期望来自 withAuthenticator 的道具,那么 withAuthenticator 必须是您调用的第一个 HOC,但在大多数一般情况下,它可能无关紧要。
    • 您也可以换掉 withAuthenticator() HOC 并使用您自己的身份验证器。将身份验证添加到组件(例如登录按钮)或获取自定义 UI 是正常的。查看我的博客shellmonger.com - 我在 18 年 1 月写了这两个案例
    猜你喜欢
    • 2021-05-20
    • 2021-04-24
    • 2019-11-22
    • 1970-01-01
    • 2020-05-21
    • 2018-03-12
    • 2019-05-08
    • 2021-09-23
    • 2020-08-08
    相关资源
    最近更新 更多