为了对一项新技能有一个坚实的基础,有必要了解它的焦点概念。在下一节中,您将探索 React 的一些独特概念,这将使您更进一步了解这项令人赞叹的技能。
虚拟 DOM
在全部 web 应用中,应用遭受的最昂贵的操纵之一是改变 DOM。为了办理这个题目,React 维护了一个 DOM 的虚拟表示(如图 1-1 所示),它被称为虚拟 DOM 或 VDOM。除了差分算法,React Native 还能够盘算实际 DOM 的增量,并只更新 DOM 中发生变化的部分。因此,更改的数目较少,这导致应用非常快。在应用的开始阶段,你大概看不到它,但是随着你的项目膨胀到疯狂的复杂程度(这通常发生在现实天下的应用中),你将开始看到用户快速体验的好处。
图 1-1。
Virtual DOM and diffing algorithm operations
手动 DOM 操纵很贫苦,并且很难跟踪 DOM 从前的状态。如图 1-1 所示,React 通过保留一个虚拟 DOM 的两个副本来办理这个题目。接下来,对这两个虚拟 DOM 应用一个不同的算法,该算法主要查抄发生的更改并返回 DOM 操纵流。这些 DOM 操纵然后被应用到实际的欣赏器 DOM。
现在让我们从组件的角度来明白虚拟 DOM 是怎样工作的。在 React 中,每个组件都有一个状态;这种状态是可以观察到的。每当状态发生变化时,React 根本上都知道这种变化必要重新渲染。所以当应用状态改变时,它会天生一个新的 VTreediff 算法再次共享了所需更改的 DOM 路径,如图 1-2 所示。这使得手动 DOM 操纵最少。
图 1-2。
Components with virtual DOM
虚拟 DOM 的这个特性不仅重要,而且是 React 的杀手锏。DOM 访问速率非常慢,谦善地说,在大多数应用中一次又一次地访问 DOM 使得情况变得更糟。为了让你的应用运行得更快,你应该尽大概少的打仗 DOM,而虚拟 DOM 的实现很好的处置惩罚了这一点。对于一个小而琐碎的应用,您不会注意到这一点,但是一旦您的应用增长到有数千个 DOM 元素都试图更新,React 将不会让您的性能受到影响。
单向数据流
React 主要是 MVC 模式中的 V,但是在深入 React 中单向数据流的概念之前,您必须明白 MVC 框架的挑战。MVC 框架的最大挑战之一是管理视图。如您所知,MVC 框架的视图组件主要是 DOM 表示。当您编写与 DOM 交互的代码时,这很简单,但是对于框架来说,处置惩罚各种 DOM 操纵黑白常复杂的。
传统的 MVC 视图通常包含许多繁重的 UI,当数据发生变化时,即使是很小的元素,终极也会重新出现应用,循环继承。这是因为通常大多数 MVC 框架都遵循双向数据绑定(见图 1-3 )。
让我们从HouseShare/ios/HouseShare/AppDelegate.m打开AppDelegate.m文件:
#import "AppDelegate.h"
#import "RCTRootView.h"
@implementation AppDelegate
- (BOOL)applicationUIApplication *)application didFinishLaunchingWithOptionsNSDictionary *)launchOptions
{
NSURL *jsCodeLocation;
/**
* Loading JavaScript code - uncomment the one you want.
*
* OPTION 1
* Load from development server. Start the server from the repository root:
*
* $ npm start
*
* To run on a device, change localhost to the IP address of your computer
* (you can get this by typing ifconfig into Terminal and selecting the
* inetvalue underen0 and make sure your computer and iOS device are
* on the same Wi-Fi network.
*/
jsCodeLocation = [NSURL URLWithString"``http://localhost:8081/index.ios.bundle
/**
* OPTION 2
* Load from pre-bundled file on disk. To re-generate the static bundle
* from the root of your project directory, run
*
* $ react-native bundle --minify
*
* seehttp://facebook.github.io/react-native/docs/runningondevice.html
*/
// jsCodeLocation = [[NSBundle mainBundle] URLForResource"main" withExtension"jsbundle"];
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
moduleName"HouseShare"
launchOptions:launchOptions];
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIViewController *rootViewController = [[UIViewController alloc] init];
rootViewController.view = rootView;
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
return YES;
}
@end
RCTRootView是 React Native 提供的 Objective-C 类,继承自 iOS UIView类。它获取并执行您的 JavaScript 代码。
它还加载了http://localhost:8081/index.ios.bundle URL,其中有您用index.ios.js编写的代码,另有一个由 React 本机框架添加的程序。
排除故障
图 3-12。
Now we have a house image
现在,让我们通过用下面的样式更新bottomBox来添加一些样式:
bottomBox: {
flex: 1,
backgroundColor: '#FFFFCC',
alignItems: 'center',
justifyContent: 'center',
},
alignItems和justifyContent分别界说沿横轴和主轴分列伸缩项目标默认行为。因为我们想在中间表现这个,所以我们将这些值更新为center。
刷新屏幕,你会发现房屋图像在视图中居中(见图 3-13 )。
图 3-13。
The house is now centered
我们还可以给定任何服务器图像 URL 作为源,并且Image组件将负责从网络加载它。我们将在本章的后半部分做这件事。
可触摸高亮表现