首页 文章 精选 留言 我的

精选列表

搜索[reactnative],共132篇文章
优秀的个人博客,低调大师

ReactNative初探

1.给Activity定制View 1)定义my.js,并在js里定义MyComponent,注意组件要以export default修饰 2)在项目启动js(index.android.js)里引入自定义js文件里的组件 import MyComponent frommy.js(相对路径或者全路径) 在最后,注册组件: ppRegistry.registerComponent('MyComponent', () => MyComponent); 3)最后,在activity里 getMainComponentName() 返回MyComponent名称 本文转自屠夫章哥 51CTO博客,原文链接http://blog.51cto.com/4259297/1841188:,如需转载请自行联系原作者

优秀的个人博客,低调大师

ReactNative 0.57 CodePush配置

之前添加code-push看了无数帖子,内容都差别比较大.我就把自己亲测有效的过程整理下.(后续有时间会完善) 注册code-push账号 rn环境搭建 code-push授权本机开发 在code-push中添加项目,会生成Production和Staging 在项目根目录下执行react-native link ,按照提示将Staging依次填入,然后link成功(99%教程都会让忽略填写,然后在各种地方配置,其实没必要) 生产环境,打包的时候,ios端的话需要再执行一个命令,生成main.jsbundle文件.android不需要 react-native bundle --entry-file index.js --bundle-output ./ios/main.jsbundle --platform ios --assets-dest ./ios --dev false 走到这里已经成功99%了,然后就在项目中执行codePush.sync方法即可,看文档就可以了.

优秀的个人博客,低调大师

ReactNative封装Android原生组件

