RN升级需要开发者适配整理
重点变更
-
RN 新架构中的
NativeModules改为TurboModule,其他调用地方统一改为调用 RNBridge 中封装的该方法。 -
RN 中
Dimensions,DeviceEventEmitter,AppState,Appearance,Keyboard,AccessibilityInfo,NativeEventEmitter,Linking等removeEventListener或removeListener在新版本已经废弃,更改为remove()。 -
增加 OpenHarmony 判断方法
PlatformUtils.isHarmony(),PlatformUtils.isAPP()已经包含 OpenHarmony 判断,如果要写单独的 OpenHarmony RN 文件,文件后缀改为index.harmony.tsx。 -
由于 RN 新架构上 native 和 js 通讯效率提高,
setnativeprops方法在新架构上已废弃,迁移到state上实现。 -
RN 新架构上用的
Hermes引擎,new Date('2023/08/08 00:00:00').getTime()报错NaN,改为new Date('2023-08-08 00:00:00').getTime()。
v0.59.0
删除 react-native-git-upgrade。

v0.59.8
Libraries/Animated/src/createAnimatedComponent.js 默认设置滚动视图节流。

v0.60.0
- Auto-linking for Native Modules: 自动链接原生模块,简化了原生模块的配置。
- Android X 支持: React Native 完全迁移到 Android X,开发者需要更新依赖。
- 新的 useWindowDimensions Hook: 更简便的方式来监听窗口尺寸的变化。
- CocoaPods 成为默认管理方式: iOS 项目使用 CocoaPods 作为默认的依赖管理工具。
v0.61.0
- 废弃
UIManagerModule.playTouchSound()方法,用SoundManager.playTouchSound()替代。 - 废弃
UIManager.measureLayoutRelativeToParent。 - Fast Refresh: 引入了 Fast Refresh,结合了 “live reloading” 和 “hot reloading” 的优势,提升了开发体验。
v0.62.0
-
删除没有实际使用的
TextInput::onTextInput事件。
-
createAnimatedComponent删除第二个参数defaultProps,通过删除defaultProps以支持合成,并对滚动组件进行更孤立的修复,简化了Animated。
-
TextInput.js删除selectionState,用onBlur,onFocus,onUpdate代替。 -
ScrollView中删除scrollWithoutAnimationTo(),此函数在 2016 年 12 月被弃用。
-
RN 团队修改了
accessibilityState属性,作为组件向可访问性服务描述有关其状态的信息的语义更丰富的方式。
-
AnimatedEvent.js中设置useNativeDriver为必填项。-
RN 团队发现开发者的许多代码调用点(callsites)本可以使用原生驱动(Native Driver)却未启用。为了引导开发者在适合的场景下主动启用该选项,并为将来将默认值切换为 true 做准备,团队现在要求必须显式声明
useNativeDriver,即使设置为false。 -
如果开发者未指定
useNativeDriver,此更改会触发运行时警告。这种轻量级的提醒机制,能帮助开发者在适合使用原生驱动的场景中及时启用它。如果允许隐式忽略,开发者很容易忘记设置这一关键选项。

-
-
删除
IncrementalPresenter组件。
-
TouchableWithoutFeedback不在作为export props,使用React.ElementConfig代替。

-
删除
Sample和CrashyCrash,这些 NativeModules 不是必需的,因此 React Native 将它们删除了。
v0.63.0
- RN 团队想摆脱对
prop-types包的使用,删除剩余的Incremental组件,以使用现在的React.createContext API。 - RN 团队不再需要从 JS 调用
focus on mount,因为 iOS 和 Android 现在都在本机实现它,所以从TextInput.js移除useFocusOnMount自动对焦实现。

- TextInput Placeholder 文本样式支持:新增了对 TextInput 组件的 placeholderTextColor 和 placeholderTextStyle 属性的支持。
- 默认启用 LogBox: LogBox 成为默认的错误和警告处理机制。
- Pressable 组件: 新的 Pressable 组件用于替代 Touchable 系列组件,提供了更灵活的触摸事件处理。
v0.64.0
-
将
Image上的onLoad和onError事件更改为彼此一致,并与ImageSource类型一致。Image的onload事件间对象上将source.url重命名为source.uri。
-
通过创建
VirtualizedListContext将VirtualizedList从旧上下文中迁移到React.Context。 -
修改
BackHandler函数的flowtype,使其具有更具体的返回类型。
-
Text.viewConfig不再被导出,因为viewConfig早已不再作为其他核心组件(例如View)的导出属性存在。 -
为了简化和清理 React Native 中的 “EventEmitter” 抽象,从
DeviceEventEmitter和NativeEventEmitter中移除once()和removeCurrentListener()。
v0.64.2
重构 UIManagerHelper.getUIManager 以在未注册 UIManager 时返回 null。

