reactnative项目案例(reactnative实战工程中怎样使用activityindicator)

:暂无数据 2026-04-22 00:40:02 0
结合最近的趋势来看,reactnative项目案例的热度持续攀升,而reactnative实战工程中怎样使用activityindicator作为其核心组成部分,讨论度更是居高不下。

本文目录

reactnative实战工程中怎样使用activityindicator

React native充分利用了Facebook的现有轮子,是一个很优秀的集成作品,并且我相信这个团队对前端的了解很深刻,否则不可能让Native code「退居二线」。

对应到前端开发,整个系统结构是这样:

JSX vs HTML

CSS-layout vs css

ECMAScript 6 vs ECMAScript 5

React native View vs DOM

无需编译,我在第一次编译了ipa装好以后,就再也没更新过app,只要更新云端的js代码,reload一下,整个界面就全变了。

多数布局代码都是JSX,所有Native组件都是标签化的,这对于前端程序员来说,降低了不少学习成本,也大大减少了代码量。不信你可以看看JSX编译后的代码。

复用React系统,也减少了一定学习和开发成本,更重要的是利用了React里面的分层和diff机制。js层传给Native层的是一个diff后的json,然后由Native将这个数据映射成真正的布局视图。

css-layout也是点睛之笔,前端可以继续用熟悉的类css方式来编写布局,通过这个工具转换成c***train布局。

系统只有js-objc的单向调用,就是把原生UI组件的方法通过javascritcore或者webview(低版本iOS)映射到js中来,整个调用过程是异步的,这样的设计令React native可以让js运行在桌面chrome中,通过websocket连接Native code和桌面chrome,极大地方便了调试。对其中的机制Bang的一篇文章写得很详细,我就不拾人牙慧了:React Native通信机制详解 laquo;  bang’s blog 。但这样设计也会带来一些问题,后面说。

点按操作也被抽象成了一组组件(TouchableXXX),这种抽象方式是我在之前做类似工作中没有想到的。facebook还列出Native为什么和web「手感」不同的原因:实时的点按反馈和取消能力。React Native 这套相应机制设计得很完善,能像Native code那样控制整个点按操作的所有过程。

Debug相当方便!修改了js以后,通过内建的nodejs watcher编译成bundle,在模拟器里面按cmd+r就可以看到效果。而且按cmd+d,可以打开一个chrome窗口,所有的js都移到了chrome里面运行,所以什么断点单步打调用栈,都不在话下。

上面的既是特点也是优点,下面说说缺点,或者应该说:「仍然遗留的问题」,在我看来,这个方案已经超越了Hybird方案。

系统仍然(不得不)依赖原生组件暴露出来的组件和方法。举两个例子,ScrollView这个组件,在Native层是有大量事件的,scrollViewWillBeginDragging, scrollViewWillEndDragging,scrollViewDidEndDragging等等,这些事件在现有的版本都没有暴露,基本上做不了组件联动效果。另外,这个版本中有大量组件是iOS only的:ActivityIndicatorIOS、DatePickerIOS、NavigatorIOS、PickerIOS、SliderIOS、SwitchIOS、TabBarIOS、AlertIOS、AppStateIOS、LinkingIOS、PushNotificationIOS、StatusBarIOS、VibrationIOS,反过来看,剩余的都是一些抽象程度极强的基本组件。这样,用户必须在不同的下写两套代码,而且所有能力仍然强烈依赖 React native 开发人员暴露的接口。

由于最外层是React,初次学习成本高,不像往常的Hybird方案,只要多学几个JS API就可以开始干活了。当然,React的确让后续开发变得简单了一些,这么一套外来的(基于iOS)、残缺不全的(css-layout)在React的包装下,的确显得不那么面目可憎了。

另外,React Native仍然很不完善。文档还不全,我基本上是看着他的示例代码完成的demo,集成到已有app的文档也是今天才出来。按照官方的说法,Android版本要到半年后才发布:Blog | React ,届时整个系统设计可能还会有很大的变化。

PS,在使用Tabbar的时候,我惊喜的发现他们居然用了iconfont方案,我现在手头的项目中也有同样的实现,不过API怎么设计一直很头疼。结果,我发现他是这么写的:

《TabBarItemIOS

name="blueTab"

icon={_ix_DEPRECATED(’favorites’)}

.》

在 _ix_DEPRECATED 的定义处,有一句注释: // TODO(nicklockwood): How can this fit our require system?

以上。