本篇以封装按钮组件为例. Ready 在开始封装之前,希望你已经在本机搭建好React Native的Android运行环境. Go Android部分 创建一个原生的按钮,并为其添加映射事件以及按钮属性 package com.RCTButton; import android.view.View; import android.widget.Button; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.MapBuilder; import com.facebook.react.uimanager.SimpleViewManager; import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.uimanager.annotations.ReactProp; import com.facebook.react.uimanager.events.RCTEventEmitter; import java.util.Map; import javax.annotation.Nullable; public class RCTButton extends SimpleViewManager<Button> { private ThemedReactContext mContext; // private static final String EVENT_NAME_ONCLICK_NATIVE = "onClick"; private static final String EVENT_NAME_ONCLICK_NATIVE = "nativeClick"; private static final String EVENT_NAME_ONCLICK_JS = "jsClick"; @Override public String getName() { return "RCTButton"; } @Override protected Button createViewInstance(ThemedReactContext reactContext) { this.mContext = reactContext; Button button = new Button(reactContext); return button; } @Override protected void addEventEmitters(final ThemedReactContext reactContext, Button view) { super.addEventEmitters(reactContext, view); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { WritableMap data = Arguments.createMap(); data.putString("msg", "点击按钮"); reactContext.getJSModule(RCTEventEmitter.class).receiveEvent( v.getId(), EVENT_NAME_ONCLICK_NATIVE, data ); } }); } /* name="text" : name对应的值是在js代码中使用该封装组件时的属性名。 */ @ReactProp(name = "text") public void setText(Button button, String text) { button.setText(text); } @Nullable @Override public Map<String, Object> getExportedCustomDirectEventTypeConstants() { return MapBuilder.<String, Object>builder() .put( EVENT_NAME_ONCLICK_NATIVE, MapBuilder.of( "registrationName", EVENT_NAME_ONCLICK_JS)) .build(); } } 注册该UI组件 package com.RCTButton; import com.facebook.react.ReactPackage; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; import java.util.Arrays; import java.util.Collections; import java.util.List; public class RCTViewPackage implements ReactPackage { @Override public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { return Collections.emptyList(); } @Override public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { return Arrays.<ViewManager>asList(new RCTButton()); } } 在MainApplication中注册 package com.batsoftapp; import android.app.Application; import com.RCTButton.RCTViewPackage; import com.facebook.react.ReactApplication; import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactPackage; import com.facebook.react.shell.MainReactPackage; import com.facebook.soloader.SoLoader; import java.util.Arrays; import java.util.List; public class MainApplication extends Application implements ReactApplication { private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { @Override public boolean getUseDeveloperSupport() { return BuildConfig.DEBUG; } @Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(), new RCTViewPackage() ); } @Override protected String getJSMainModuleName() { return "index"; } }; @Override public ReactNativeHost getReactNativeHost() { return mReactNativeHost; } @Override public void onCreate() { super.onCreate(); SoLoader.init(this, /* native exopackage */ false); } } React Native JS部分 'use strict'; import React, {PureComponent} from 'react'; import { View, Image, FlatList, StyleSheet, TouchableOpacity, requireNativeComponent } from 'react-native'; import PropTypes from 'prop-types'; let rctButton = { name: 'RCTButton', propTypes: { text: PropTypes.string, ...View.propTypes } } let RCTButton = requireNativeComponent('RCTButton', rctButton); export default class Example extends PureComponent { jsClick(event) { alert(event.nativeEvent.msg) } render(){ <View style={[ThemeStyle.container}]}> <RCTButton style={{height: 50, width: 200}} text={'点击'} jsClick={(event) => this.jsClick(event)}/> </View> } } 最终效果 Untitled1.gif

优秀的个人博客,低调大师

ReactNative调用Android原生模块

有时候App需要访问平台API,但React Native可能还没有相应的模块包装;或者你需要复用一些Java代码,而不是用Javascript重新实现一遍;又或者你需要实现某些高性能的、多线程的代码,譬如图片处理、数据库、或者各种高级扩展等等。我们把React Native设计为可以在其基础上编写真正的原生代码,并且可以访问平台所有的能力。要想实现访问Android原生API,总结一下,主要有以下几个步骤: 1. 创建一个原生模块 这个原生模块是一个继承ReactContextBaseJavaModule的Java类,它可以实现一些JavaScript所调用的原生功能。我们的目标是可以在JavaScript里写ToastAndroid.show('Awesome', ToastAndroid.SHORT);,来调起一个Toast通知。例如: public class RnTest extends ReactContextBaseJavaModule { public RnTest(ReactApplicationContext reactContext) { super(reactContext); } // ReactContextBaseJavaModule要求派生类实现getName方法。这个函数用于返回一个字符串 // 这个字符串用于在JavaScript端标记这个原生模块 @Override public String getName() { return "ToastByAndroid"; } // 获取应用包名 // 要导出一个方法给JavaScript使用,Java方法需要使用注解@ReactMethod @ReactMethod public void getPackageName() { String name = getReactApplicationContext().getPackageName(); Toast.makeText(getReactApplicationContext(),name,Toast.LENGTH_LONG).show(); } } ReactContextBaseJavaModule要求派生类实现getName方法。这个函数用于返回一个字符串名字,这个名字在JavaScript端标记这个模块。这里我们把这个模块叫做ToastByAndroid,这样就可以在JavaScript中通过React.NativeModules.ToastByAndroid访问到这个模块。注意:模块名前的RCT前缀会被自动移除。所以如果返回的字符串为"RCTToastAndroid",在JavaScript端依然通过React.NativeModules.ToastByAndroid访问到这个模块。 2. 注册模块 要使JavaScript端调用到原生模块还需注册这个原生模块,需要实现一个类实现ReactPackage接口,并实现其中的抽象方法。例如: public class ExampleReactPackage implements ReactPackage { @Override public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { List<NativeModule> modules = new ArrayList<>(); modules.add(new RnTest(reactContext)); return modules; } @Override public List<Class<? extends JavaScriptModule>> createJSModules() { return Collections.emptyList(); } @Override public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { return Collections.emptyList(); } } MainApplication声明 除了上面的步骤外,还需在MainApplication.java文件中的getPackages方法中,实例化上面的注册类。例如: @Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(), // 实例化注册类 new ExampleReactPackage()); } }; 3. JS调用android原生方法 3.1 引入NativeModules模块 import { NativeModules } from 'react-native'; 3.2 调用Android原生方法 var rnToastAndroid = NativeModules.ToastByAndroid; rnToastAndroid.getPackageName(); 4. 获取android返回值 提供给js调用的原生android方法的返回类型必须是void,React Native的跨语言访问是异步进行的,所以想要给JavaScript返回一个值的唯一办法是使用回调函数或者发送事件。 4.1 回调函数 Callback是React.bridge中的一个接口,它作为ReactMethod的一个传参,用来映射JavaScript的回调函数(function)。Callback接口只定义了一个方法invoke,invoke接受多个参数,这个参数必须是react.bridge中支持的参数。Android端代码: @ReactMethod public void tryCallBack(String name,String psw,Callback errorCallback,Callback successCallback){ try{ if(TextUtils.isEmpty(name)&&TextUtils.isEmpty(psw)){ // 失败时回调 errorCallback.invoke("user or psw is empty"); } // 成功时回调 successCallback.invoke("add user success"); }catch(IllegalViewOperationException e){ // 失败时回调 errorCallback.invoke(e.getMessage()); } } rn端代码: var rnToastAndroid = NativeModules.ToastByAndroid; rnToastAndroid.tryCallBack("luo","131",(errorCallback)=>{alert(errorCallback)},(successCallback)=>{alert(successCallback);}); 5.调用测试 android主动向rn发送消息。 5.1 android端代码 public static void sendEvent(ReactContext reactContext, String eventName, int status) { System.out.println("reactContext="+reactContext); reactContext .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) .emit(eventName,status); } 5.2 RN端代码 // eventName为5.1中的eventName,reminder为5.1中的status DeviceEventEmitter.addListener(eventName, (reminder) => { console.log(reminder): }); RN调用Android原生模块的代码如下: const RNBridgeModule = NativeModules.RNBridgeModule; nativeLanuchApp(message) { RNBridgeModule.nativePlayVideo(message); } <TouchableOpacity onPress={() => { this.nativeLanuchApp("111"); }} > <Text > try </Text> </TouchableOpacity>

优秀的个人博客,低调大师

如何集成华为AGC性能分析-ReactNative

简介 AppGallery Connect(简称AGC)性能管理(APM,App Performance Management)服务提供分钟级应用性能监控能力,您可以在AGC查看和分析APM收集到的应用性能数据,实时全面掌握应用在线的性能表现,帮助您快速闭环应用的性能问题,持续提升应用的用户体验。 开通服务和集成SDK 1、登录AppGallery Connect网站,点击“我的项目”。 2、在项目列表中找到您的项目,在项目下的应用列表中选择需要开通性能管理服务的应用。 3、进入“质量 > 性能管理”,如果APM服务未开通,请点击“立即开通”,开通APM服务。 4、选择常规页签下的“应用”区域,下载agconnect-services配置文件。 Android:下载agconnect-services.json文件。 iOS:下载agconnect-services.plist文件。 5、在React Native开发项目中添加配置文件。 Android:将配置文件agconnect-services.json添加到React Native项目的android/app目录下。 iOS:用Xcode打开React Native项目的iOS模块,将配置文件agconnect-services.plist添加进项目。 6、进入项目工程目录下,使用如下命令安装性能管理服务插件。 npm i @react-native-agconnect/apm复制 7、安装成功效果如下图。 界面设计 您可以在React Native项目中创建一个布局页面,参照下图进行设计。 ​ 功能按钮从上至下描述如下: 开启收集性能监控数据按钮 查询已有参数追踪按钮 启用ANR监控功能按钮 将用户ID与报告的数据绑定按钮 参数追踪按钮 创建网络请求示例按钮 功能开发 1、初始化APMS实例。 constructor() { this.instance = AGCApmModule.getInstance() } static getInstance() { if (!this.instance) { return new APMS() } } 2、设置是否启用APM来收集性能监控数据。如果此参数设置为false,APM将停止收集应用性能数据,默认值为true。 enableCollection(enable = true) { return AGCApmModule.enableCollection(enable) } 3、设置是否启用ANR监控功能。默认值为true,表示启用了ANR 监控并报告了数据。要禁用ANR监控,将此参数设置为false。 enableAnrMonitor(enable = true) { return AGCApmModule.enableAnrMonitor(enable) } 4、将用户ID与报告的数据绑定。报告性能数据时,可以同时报告用户 ID 以方便故障定位。 setUserIdentifier(userIdentifier) { if (Platform.OS === 'ios' ) { throw new Error('This function does not support IOS platform.') } return AGCApmModule.setUserIdentifier(userIdentifier) } 5、您可以通过添加自定义指标来监控该记录相关的性能事件,性能管理插件根据输入参数在应用中创建特定场景的自定义跟踪。 createCustomTrace(traceName) { if (Platform.OS === 'ios' ) { throw new Error('This function does not support IOS platform.') } let id = Math.random().toString(36).substr(2, 9); return AGCApmModule.createCustomTrace(traceName, id) .then( () => { return new CustomTrace(traceName, id) }) .catch(error => { throw error }) } 6、为收集网络性能数据的每个网络请求,创建一个网络请求示例。 createNetworkMeasure(url, httpMethod) { if (Platform.OS === 'ios' ) { throw new Error('This function does not support IOS platform.') } let id = Math.random().toString(36).substr(2, 9); return AGCApmModule.createNetworkMeasure(url, httpMethod, id) .then( () => { return new NetworkMeasure(url, httpMethod, id); }) .catch(error => { throw error }) } 查看和分析性能数据 1、选择“质量 > 性能管理”,进入“应用性能管理”页面。点击“概览",进入概览。指标概览包括“活跃设备数”、“启动次数”、“启动耗时”、“用户ANR率”和“网络请求耗时”、“网络请求成功率”。 2、点击“启动分析 ",就进入了“应用启动耗时”页面,可以看到启动耗时随时间变化的分布情况,以及启动耗时的版本分布。 3、点击“网络分析”,进入网络分析详情页面。可以看到网络请求耗时、网络请求成功率等数据,还有网络各阶段耗时趋势图表、以及URL详情。 4、点击“应用分析>应用启动耗时”,可以看到应用启动时长的分布情况。 恭喜您 祝贺您,您已经成功地构建了您的第一个集成AGC性能管理服务的应用程序,并学到了如何在AGC控制台查看应用性能数据。 参考文档 性能分析

优秀的个人博客,低调大师

ReactNative项目打包(Android && IOS)

Android项目打包 1, 产生签名的key 在项目的主目录中执行: keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000 [注:在产生的时候需要提供密钥和存储密码,后续会用到] mv my-release-key.keystore android/app/ mvrelease-key.keystore android/app/ 2, 修改android/gradle.properties文件,增加如下 MYAPP_RELEASE_STORE_FILE=my-release-key.keystore MYAPP_RELEASE_KEY_ALIAS=my-key-alias MYAPP_RELEASE_STORE_PASSWORD=xx MYAPP_RELEASE_KEY_PASSWORD=xx [注意替换xx为你自己设置的密钥和存储密码] 3, 修改android/app/build.gradle文件中的签名配置: ... android {... defaultConfig {...} signingConfigs { release { storeFile file(MYAPP_RELEASE_STORE_FILE) storePassword MYAPP_RELEASE_STORE_PASSWORD keyAlias MYAPP_RELEASE_KEY_ALIAS keyPassword MYAPP_RELEASE_KEY_PASSWORD }} buildTypes { release {... signingConfig signingConfigs.release }}} 4, 然后在项目根目录执行如下: cd android/ && ./gradlew clean &&./gradlew assembleRelease清空build文件夹 ./gradlew assembleRelease 结束后会在android/app/build/outputs/apk/app-release.apk。 每次执行前,注意将该apk删除。 如果没有权限 执行==> chmod +x gradlew IOS项目导出IPA或上传到应用商店(证书配置不做详解) 1.在项目根目录下执行 react-nativebundle--entry-fileindex.ios.js--bundle-output./ios/main.jsbundle--platformios--assets-dest./ios--devfalse 将生成的assets文件夹和main.jsbundle文件拖拽到xcode项目中 2.修改AppDelegate.m文件 将jsCodeLocation = [[RCTBundleURLProvidersharedSettings]jsBundleURLForBundleRoot:@"index.ios"fallbackResource:nil]; 修改为: jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; 3.在xcode的Build Phases选项中,找到Copy Bundle Resources,将生成的assets文件夹和main.jsbundle文件添加进去 4.找到product选项 ,点击Archive 即可进行导出ipa或者上传的应用商店

优秀的个人博客,低调大师

ReactNative windows下打包生成安卓apk

create-react-native-app 运行npm run eject后根目录会产生一个andriod目录和ios目录。里面就是运行打包的配置文件。 如果你是用react-native-cli 开发RN的应该一开始就有这俩目录。 比如 android 目录里面会有build.gradle,gradle.properties 等 简单说 gradle 是一个依赖管理/自动化编译测试部署打包工具。 首先生成签名key .\keytool.exe -genkey -v -keystore D:/my-release-key.keystore -alias my-key-a lias -keyalg RSA -keysize 2048 -validity 10000 有个小坑是生成key的路径是D盘,因为在当前C盘生成的话在windows下可能会有权限问题。 image.png 然后按照这个 教程,改动一些配置文件。 修改相关配置文件 在根目录的android目录下执行 ./gradlew assembleRelease 后面就踩了很多坑,大多数版本问题。 比如java jdk从最新的9改为了8 gradle版本改为了最新的4.3 还报了一些缺少npm包的错误,直接npm install缺哪个装哪个就行了。 具体的见下面的文件改动 android/build.gradle // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { jcenter() } dependencies { /* 这里之前是 2.2.3 卡在这里半天,老是报 com.android.build.gradle.tasks.factory.AndroidJavaCompile.setDependencyCacheDir(Ljava/io/File;)V */ classpath 'com.android.tools.build:gradle:2.3.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { mavenLocal() jcenter() maven { // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm url "$rootDir/../node_modules/react-native/android" } } } android/app/build.gradle android { // 这里之前是 // compileSdkVersion 23 // buildToolsVersion "23.0.1 compileSdkVersion 25 buildToolsVersion "25.0.1" ... android\gradle\wrapper distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists # distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-4.3-all.zip 执行最后的打包命令 ./gradlew assembleRelease 切换到android目录 打包成功画面 image.png 注意事项:打包过程会占用大量内存,把WebStorm等大的程序关掉。

优秀的个人博客,低调大师

ReactNative之从HelloWorld中看环境搭建、组件封装、Props及State

开篇呢,先给大家问个好,今天是中秋节,祝大家中秋节快乐!!虽然是中秋节,但是木有回家还是总结一下知识点写写博客吧,想着昨天总结一下的,但是昨天和几个同学小聚了一下,酒逢知己总是千杯少呢,喝的微醺不适合写东西,所以就留到今天总结了。因为这段时间在工作中陆陆续续的接触到了一些RN开发的东西,还是需要总结一下的。今天只是个开篇,接下来还会有陆陆续续的关于RN开发的总结,今天主要是环境搭建、简单的组件封装、Props和State的介绍,稍后还会更新布局、动画等一些开发中常用的东西。 虽然RN没有Release版、虽然Airbnb放弃了RN、虽然Facebook正在重构RN, 但是RN还是动态化比较好的选择方案的,还是要好好的搞一下RN的,当然也是工作中需要。既然要搞,就得认真呢,这篇是关于RN的第一篇博客,后续还会有其他关于RN的博客跟进的,也好在自己的学习历程中打个Tag。今天博客比较简单,是RN入门级别的,当然进阶的东西目前还没有接触过,等深入后再展开来记录吧。 RN官方文档(https://facebook.github.io/react-native/docs/getting-started) 一、RN下的Hello World 接触一个新的东西那必须从HelloWorld开始呢,下方就一步步的从无到有搞一个RN的Hello World! 1、安装Node和VSCode 首先我们来搞一下Hello World前的准备工作,使用RN时,Node环境是必不可少的,如果你没有Node环境可以使用brew进行安装。(如果你还没安装Homebrew, 那么请Google自行安装) brewinstallnode 然后可以把node的源更新成taobao的镜像,这样访问速度会快一些。 npmconfigsetregistryhttps://registry.npm.taobao.org--globalnpmconfigsetdisturlhttps://npm.taobao.org/dist--global 装完Node后,然后就是选择安装一个开发RN的IDE了,当然你如果够强大,完全可以用记事本来编写RN的代码。当然用记事本是开玩笑的,可以用Sublime Text、Visual Studio Code等,如果比较土壕的程序员呢,你可以支持一下正版的Webstorm。当然想我这样“温饱都成问题”的程序猿,就只能用免费的VSCode了。 官方地址:https://code.visualstudio.com/ 虽然本篇博客使用的VScode,但是平时开发中用WebStorm感觉还是挺爽的。 2、安装 exp 直接在模拟器上调试,依赖于exp这个App,下方这个命令就是安装exp。安装完后,会在模拟器上看到Expo这个App, 下方我们就会用到这个Expo。 npm install exp --global 3、create-react-native-app and run app 安装完Node后,使用Node的npm把create-react-native-app这个包装一下,可以快速的创建一个RN-Project。 然后使用create-react-native-app可以创建一个RN工程了,下方创建了一个名为MyFirstRNProject的RN工程。 创建完相关的RN工程成功后会有相关的提示,我们还是按照其提示的俩,使用 yarn start 来启动工程。 启动后,会让你选择相关的运行方式,因为本篇博客是在iOS环境下做的Demo,所有就直接选择 i 即可。 选择 i 后,就会启动模拟器中的Expo。可以用 command + D 来调用和隐藏开发调试面板。然后就会看到右边红框找那个的默认的文案。 我们可以将默认的文案改一下,然后修改一下样式,添加上我们的Hello World保存即可。因为默认Live Reload是打开的,所以当相关的文件被修改后,模拟器上的工程会自动Reload加载改动后的效果,具体如下所示: 在上面的代码中我们还需注意到下方定义了一个 styles 的常量,该常量是我们需要的样式对象。在RN中可以使用 StylesSheet.create()方法来创建我们需要的样式。改样式的定义规则与Web前端中的CSS差不多,使用方式页非常的相似。下方我们还会定义其他的样式表,稍后会介绍到。 二、使用TypeScript来开发RN 因为之前使用的另一个动态化的框架是用TypeScript来开发的,想在RN中也用TypeScript来开发,当然其默认的js语言的。在RN中支持TS开发,有相关的文档(https://github.com/Microsoft/TypeScript-React-Native-Starter) 然后把工程中的App.js替换成App.tsx即可。(纯ts文件使用.ts来命名,有JSX的TS文件则使用tsx来做后缀),改完再次运行我们的Hello World即可。 三、自定义组件(Componet)、Props以及State 实现完HelloWorld后我们来看一下RN中组件封装的姿势,下方会封装一个HelloWorld的组件,然后在该组件的基础上看一下RN中Props和State的使用姿势。 1、HelloWorld组件封装 在RN中封装的组件都需要继承自 Component 类,然后在该类中正常的去添加相关布局和相关逻辑即可。下方我们将上述的HelloWorld进行了提取,创建了一个HelloWorld类,该类继承自React中的Component。然后在render()方法中通过JSX来添加需要渲染的各种组件,当然在我们的HelloWorld中,我们只用到了Text这个组件来展示文字。 封装的组件的使用姿势与RN提供组件的使用姿势是一样的,都是通过JSX的语法来引入使用的。下方 <HelloWorld /> 就是我们封装组件HelloWorld的使用姿势。 2、Props - 属性 属性,说白了就是一个组件负责接送外部参数的一个东西,类似于一个方法的参数。当然,如果你使用一个Function来定义一个组件的话,那么这个Props就是方法的参数。 在上面的HelloWorld的示例中,我们其实已经使用到了Props这个东西,只不过是系统自带的,比如上面为HelloWorld指定的 style 就是一个props, 该props传入的是一个样式对象。我们从Web前端的角度来说,属性这个东西应该是比较好理解的,div后边跟的key 和 value, 后边这个value就是相关key的属性。接下来我们将要介绍如何给自定义的组件添加特定的属性。 下方我们写了一个HelloWorld的组件,该组件继承与React中的Component,然后在render中渲染了一些组件,其中的Text是从属性Props中取的,从下方代码中看出,直接从Props中取相应的Key是可以取到的,不过强取值的话,会标红,会提示相关的熟悉在Props中不存在。稍后会解决该问题。 下方就是我们写的Hello Props组件,组件中的相关内容时通过Props中的相关key-value来传过来的。换句话说,Props就是一个传值的JSON串。 通常我们在开发中会为Props定义相关的类型,来声明Props中都有哪些东西,下方就是我们为上述的HelloWorld补的Props的类型,然后通过协议的形式指定给HelloWorld组件。从下代码我们看出,在Props类型后边还有一个null的类型,该类型是声明State的类型使用的。该处我们没有相关的状态,就暂且不指定,下方使用到的地方我们会给出相关的状态值。 添加完相关的类型声明后,之前下方标红的地方就不存在了。 3、State-状态 状态对应RN来说有着举足轻重的地位,整个RN的页面或者一个小的RN组件都可以看做是一个状态机,该状态机就是通过这个State来管理的。State中可以存放各种状态以及各种值,当这些值或者状态被修改时,那么这个组件节点就会被重新渲染,也就是更新页面或者组件。下方我们就为我们的HelloWorld添加上相关的State状态,然后通过该状态所对应的值做一些事情。 声明State类型:首先我们像声明之前的Props类型一样声明了一个HelloWorldStateType的状态类型,然后HelloWorld组件中状态类型的位置设置了该类型。改类型中有一个属性,从状态属性我们不难看出是用来控制某个空是否展示白色的。 初始State:我们指定状态类型后,该状态还需要一个初始状态,于是在构造器中对该状态进行了初始化。 定时器修改状态:然后我们用定义了一个定时器,使用定时器来定时的修改状态的值,这样便于我们观察状态修改后的变化。定时器的作用就是“隔一秒改一下时间”(下方有个错别字,就不改了) 最后就是在渲染的render方法中获取相关状态值进行使用了。该状态最终用来控制字体颜色的变化。 下方就是上述代码运行的相关效果,从下方的效果中不难看出,没个一秒文字的颜色会随着状态而修改。 今天博客就先到这儿,该做饭去了,下篇博客会总结一个RN中常用的布局方式。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册