v0.65.0
-
renderApplication中添加参数debugName用作为React root tree的显示名称。
-
废弃
EventEmitter的removeSubscription,用__removeSubscription代替。
-
删除
Linking.removeEventListener,使用对Linking.addEventListener返回的订阅调用remove()来替代。
-
AccessibilityInfo.removeEventListener标注废弃,但当前版本未删除该方法。 -
已从 Animated API 引用中删除
getNode(),在 0.62 中,createAnimatedComponent被改为使用forwardRef,而不是要求调用者使用ref.getNode()。为了保持向后兼容性,ref.getnode()被 monkey-patched 到返回的ref上。.png)
-
将
RCTDeviceEventEmitter简化为简单的EventEmitter,删除RCTDeviceEventEmitter.sharedSubscribers。
-
将
ScrollResponder.Mixin方法移动到 ScrollView 中,已删除ScrollResponder.js。
-
NativeEventEmitter不再继承EventEmitter,因此它不再实现removeListener和removeSubscription。相反,在addListener返回的订阅对象上使用remove()方法。

v.0.66.0
移除 Picker 组件。

v0.67.0
-
已废弃的
Keyboard.removeEventListener重命名为Keyboard.removeListener。
-
删除未使用的文件:
StaticContainer.react.js,ensurePositiveDelayProps.js,InteractionMixin.js,queryLayoutByID.js。 -
删除
Libraries/Core/setUpGlobals.js中未使用的全局变量GLOBAL。RN 团队正在为 React Native 中的全局变量定义一个别名,名为GLOBAL,Facebook 根本没有使用该别名,而且它似乎也没有在外部使用。这个别名在 JS 生态系统中并不标准,也不常见,所以可以直接删除它,以减少全局范围的污染。
v0.69.0
-
将
Animated.interpolate类型导出为$ReadOnly类型。 -
React 18 支持: 完全支持 React 18,包括 Concurrent Mode 和 Suspense 的功能。

v0.70.0
-
在
AnimatedColor、AnimatedValue、AnimatedValueXY中将useNativeDriver添加为setValue的参数。
-
删除旧的已弃的模块中的
removeListener方法,这些模块会导致恼人的警告。对于某些第三方模块来说,这可能是一个突破性的变化,包括:-
Libraries/AppState/AppState.js -
Libraries/Components/AccessibilityInfo/AccessibilityInfo.js -
Libraries/Components/Keyboard/Keyboard.js -
Libraries/EventEmitter/NativeEventEmitter.js -
Libraries/Linking/Linking.js -
Libraries/Utilities/Dimensions.js -
Libraries/vendor/emitter/_EventEmitter.js

-
-
删除已经弃用
EventEmitter.prototype.removeSubscription方法。
-
Hermes 成为默认 JS 引擎: Hermes 现在是默认的 JavaScript 引擎,这为大多数应用带来了性能上的提升。
v0.70.1
在 turbo 模块中接受 TypeScript 类型 T | null | undefined 作为可能的 T 类型。
根据 Flow 的文档,T 的可能类型意味着 T | null | undefined,而不是 T | null | void。
我认为保持 TypeScript 和 Flow 彼此一致更好。

v0.71.0
-
从 react-native 中删除
AsyncStorage模块。 -
删除
VirtualizedList listKey prop。(注:https://github.com/facebook/react-native/commit/010da67bef0c22418d0d41b7c2eae664672a4a27) -
RN 团队已经决定不继续在 react-native 中使用
flexlayout,将暂时删除它。
v0.72.0
-
将
VirtualizedList、VirtualizedSectionList及其文件移动到一个名为react-native/virtualized-lists的单独软件包中,该软件包位于packages/virtualized-lists下。
-
删除
Libraries/Components/ActivityIndicator/ActivityIndicator.flow.js。 -
polyfills重命名为js-polyfills。

-
Libraries/Lists/FlatList.d.ts中scrollToItem添加viewOffset参数。
-
onStartRached和onStartRachedThreshold添加到VirtualizedList中。这允许实现双向分页。
v0.72.1
react-native/metro-config 现在包含 metro-config 中的所有基本配置值。

v0.72.2
从模板中删除弃用的存根类型 @types/metro-config。
