React Native基础

178 阅读7分钟

1.React Native理解

RN是基于React,使用JS和React构建原生移动应用程序的框架,相比较iOS和安卓能够跨平台开发,接近原生应用的性能。支持热重载。组件化开发提高代码的开发效率。支持热更新,更新不需要重新安装“APP”,不足的是还是需要精通iOS和安卓开发。然后就是性能肯定没有原生的好。

2.React Native的工作原理

  • RN通过将JS代码解释执行,并使用原生组件渲染用户界面。
  • RN分为两个主要的线程:JS线程和原生UI线程。
  • JS线程执行JS代码,处理业务逻辑和用户交互。它使用Bridge将JS和原生代码之间通信。
  • 原生UI线程负责页面渲染和用户输入响应。
  • 通过Bridge,JS线程可以发送命令和数据给原生UI线程,并将接收来自原生代码的事件和响应。
  • 这种架构使得RN程序能同时享受JS的灵活性和原生应用的性能。

3.简单介绍下React Native,以及和React.js的区别

和ReactJS相比,React Native使用的JSX语法等其他方面有如下的一些区别:

  • 语法:React Native和ReactJS都使用JSX,但ReactJS使用HTML标签,而React Native不使用。
  • 导航:React Native使用自己的内置导航库,而ReactJS使用react-router。
  • 动画:ReactJS使用CSS动画。React Native使用其动画API。
  • DOM:ReactJS使用部分刷新的虚拟DOM。React Native在渲染UI组件时需要使用其本地API。
  • 用法:ReactJS主要用于Web应用开发,而React Native则专注于移动应用。

4.什么是JSX?它在React Native中的作用是什么?

  • JSX是一种JavaScript的语法扩展,允许在JavaScript代码中编写类似HTML的结构。
  • 在React Native中,JSX用于描述用户界面的结构和组件的层次结构。
  • JSX使得编写和理解React组件更加直观和易读,同时也提供了一些特性,如组件嵌套、属性传递和事件处理。

5.React Native 的桥接机制是什么?

React Native 的桥接机制是指 JavaScript 代码和原生代码之间的通信,它允许 JavaScript 发送任务给原生平台执行。

6.React Native中处理本地存储和持久化

RN提供AsyncStorage存储键值对用于数据持久化,它是异步的基于Web端的本地存储。

7.React Native 中的导航是如何实现的?

React Native 使用第三方库如 react-navigationreact-native-navigation 来实现应用内的导航。

8. 在 React Native 应用中如何处理导航?

回答: React Native 提供了几个导航库,其中最受欢迎的是 React Navigation。React Navigation 允许开发者使用各种导航器(如 StackNavigatorDrawerNavigatorTabNavigator)来处理应用中的导航。导航栈和屏幕之间的转换

9.React Native 的生命周期方法有哪些?

React Native 遵循与 React 相同的生命周期方法。

10.如何在React Native中处理性能优化和内存管理?

  • 在React Native中进行性能优化和内存管理的一些常见方法包括:
  • 避免不必要的重新渲染:使用shouldComponentUpdateReact.memo来避免无需的组件重新渲染。
  • 使用虚拟化列表:对于大型列表或网格,使用虚拟化列表组件(如FlatList)来只渲染可见区域的内容。
  • 使用PureComponentReact.memo:这些组件可以自动执行浅比较来避免不必要的重新渲染。
  • 使用useCallbackuseMemo:这些钩子函数可以缓存函数和计算结果,避免在每次渲染时重新创建。
  • 避免内存泄漏:确保在组件卸载时取消订阅事件、清除定时器和释放其他资源。
  • 使用性能分析工具:React Native提供了一些性能分析工具(如PerformanceMonitor),可以帮助识别性能瓶颈和优化机会。
  • 使用React Native Community的第三方库:React Native Community提供了一些优化库,如react-native-fast-image用于高性能的图像加载,react-native-reanimated用于流畅的动画效果等。

11.InteractionManager

InteractionManager可以将一些耗时较长的工作安排到所有互动或动画后执行,这样可以保证JS动画的流畅性。如:Navigator转场动画。

