我有一个 Swift 类,它主要用作 React Native 模块。该模块使用一个看不见的 WKWebView 来运行,有时我会将该 WKWebView 分配为我的 ViewController 中的 subview 来调试我的实现,如下所示:
swiftClass.webView.frame = self.view.frame
self.view.addSubview(swiftClass.webView)
将此功能桥接到 React Native 的最简单方法是什么?好像我坐在模块和 UI 组件之间。如果我把它写成一个 UI 组件,我该如何调用这个类的方法呢?如果我把它写成一个模块,我怎样才能将它添加到我的 View 层次结构中?
我应该只使用 WebView 在 React Native 中重写模块吗?我犹豫是否这样做,因为 RN 实现使用 UIWebView,它比 WKWebView 慢,而且我不想污染 JS 线程并可能导致任何减速。
Best Answer-推荐答案 strong>
所有这些方法都可以工作,但有不同的权衡。我将讨论权衡和细微差别,希望这将帮助您选择适合您需求的方法。
作为 UI 组件
桥接 UI 组件负责创建 React Native 插入到原生 View 层次结构中的 View 。当你的 React 组件被卸载时,相应的原生 View 会从 View 层次结构中移除并释放。
所以一个问题是:给你的 API 赋予一个 React 组件的生命周期有意义吗?
此外,在 iOS 上,React Native 实际上会要求您的桥接 View 管理器提供一个额外的 View 实例。例如,如果您的 JS 中有三个桥接组件,React Native 将创建您的原生 View 的四个实例。额外 View 的原因是它用作模板;当你从 JS 中取消设置桥接组件的 prop 并且 React Native 需要将原生 View 的属性恢复为其默认值时,它会使用模板 View 来确定该默认值。
作为桥接模块
桥模块与 native View 层次结构的关系没有那么密切,它们会在您创建的每个 RCTBridge 实例中初始化一次(大多数应用程序只有一个桥)。
您的 API 在本质上是否更加全局化并在您的应用程序期间有效?然后将其公开为独立于 React 组件层次结构的桥接模块通常是有意义的。
至于 WKWebView ,最好将它添加到 React Native View 层次结构之外。使用原生 API 修改 React Native 拥有的 View 层次结构的一部分是违反抽象的,并且可能会破坏。因此,我建议在 React Native View 层次结构之外插入 WKWebView (例如:使用 RCTKeyWindow() 获取 UIWindow )或定义一个UI 组件而不是桥接模块,并在需要时将 WKWebView 添加为空 View 的 subview 。
在JS中使用RN的WebView
从长远来看,这应该是 future 移动库的最佳方法,因为纯 JS 具有卓越的开发工作流程和跨平台优势。但是如果当前的 WebView 实现不能满足你的需求,你应该编写自己的原生 UI 组件或模块。
关于ios - 我要创建原生模块还是原生 UI 组件?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/36533838/
|