下面是一周前,在React native还没开源的时候,通过反解ipa的一些分析过程,有兴趣的可以看看。

------------------------简单粗暴的分割线--------------------

背景和调研手段

React Native还没开源,最近和组里兄弟「反编译」了Facebook Group(这个应用是用React Native实现的)的ipa代码,出来几百个JS文件,格式化一下,花了几天时间读了一下源码,对React Native的内部核心机制算是有了一个基本了解。

React Native的核心实现:

先简单说几点,详细的等回头更新。

  1. React Native里面没有webview,这货不是Hybrid app,里面执行JS是用的

  2. JavascriptCore。

  3. 2. 再说React Native的核心,iOS Native code提供了十来个最基本核心的类(RCTDeviceEventEmitter、RCTRenderingPerf等)、或组件(RCTView、RCTTextField、RCTTextView、RCTModalFullscreenView等),然后由React Native的JS部分,组成二十来个基本组件(Popover、Listview等),交由上层的业务方来使用(THGroupView)。

  4. 3. 就如他们在宣传时所说,他们实现了一套类似css的子集,用来解决样式问题,相当复杂和强大,靠这个才能将Native的核心组件组成JS层的基本组件再组成业务端的业务组件,应该是采用facebook/css-layout · GitHub的C语言版本实现的(在ppt中我们看到了类似flex-direction: column一类的代码,这个正是css-layout支持的语法)。

  5. 4. 在React Native中,写JS的工程师解决的是「将基本组件拼装成可用的React组件」的问题,写Native Code的工程师解决的是「提供核心组件,提供足够的扩展性、灵活性和性能」的问题。

React Native的设计考虑:

ReactJS对React Native有着直接的影响(我没在生产环境中用过React,只看过代码用过Angular,如果有误请指出)

ReactJS里面有这样的设计:

  1. ReactJS 的大工厂入口createElement返回的不是某个实体DOM对象,而只是一个数组

  2. 2. 通过源码中 ui/browser/ 目录中的代码,将这个数组转换成DOM

  3. 3. 底层的渲染核心是可以更换的

另外,Facebook自己有JSX,css-layout等开源项目,基于这些,如果要做一个用 JS来开发Native app的东西,很自然就想到了一套最有效率的搞法:

  1. 将 ui/browser 里面的代码替换成一套 Native 的桥接JS(实际上,iOS版是通过

  2. injectGenericComponentClass方法,将核心组件的方法注入到JS里面 ),就直接复用React的MVVM,自动将数据映射到Native了

  3. 2. Native code里面实现三组核心API,一组提供核心组件的API(create、update、delete),一组事件方法(ReactJS里面的EventEmitter ),一组对css进行解析(css-layout)以及返回Style的ComputedStyle(React Native里面叫meatureStyle)。

这样,用上了ReactJS本身的所有核心功能和设计思路,Native的开发也足够简单。

那,React Native是什么看

其实这东西从Native开发来说,相当于重新发明了一个浏览器渲染引擎并且套一个React的壳,从Web开发角度来说,就是把原来React的后端换成了Native code来实现,就跟Flipboard最近搞的React Canvas 一样: Flipboard · GitHubreact-canvas

React Native的优势和劣势::

优势相对Hybird app或者Webapp:

  1. 不用Webview,彻底摆脱了Webview让人不爽的交互和性能问题

  2. 2. 有较强的扩展性,这是因为Native端提供的是基本控件,JS可以自由组合使用

  3. 3. 可以直接使用Native原生的「」动画(在FB Group这个app里面,面板滑出带一点果冻弹动,面板基于某个点展开这种动画随处可见,这种动画用Native code来做小菜一碟,但是用Web来做就难上加难)。

优势相对于Native app:

  1. 可以通过更新远端JS,直接更新app,不过这快成为各家大型Native app的标配了…

劣势:

  1. 扩展性仍然远远不如web,也远远不如直接写Native code(这个不用废话解释了吧)

  2. 2. 从Native到Web,要做很多概念转换,势必造成双方都要妥协。比如web要用一套CSS的**版,Native通过css-layout拿到最终样式再转换成native原生的表达方式(比如iOS的C***traint\origin\Center等属性),再比如动画。另外,若Android和iOS都要做相同的封装,概念转换就更复杂了。

更新1:添加了React对React Native的影响。

更新2:基本确定其使用了 css-layout,添加了对React Native的总结

更新3: React native已经开源了: React Native,只有iOS版。我写了几个demo,简单看了看objc代码并和开源前的我们的一些结论(见后文)交叉验证。简单地从前端工程师和系统整体角度说一下React native的特点和优劣吧。

