实践技巧
笔者正在开发一个自己的

How it works in iOS(iOS 本地的实现)
UIActivityViewController
这个控件,它提供了简单的模态对话框的功能,可以显现在屏幕的底端,进行一些预定义的操作。对于
- (IBAction)shareButton:(UIBarButtonItem *)sender
{
NSString *textToShare = @"Look at this awesome website for aspiring iOS Developers!";
NSURL *myWebsite = [NSURL URLWithString:@"http://www.codingexplorer.com/"];
NSArray *objectsToShare = @[textToShare, myWebsite];
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:objectsToShare applicationActivities:nil];
NSArray *excludeActivities = @[UIActivityTypeAirDrop,
UIActivityTypePrint,
UIActivityTypeAssignToContact,
UIActivityTypeSaveToCameraRoll,
UIActivityTypeAddToReadingList,
UIActivityTypePostToFlickr,
UIActivityTypePostToVimeo];
activityVC.excludedActivityTypes = excludeActivities;
[self presentViewController:activityVC animated:YES completion:nil];
}
对于如何在本地端构造并且弹出一个分享模态窗口这边不做赘述,但是需要讨论的是,应该以
How to call the Share dialog from a native module
因此还是打算用切换

初始化代码的模板如下所示:
//
// RCTShareManager.h
//
#import <RCTBridgeModule.h>
@interface RCTShareManager : NSObject <RCTBridgeModule>
@end
//
//
// RCTShareManager.m
//
#import "RCTShareManager.h"
@implementation RCTShareManager
RCT_EXPORT_MODULE();
RCT_EXPORT_METHOD(shareURL:(NSString *)URLString)
{
// Some native code
}
@end
最终
var React = require("react-native");
var ShareManager = React.NativeModules.ShareManager;
// Somewhere in your component...
function onPress() {
ShareManager.shareURL(someURL);
}
在本地代码中,可以按照如下方法将
//
// RCTShareManager.m
//
#import "RCTShareManager.h"
@import UIKit;
@implementation RCTShareManager
RCT_EXPORT_MODULE();
RCT_EXPORT_METHOD(shareURL:(NSString *)URLString)
{
NSArray *objectsToShare = @[[NSURL URLWithString:URLString]];
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:objectsToShare applicationActivities:nil];
UIViewController *rootController = UIApplication.sharedApplication.delegate.window.rootViewController;
[rootController presentViewController:activityVC animated:YES completion:nil];
}
@end
不过如果按照上面说的这样处理之后,
This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes. This will cause an exception in a future release.
并且经过较长时间之后,屏幕会如下所示:

这是因为
RCT_EXPORT_METHOD(shareURL:(NSString *)URLString)
{
NSArray *objectsToShare = @[[NSURL URLWithString:URLString]];
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:objectsToShare applicationActivities:nil];
UIViewController *rootController = UIApplication.sharedApplication.delegate.window.rootViewController;
dispatch_async(dispatch_get_main_queue(), ^{
[rootController presentViewController:activityVC animated:YES completion:nil];
});
}
本文翻译自React Native: Things I wish I knew before starting out.,从属于笔者的
ReactNative 入门与最佳实践系列文章。
React Native 是个非常优秀的项目,不过鉴于其仍处于不断地演进开发中,我们可能阅读到的很多的教程里的信息还是面向旧版本的。本文就是记录了些根据笔者的日常开发总结而来的你应该格外注意而又没有在文档中强调的细节要点。我会尽可能地在版本迭代之后更新本文的内容,不过还是要强调下本文编写于
rnpm link
react-native
命令行工具中,可以直接通过react-native link
命令运行。不要单独的安装
自定义字体?你并不需要编辑Android/iOS 项目
这一点好像也没有在文档之中并没有详细提及,不过根据这里描述的,我们并不需要编辑assets
文件夹,拖入你所需要用的字体文件,然后在你的package.json
中添加如下配置
"rnpm": { "assets": ["assets"] },
然后,执行react-native link
命令,该命令不仅会将第三方模块的原生代码链接入fontFamily
来使用安装好的字体。不过有时候使用react-native link
并不能如人所愿,此时你可以参考下react-native-video这里的一些教程。
另外,需要注意的是目前
RN 中集成了不少非标准的Babel Plugins
Flow
Flow是
function foo(argument1: string, argument2: number): string {
argument1 = 0; // this will fail when running flow
argument2 = 0; // but this won't!return 1; // this however, will - you guessed it - fail.
}
// @flow
,不过根据测试因为
ES7 Class Properties
class MyComponent extends Component {
constructor(props) {
super(props);
this.thisIsAField = 1;
}
}
MyComponent.propTypes = {
firstname: React.PropTypes.string,
lastname: React.PropTypes.string
};
而可以写成这样
class MyClass {
thisIsAField = 1;
static propTypes = {
firstname: React.PropTypes.string,
lastname: React.PropTypes.string
};
}
Object Spread Operator
Object Spread Operator可以使得对象的合并更加方便,类似于...
来解构某个对象,譬如
// Rest propertieslet { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
console.log(x); // 1
console.log(y); // 2
console.log(z); // { a: 3, b: 4 }// Spread propertieslet n = { x, y, ...z };
console.log(n); // { x: 1, y: 2, a: 3, b: 4 }