一、简介

每一个应用程序的运行都有一个入口文件或者入口函数,例如iOS中的使用UIApplicationMain类完成入口函数的实现,在React-Native中,AppRegistry类就肩负着这个责任。AppRegistry主要负责运行React-Native应用程序的JavaScript入口,注册根组件,注册的方式是AppRegistry.registerComponent()。当注册完应用程序组件后,Native系统(Objective-C)就会加载jsbundle文件并且触发AppRegistry.runApplication运用应用。

React-Native的注册入口函数示例如下:将组件ReactNativeDemo作为应用程序的根容器

AppRegistry.registerComponent('ReactNativeDemo', () => ReactNativeDemo);

AppRegistry.runApplication函数运行结果示例如下:

-- ::35.806 [info][tid:com.facebook.react.JavaScript] Running application "ReactNativeDemo" with appParams: {"rootTag":,"initialProps":{}}. __DEV__ === true, development-level warning are ON, performance optimizations are OFF

通过console.log(AppRegistry.runApplication.toString())打印具体的AppRegistry.runApplication函数实现如下所示:

-- ::26.043 [info][tid:com.facebook.react.JavaScript] function runApplication(appKey, appParameters) {
var msg = 'Running application "' + appKey + '" with appParams: ' + JSON.stringify(appParameters) + '. ' + '__DEV__ === ' + String(__DEV__) + ', development-level warning are ' + (__DEV__ ? 'ON' : 'OFF') + ', performance optimizations are ' + (__DEV__ ? 'OFF' : 'ON');
infoLog(msg);
BugReporting.addSource('AppRegistry.runApplication' + runCount++, function () {
return msg;
});
invariant(runnables[appKey] && runnables[appKey].run, 'Application ' + appKey + ' has not been registered.\n\n' + 'Hint: This error often happens when you\'re running the packager ' + '(local dev server) from a wrong folder. For example you have ' + 'multiple apps and the packager is still running for the app you ' + 'were working on before.\nIf this is the case, simply kill the old ' + 'packager instance (e.g. close the packager terminal window) ' + 'and start the packager in the correct app folder (e.g. cd into app ' + 'folder and run \'npm start\').\n\n' + 'This error can also happen due to a require() error during ' + 'initialization or failure to call AppRegistry.registerComponent.\n\n');
FrameRateLogger.setContext(appKey);
runnables[appKey].run(appParameters);
}

二、API

//静态方法,进行注册配置
registerConfig(config: Array<AppConfig>) //注册一个切片
AppRegistry.registerSection(appKey, component) //注册入口组件
registerComponent(appKey: string, component: ComponentProvider, section?:boolean) //注册监听函数,如果appKey不存在会报错。
registerRunnable(appKey: string, run: Function) //获取registerRunnable注册的监听键
getAppKeys() //运行App,也即注册的对应的appKey入口组件
runApplication(appKey: string, appParameters: any) //结束应用,不传参数默认结束appKeys中的第一个
AppRegistry.unmountApplicationComponentAtRootTag(rootTag) //执行对应的任务。第二个参数是一个方法,要求返回的是一个Promise对象
AppRegistry.startHeadlessTask(taskId, taskKey, data) //创建一个任务,这个线程不支持UI
AppRegistry.registerHeadlessTask(taskKey, task)

三、使用

1、修改应用程序入口,也能正常启动APP

AppDelegate.m:

//此处我将之前的应用程序名称ReactNativeDemo修改为现在的MyApp
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
moduleName:@"MyApp"
initialProperties:nil
launchOptions:launchOptions];

index.ios.js:

//此处我修改之前注册的应用程序名称reactNativeDemo为现在的MyApp
AppRegistry.registerComponent('MyApp', () => MyApp);

打印结果如下:

-- ::49.359 [info][tid:main][RCTBatchedBridge.m:] Initializing <RCTBatchedBridge: 0x600002630700> (parent: <RCTBridge: 0x6000034390a0>, executor: RCTJSCExecutor)
-- ::49.405 [warn][tid:com.facebook.react.JavaScript][RCTModuleData.mm:] RCTBridge required dispatch_sync to load RCTDevSettings. This may lead to deadlocks
-- ::49.609 [info][tid:main][RCTRootView.m:] Running application MyApp ({
initialProps = {
};
rootTag = ;
})
-- ::49.611 [info][tid:com.facebook.react.JavaScript] Running application "MyApp" with appParams: {"rootTag":,"initialProps":{}}. __DEV__ === true, development-level warning are ON, performance optimizations are OFF

2、我们可以使用registerRunnable函数注册一些AppKey,然后通过getAppKeys获取所有的注册键。

AppRegistry.registerRunnable("XYQ", function () {});
AppRegistry.registerRunnable("YPX", function () {});
const appKeys = AppRegistry.getAppKeys();
console.log(appKeys);

打印结果如下:

-- ::40.029 [info][tid:com.facebook.react.JavaScript] [ 'XYQ', 'YPX' ]