延迟计划函数比较:

  • requestAnimationFrame(): 用来执行在一段时间内控制视图动画的代码。
  • setImmediate/setTimeout(): 在稍后执行代码。注意这有可能会延迟当前正在进行的动画。
  • runAfterInteractions(): 在稍后执行代码,不会延迟当前进行的动画。

12.简单介绍下Bundle 加载机制

在编写业务逻辑的时候,我们会有许多个js文件,打包的时候RN会将这些个js文件打包成一个叫index.android.bundle(ios的是index.ios.bundle)的文件,所有的js代码(包括rn源代码、第三方库、业务逻辑代码)都在这一个文件里,启动App时会第一时间加载bundle文件,所以脚本热更新要做的事情就是替换掉这个bundle文件。

13,React Native如何实现热更新

在React Native项目集成热更新目前有4个方案。 CodePush(服务器在海外)、中文社区的CodePush,Pushy(来自React Native中文社区出品)、自建CodePush服务器(这需要开发者具备全栈的技术能力)

14.请简述 code push 的原理

code push 调用 react native 的打包命令,将当前环境的非 native 代码全量打包成一个 bundle 文件,然后上传到微软云服务器(Windows Azure)。 在 app 中启动页(或 splash 页)编写请求更新的代码(请求包含了本地版本,hashCode、appToken 等信息),微软服务端对比本地 js bundle 版本和微软服务器的版本,如果本地版本低,就下载新的 js bundle 下来后实现更新(code push 框架实现)。

15.codePush 接入教程

www.jianshu.com/p/6a5e00d22…

16.React Native 中的 FlatList 和 SectionList 有什么区别

FlatList 是一个高性能的滚动列表组件,适用于长列表的展示;SectionList 在 FlatList 的基础上增加了分组(Section)的概念。

FlatList和ScrollView其实最大的区别就是在渲染上的区别。ScrollView会一次性的把所有内容全部渲染出来,而FlatList会惰性渲染子元素,只在它们将要出现在屏幕中时开始渲染。他们都是基于VirtualizedList的一个封装

17.reactJS的props.children.map函数来遍历会收到异常提示,为什么?应该如何遍历?

this.props.children 的值有三种可能:
1.当前组件没有子节点,它就是undefined;
2.有一个子节点,数据类型是object ;
3.有多个子节点,数据类型就是array 。 系统提供React.Children.map()方法安全的遍历子节点对象

18.Rect Native 增量更新方案

www.jianshu.com/p/2cb3eb960…

19.JS调用原生方法 和 原生调用JS方法

20.请介绍React Native中的调试工具和技术。

  • React Native提供了一些调试工具和技术,帮助开发人员调试和排查应用程序中的问题。
  • React Native Debugger是一个独立的调试工具,提供了调试JavaScript代码、查看网络请求和响应、查看组件层次结构等功能。
  • Chrome开发者工具也可以用于调试React Native应用程序。可以通过在Chrome中打开chrome://inspect页面,并连接到运行中的应用程序进行调试。
  • React Native还提供了一些内置的调试功能,如console.log用于输出日志信息,Reactotron用于可视化调试和监视状态变化等。

21 React Native 打包参数

  • --entry-file :JS根目录文件
  • --platform :选择平台--(ios or android)
  • --transformer :编译器默认编译器地址(/Users/babytree-mbp13/projects/xcodeProjects/AwesomeProject/node_modules/react-native/packager/transformer.js)
  • --dev :是否是开发环境,默认为true
  • --prepack :是否需要预先包装,默认为false
  • --bundle-output :输出的目录文件地址
  • --bundle-encoding :编码格式,默认utf8
  • --sourcemap-output :结果文件存放地址
  • --assets-dest :图片等资源文件存放地址
  • --verbose :是否开启日志打印,默认为false

Android示例 **

react-native bundle --entry-file index.android.js --bundle-output ./android/app/src/main/assets/index.android.bundle --platform android --assets-dest ./android/app/src/main/res/ --dev false

iOS 示例 **

react-native bundle --entry-file index.ios.js --bundle-output ./ios/bundle/index.ios.jsbundle --platform ios --assets-dest ./ios/bundle --dev false