菜鸟教程小白 发表于 2022-12-12 19:21:53

ios - 我要创建原生模块还是原生 UI 组件?


                                            <p><p>我有一个 Swift 类,它主要用作 React Native 模块。该模块使用一个看不见的 WKWebView 来运行,有时我会将该 WKWebView 分配为我的 ViewController 中的 subview 来调试我的实现,如下所示:</p>

<pre><code>swiftClass.webView.frame = self.view.frame
self.view.addSubview(swiftClass.webView)
</code></pre>

<p>将此功能桥接到 React Native 的最简单方法是什么?好像我坐在模块和 UI 组件之间。如果我把它写成一个 UI 组件,我该如何调用这个类的方法呢?如果我把它写成一个模块,我怎样才能将它添加到我的 View 层次结构中?</p>

<p>我应该只使用 WebView 在 React Native 中重写模块吗?我犹豫是否这样做,因为 RN 实现使用 UIWebView,它比 WKWebView 慢,而且我不想污染 JS 线程并可能导致任何减速。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>所有这些方法都可以工作,但有不同的权衡。我将讨论权衡和细微差别,希望这将帮助您选择适合您需求的方法。</p>

<h3>作为 UI 组件</h3>

<p>桥接 UI 组件负责创建 React Native 插入到原生 View 层次结构中的 View 。当你的 React 组件被卸载时,相应的原生 View 会从 View 层次结构中移除并释放。</p>

<p>所以一个问题是:给你的 API 赋予一个 React 组件的生命周期有意义吗?</p>

<p>此外,在 iOS 上,React Native 实际上会要求您的桥接 View 管理器提供一个额外的 View 实例。例如,如果您的 JS 中有三个桥接组件,React Native 将创建您的原生 View 的四个实例。额外 View 的原因是它用作模板;当你从 JS 中取消设置桥接组件的 prop 并且 React Native 需要将原生 View 的属性恢复为其默认值时,它会使用模板 View 来确定该默认值。</p>

<h3>作为桥接模块</h3>

<p>桥模块与 nativeView 层次结构的关系没有那么密切,它们会在您创建的每个 <code>RCTBridge</code> 实例中初始化一次(大多数应用程序只有一个桥)。</p >

<p>您的 API 在本质上是否更加全局化并在您的应用程序期间有效?然后将其公开为独立于 React 组件层次结构的桥接模块通常是有意义的。</p>

<p>至于 <code>WKWebView</code>,最好将它添加到 React NativeView 层次结构之外。使用原生 API 修改 React Native 拥有的 View 层次结构的一部分是违反抽象的,并且可能会破坏。因此,我建议在 React NativeView 层次结构之外插入 <code>WKWebView</code>(例如:使用 <code>RCTKeyWindow()</code> 获取 <code>UIWindow</code>)或定义一个UI 组件而不是桥接模块,并在需要时将 <code>WKWebView</code> 添加为空 View 的 subview 。</p>

<h3>在JS中使用RN的WebView</h3>

<p>从长远来看,这应该是 future 移动库的最佳方法,因为纯 JS 具有卓越的开发工作流程和跨平台优势。但是如果当前的 WebView 实现不能满足你的需求,你应该编写自己的原生 UI 组件或模块。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 我要创建原生模块还是原生 UI 组件?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/36533838/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/36533838/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 我要创建原生模块还是原生 UI 组件?