ReactNative: 使用AppReistry注册类的更多相关文章

  1. C#下没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))

    C#下没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG)) 原因:没有原生支持64位,而是以32位兼容方式运行 解决办法:在项目属性里设置“生成” ...

  2. 检索 COM 类工厂中 CLSID 为 {820280E0-8ADA-4582-A1D9-960A83CE8BB5} 的组件失败,原因是出现以下错误: 80040154 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))。

    检索 COM 类工厂中 CLSID 为 {820280E0-8ADA-4582-A1D9-960A83CE8BB5} 的组件失败,原因是出现以下错误: 80040154 没有注册类 (异常来自 HRE ...

  3. Chrome 没有注册类

    妈蛋这个问题折腾了好久,百度都是噼里啪啦什么什么进入注册表什么的删除啊 操  看着难受死了 这边也有这个些 没有注册类原因什么的的百度一下就有了 解决办法 管理员身份运行CMD 输入 REG DELE ...

  4. 原因是出现以下错误: 80040154 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))

    场景: 客户端初始化正常,到IIS服务就报80040154. System.Web.Services.Protocols.SoapException: System.Web.Services.Prot ...

  5. Win8 x64环境下VS2010 C#工程运行报错:没有注册类 (异常来自 HRESULT:0x80040154

    来源:http://blog.sina.com.cn/s/blog_7095482001019c2v.html 问题描述: 在Win8 x64环境下,VS2010的C#工程中引用了COM组件(Acti ...

  6. 解决win8下chrome浏览器打开提示没有注册类的方法

    今天又把win8装回来了,继续装了个chrome浏览器,但是发现只能从安装的文件打开,从快捷方式或者快速启动栏都会提示没有注册类.找到一种解决的办法是删除注册表中的相关键值,具体如下: 1.打开注册表 ...

  7. 预览Cube出现没有注册类错误

    用Microsoft SQL Server Management Studio预览AS上的Cube 出现如下错误. TITLE: Microsoft SQL Server Management Stu ...

  8. 无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类型,原因为没有注册类

    错误描述 e = {"无法将类型为"System.__ComObject"的 COM 对象强制转换为接口类型"OpcRcw.Da.IOPCServer" ...

  9. 解决chrome浏览器在win8下没有注册类的问题

    解决chrome浏览器在win8下没有注册类的问题 新建一个txt,里面存放代码 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SO ...

随机推荐

  1. java 运算符&表达式

    1. java中,模运算符%可以获取整数除法的余数,同样适用于浮点类型数据.double y = 23.56; y%5;(即y mod 5 =3.56) [c/c++中,要求%两侧均为整数数据.] 2 ...

  2. linux搭建Git

    安装依赖库和编译工具为了后续安装能正常进行,我们先来安装一些相关依赖库和编译工具yum install curl-devel expat-devel gettext-devel openssl-dev ...

  3. 2019-2020-1 20199304《Linux内核原理与分析》第七周作业

    进程的描述和进程的创建 1.进程描述 1.1操作系统的三大管理功能以及对应的抽象概念: 进程管理 内存管理 文件系统 1.2Linux进程的状态: (1)Linux中进程的状态细分可以分为七种: R运 ...

  4. 用墨卡托和GPS坐标计算距离时误差测试

    iOS墨卡托和GPS坐标计算距离时误差测试,测试结果: 墨卡托和gps坐标来回转换没有误差. 墨卡托坐标计算出的距离比gps坐标计算出的距离大,100/92*100 = 108米,每100米多算出8米 ...

  5. SpringBoot 发送邮件功能实现

    背景 有个小伙伴问我你以前发邮件功能怎么弄的.然后我就给他找了个demo,正好在此也写一下,分享给大家. 理清痛点 发送邮件,大家可以想一下,坑的地方在哪? 我觉得是三个吧. 第一:邮件白名单问题. ...

  6. Java分割面板和选项卡面板的应用

    1.分割面板 JSplitPane类的常用构造方法 构造方法 说明 JSplitPane() 创建一个默认的分割面板.默认情况下为在水平方向上分割,重绘方式为只在调整分隔条位置完成时重绘 JSplit ...

  7. redis数据类型--set

    set是String的一个无序集合,最大存储量2^32-1(大概40多亿) 1.操作命令:(xxx可以是任意字符串) sadd xxx a b c d e (添加一个或多个) smembers xxx ...

  8. android 点击无效验证

    背景 在写一个东西滑动删除列表的时候,出现了一个问题.我的需求是,左滑然后出现delete,然后点击delete,让该滑块消失. 我在点列表的第一行的时候,左滑,出现delete,点击删除,ok的,完 ...

  9. mininet(一)实验环境搭建

    mininet(一)实验环境搭建 mininet(二)简单的路由实验 mininet(三)简单的NAT实验 最近学习(https://github.com/mininet/openflow-tutor ...

  10. hdu4585Shaolin

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4585 题意: 第一个人ID为1,战斗力为1e9. 给定n,给出n个人的ID和战斗力. 每个人必须和战斗 ...