更新4: 补充了几条优势和与前端开发的对照

react native实现model效果/底部弹出框/中间弹框/附代码

近期项目中用到一些弹框界面,经过几次优化后觉得挺好用,所以分享给大家。

实现方法很简单,就做几个动画,没什么可说的。可以根据自己需求做一些调整。

该组件对外提供3个可自定义的属性

提供2个控制显示方法和一个控制隐藏方法

使用方法有两种, 建议使用第二种方法

方法一: 在组件中添加属性,然后在合适的地方调用组件的show和hide方法控制显示和隐藏。在一个界面多个弹框的情况下需要在renderContent方法中判断显示哪一个弹框,复杂度增加,所以建议使用第二种方法。

方法二: 调用组件提供的showWithContent方法。调用该方法后会自动显示弹框,只需要在合适的位置调用hide隐藏方法

如何编译ReactNative示例程序Examples

  编译示例程序需要将整个项目导入到androidStudio中,androidStudio导入项目时选择react-native/ReactAndroid目录。
  由于项目依赖ndk因此如果要编译Examples还需要安装配置ndk目录,下载ndk后是一个自解压程序,会释放ndk的目录。
  然后需要设置环境变量或者在react-native根目录下新建*****文件,文件内容如下:
  *****=c:\你的sdk目录
  *****=c:\你的ndk目录
  设置要之后就可以编译了,导入和编译的过程比较曲折,请继续看下文。
  在编译AwesomeProject项目时,没有用到ndk,实际上这里的ndk默认情况下并没有用到,只是gradle的设置里有ndk因此必须配置ndk才能导入项目。
  ndk是在编译核心库是才用到,核心库位于react-native/ReactAndroid,导入整个项目时以lib形式存在。查看Examples目录下UIExplorer,会发现在*****是以在线的方式导入核心库的。通过源码的方式导入被注释掉了。
  dependencies {
  compile fileTree(dir: ’libs’, include: )
  compile ’*****:appcompat-v7:*****’
  // Depend on pre-built React Nativecompile ’*****:react-native:****.+’
  // Depend on React Native source.
  // This is useful for testing your changes when working on React Native.
  // compile project(’:ReactAndroid’)
  }
  由此可知,编译UIExplorer并不需要ndk,如果你不想设置ndk,有2个办法
  1.拷贝AwesomeProject项目中的*****,*****到UIExplorer的android目录,在导入项目时选择UIExplorer/android就可以了,这样androidStudio会导入单个项目,否则会导入整个项目。
  2.用androidStudio新建一个同名的项目,然后把UIExplorer目录中的文件拷贝到新建的项目中。
  编译好之后启动服务器端,到react-native目录下执行:
  npm install
  node packager\*****
***隐藏网址***
***隐藏网址***
  原因是,js代码和android原生代码不同步,通过*****可以看到android下的引用的reactNative核心库为11,而js代码版本已经更新到12了。
  解决的办法有2个,一个是使用git工具(如**artGit),将js代码恢复到之前的版本,另一个办法是重新编译reactNative的核心库,编译核心库需要ndk,在mac下没有问题,在windows编译会出错。编译reactNative核心库,对UIExplorer下注释掉的依赖项进行修改即可,编译速度较慢 需要在线下载第三方依赖库。
  dependencies {
  compile fileTree(dir: ’libs’, include: )
  compile ’*****:appcompat-v7:*****’
  // Depend on pre-built React Native//compile ’*****:react-native:****.+’
  // Depend on React Native source.
  // This is useful for testing your changes when working on React Native.
  compile project(’:ReactAndroid’)
  }
  由于windows下无法编译,所以这里提供编译好的aar文件,修改UIExplorer *****中的依赖项就可以了。至于如何引入aar文件,可以自行搜索。当然mac下同样也可以用这个aar,可以省去不少麻烦。

除了reactnative实战工程中怎样使用activityindicatorreactnative项目案例领域还有很多值得探讨的话题。点击下方“相关推荐”,发现更多精彩内容。
本文编辑:admin

本文相关文章:


reactive翻译(reactive oxygen species是什么意思)

reactive翻译(reactive oxygen species是什么意思)

我们注意到,那些在reactive翻译上表现突出的人,往往都对reactive oxygen species是什么意思有独到的见解。这并非巧合。

2026年4月14日 23:00

更多文章:


buffermode(DMA doublebuffer问题求助)

