react-native - JS Root View 从其父 View 中删除后是否总是从 native 接收事件?

标签 react-native react-native-ios

我的(高度简化的)代码如下所示:

// objc
self.currentSwipeUpView = [[RCTRootView alloc]
   initWithBridge:_bridge moduleName:@"PhotoSwipeUpView"
   initialProperties:nil
];
// elsewhere...
[self.currentSwipeUpView removeFromSuperview];
self.currentSwipeUpView = nil;

// js
function PhotoSwipedUpView() {
    return <TextInput style={{flex: 1}} onChangeText={console.warn} />
}
AppRegistry.registerComponent('PhotoSwipeUpView', () => PhotoSwipeUpView)
self.currentSwipeUpView从其父 View 中删除并取消引用。发生这种情况时,JS 线程是否有可能收不到待处理的 onChangeText 事件?会不会导致console.warn与新文本在一起?

我正在想象这样一种情况,在 RCTRootView 从其 super View 中删除并取消引用后,该事件将被发送到 JS 线程。

此外,我很好奇是否可以在从 JS 端从其父 View 中删除 RCTRootView 时收到通知。

我正在使用 ARC 并且我没有持有对 self.currentSwipeUpView 的任何其他引用.

编辑:我有两个 RCTRootViews。只有其中一个将被卸载,另一个将在应用程序的整个状态中持续存在。它们使用相同的桥接器,因此使用相同的包和 JS 环境。

最佳答案

加载/卸载 JS 包

您加载的 js 包与根 View 相关联,并且除该 View 外不持久。
从其父 View 中删除根 View 后,捆绑包也将被卸载。如果根 View 被删除和取消引用,文本更改监听器也应该被删除并且不应触发。

捆绑包中的 JSX 用于最终设置原生元素及其监听器。 JSX 基本上就是脚本。带有 RN 的 JSX TextInput基本上导致本地 UITextField .如果 JSX 指定了一个监听器,则用于文本更改的 native 监听器将添加到 native 元素实例中。

即使您加载了两个根 View ,它们也会相互独立运行。如果卸载了一个根 View ,则与屏幕上的 TextInput 关联的监听器不应再接收事件。您的第二个根 View 应该不受影响,因为它会为 TextInput 设置单独的监听器。

事件/时间问题

我认为完美时机的可能性很小,并且取决于调用 removeFromSuperview 的位置,js 可以在 View 完全删除和取消引用之前接收事件,但是如果这有可能影响您的应用程序的功能,我建议使用另一种模式与您的数据进行交互并删除屏幕。

可能的解决方案

在不知道您要做什么的情况下很难说,但是例如,您可以使用 RCTEventEmitter 发布关闭 React Native View 的通知。/NativeEventEmitter ,然后让 React Native 屏幕使用 native 函数关闭自身,该函数只是将其从 super View 中删除。这种类型的模式也可以回答您的第二个问题(在某种意义上),因为您在 RN 屏幕应该关闭之前有效地告诉它,允许它在被删除之前采取任何必要的操作。

关于react-native - JS Root View 从其父 View 中删除后是否总是从 native 接收事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51275112/

相关文章:

android - 与文本内联的 React-native 图标

react-native - 在 native react 中具有交替颜色的 ListView

react-native - 双色卡

react-native - 如何避免 createStackNavigator 崩溃 react native 应用程序?

react-native - 如何使用@sentry/react-native 在我的模拟器中打开用户反馈窗口

javascript - 错误 : Attempting to set key on an object that is immutable and has been frozen

node.js - React Native 在有/没有 wifi 的情况下获取不同的结果

react-native - 意外的 token ,预期的;在 React Native 中调用函数时

ios - 我在使用 npm run ios 命令时遇到错误

react-native - 如何在 React Native android 中实现 Coach 标记?