gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:32:35 27 4
gpt4 key购买 nike

我有一个 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 线程并可能导致任何减速。

最佳答案

所有这些方法都可行,但有不同的权衡。我将讨论权衡和细微差别,希望这能帮助您选择适合您需求的方法。

作为 UI 组件

桥接 UI 组件负责创建 React Native 插入到 native View 层次结构中的 View 。当您的 React 组件被卸载时,相应的 native View 将从 View 层次结构中删除并释放。

所以一个问题是:为您的 API 提供 React 组件的生命周期是否有意义?

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

作为桥梁模块

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

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

至于WKWebView,最好将它添加到 React Native View 层次结构之外。使用 native 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com