buffermode(DMA doublebuffer问题求助)

buffermode和DMA doublebuffer问题求助,看似独立,实则血脉相连。它们是如何相互影响的?本文将为你层层剖析。

2026年4月22日 02:20

web服务器类型(为什么需要web服务器及web服务器是什么)

web服务器类型(为什么需要web服务器及web服务器是什么)

web服务器类型的背后,隐藏着怎样的秘密?为什么需要web服务器及web服务器是什么又在其中扮演了何种角色?带着疑问,我们一起探秘。

2026年4月22日 02:00

empty love钢琴谱(empty love什么意思/什么含义)

empty love钢琴谱(empty love什么意思/什么含义)

从我第一次听说empty love钢琴谱到真正弄懂empty love什么意思/什么含义,也走过一些弯路。下面就把我的学习心得分享给大家,希望能让您的入门之路更顺畅。

2026年4月22日 01:40

js中的innerhtml(js怎么取innerHTML里面的值)

js中的innerhtml(js怎么取innerHTML里面的值)

就像学骑车需要掌握平衡一样,理解js中的innerhtml的窍门,恰恰在于把握好js怎么取innerHTML里面的值这个“平衡点”。

2026年4月22日 01:20

distinctive的中文翻译(四季分明用翻译成英语怎么说啊)

distinctive的中文翻译(四季分明用翻译成英语怎么说啊)

从我第一次听说distinctive的中文翻译到真正弄懂四季分明用翻译成英语怎么说啊,也走过一些弯路。下面就把我的学习心得分享给大家,希望能让您的入门之路更顺畅。

2026年4月22日 01:00

reactnative项目案例(reactnative实战工程中怎样使用activityindicator)

reactnative项目案例(reactnative实战工程中怎样使用activityindicator)

结合最近的趋势来看,reactnative项目案例的热度持续攀升,而reactnative实战工程中怎样使用activityindicator作为其核心组成部分,讨论度更是居高不下。

2026年4月22日 00:40

io编程是什么(可编程数字IO是什么意思呢)

io编程是什么(可编程数字IO是什么意思呢)

io编程是什么和可编程数字IO是什么意思呢,看似独立,实则血脉相连。它们是如何相互影响的?本文将为你层层剖析。

2026年4月22日 00:20

aptana studio 3 windows 10(求Aptana Studio 3 汉化版软件)

aptana studio 3 windows 10(求Aptana Studio 3 汉化版软件)

您是否曾想过,aptana studio 3 windows 10究竟是怎么一回事?它与求Aptana Studio 3 汉化版软件之间又有什么联系?本文将为您一探究竟。

2026年4月22日 00:00

旅游网站源码csdn(求erdaicms二代旅游网站源码,没加密过的)

旅游网站源码csdn(求erdaicms二代旅游网站源码,没加密过的)

很多朋友初次接触旅游网站源码csdn可能会觉得有点陌生,这很正常。今天这篇文章,咱们就一起把求erdaicms二代旅游网站源码,没加密过的这事儿聊透,希望能帮您理清思路。

2026年4月21日 23:40

excel 多条件查找(并非要数组公式)?打开excel时,正在计算(2个处理器) 如何解决

excel 多条件查找(并非要数组公式)?打开excel时,正在计算(2个处理器) 如何解决

各位老铁们好,相信很多人对非数组公式都不是特别的了解,因此呢,今天就来为大家分享下关于非数组公式以及excel 多条件查找(并非要数组公式)的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2026年4月21日 23:20

最近更新

buffermode(DMA doublebuffer问题求助)
2026-04-22 02:20:02 浏览:0
empty love钢琴谱(empty love什么意思/什么含义)
2026-04-22 01:40:02 浏览:0
js中的innerhtml(js怎么取innerHTML里面的值)
2026-04-22 01:20:02 浏览:0
reactnative项目案例(reactnative实战工程中怎样使用activityindicator)
2026-04-22 00:40:02 浏览:0
aptana studio 3 windows 10(求Aptana Studio 3 汉化版软件)
2026-04-22 00:00:02 浏览:0
热门文章

split函数 sql(求sql split函数的用法)
2026-03-26 20:40:01 浏览:1
phpweb 采用wamp(php环境搭建)
2026-03-28 14:00:01 浏览:1
android studio怎么使用(android studio怎么使用)
2026-03-25 23:20:01 浏览:0
floatleft是什么意思(displayflex和floatleft的区别)
2026-04-17 04:40:03 浏览:0
标签列表