React Native学习笔记
发布时间:2020-12-15 06:56:55 所属栏目:百科 来源:网络整理
导读:知识点: 1.// 用ListView实现类似Android中GridView的布局效果 contentContainerStyle={{flexDirection:"row",flexWrap:"wrap"}} 2.//删除数据组中的元素,index代表开始位置,1代表删除的个数。 data.splice(index,1); 3.// 返回上一级页面 this.props.nav
知识点: 1.// 用ListView实现类似Android中GridView的布局效果 contentContainerStyle={{flexDirection:"row",flexWrap:"wrap"}} 2.//删除数据组中的元素,index代表开始位置,1代表删除的个数。 data.splice(index,1); 3.// 返回上一级页面 this.props.navigation.goBack(); 4.// 跳转到DynamicS页面 this.props.navigation.navigate("DynamicS"); 5.// 从当前页面跳转到PasscodeS页面,栈中的所有页面都会销毁掉。 const resetAction = NavigationActions.reset({ index: 0, actions: [ NavigationActions.navigate({routeName: 'PasscodeS'}) ] }) this.props.navigation.dispatch(resetAction) 6.//设置值 try { AsyncStorage.setItem( key, value, (error) => { if (error) { // alert('存值失败:',error); } else { // alert('存值成功!'); } }); } catch (error) { // alert('失败' + error); } 7.取值 AsyncStorage.getItem( key, (error,result) => { console.log('取值:' + result); if (error) { } else { var data = JSON.parse(result); if (data.data != "") { data.data.managerlist[data.data.managerlist.length] = "999"; console.log('取值:2' + JSON.stringify(data.data.managerlist)); this.setState({ rooms: ds.cloneWithRows(['Living Room','Bed room', 'Dining']), familymembers: ds.cloneWithRows(data.data.managerlist), }); } else { this.setState({ rooms: ds.cloneWithRows(['Living Room', familymembers: ds.cloneWithRows(["999"]), }); } } } ); 8.Date APIs Date 对象用于处理日期和时间。其核心的方法如下列表所示: 方法 描述 Date() 返回当日的日期和时间。 getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31)。 getDay() 从 Date 对象返回一周中的某一天 (0 ~ 6)。 getMonth() 从 Date 对象返回月份 (0 ~ 11)。 getFullYear() 从 Date 对象以四位数字返回年份。 getYear() 请使用 getFullYear() 方法代替。 getHours() 返回 Date 对象的小时 (0 ~ 23)。 getMinutes() 返回 Date 对象的分钟 (0 ~ 59)。 getSeconds() 返回 Date 对象的秒数 (0 ~ 59)。 getMilliseconds() 返回 Date 对象的毫秒(0 ~ 999)。 getTime() 返回 1970 年 1 月 1 日至今的毫秒数。 getTimezoneOffset() 返回本地时间与格林威治标准时间 (GMT) 的分钟差。 getUTCDate() 根据世界时从 Date 对象返回月中的一天 (1 ~ 31)。 getUTCDay() 根据世界时从 Date 对象返回周中的一天 (0 ~ 6)。 getUTCMonth() 根据世界时从 Date 对象返回月份 (0 ~ 11)。 getUTCFullYear() 根据世界时从 Date 对象返回四位数的年份。 getUTCHours() 根据世界时返回 Date 对象的小时 (0 ~ 23)。 getUTCMinutes() 根据世界时返回 Date 对象的分钟 (0 ~ 59)。 getUTCSeconds() 根据世界时返回 Date 对象的秒钟 (0 ~ 59)。 getUTCMilliseconds() 根据世界时返回 Date 对象的毫秒(0 ~ 999)。 parse() 返回1970年1月1日午夜到指定日期(字符串)的毫秒数。 setDate() 设置 Date 对象中月的某一天 (1 ~ 31)。 setMonth() 设置 Date 对象中月份 (0 ~ 11)。 setFullYear() 设置 Date 对象中的年份(四位数字)。 setYear() 请使用 setFullYear() 方法代替。 setHours() 设置 Date 对象中的小时 (0 ~ 23)。 setMinutes() 设置 Date 对象中的分钟 (0 ~ 59)。 setSeconds() 设置 Date 对象中的秒钟 (0 ~ 59)。 setMilliseconds() 设置 Date 对象中的毫秒 (0 ~ 999)。 setTime() 以毫秒设置 Date 对象。 setUTCDate() 根据世界时设置 Date 对象中月份的一天 (1 ~ 31)。 setUTCMonth() 根据世界时设置 Date 对象中的月份 (0 ~ 11)。 setUTCFullYear() 根据世界时设置 Date 对象中的年份(四位数字)。 setUTCHours() 根据世界时设置 Date 对象中的小时 (0 ~ 23)。 setUTCMinutes() 根据世界时设置 Date 对象中的分钟 (0 ~ 59)。 setUTCSeconds() 根据世界时设置 Date 对象中的秒钟 (0 ~ 59)。 setUTCMilliseconds() 根据世界时设置 Date 对象中的毫秒 (0 ~ 999)。 toSource() 返回该对象的源代码。 toString() 把 Date 对象转换为字符串。 toTimeString() 把 Date 对象的时间部分转换为字符串。 toDateString() 把 Date 对象的日期部分转换为字符串。 toGMTString() 请使用 toUTCString() 方法代替。 toUTCString() 根据世界时,把 Date 对象转换为字符串。 toLocaleString() 根据本地时间格式,把 Date 对象转换为字符串。 toLocaleTimeString() 根据本地时间格式,把 Date 对象的时间部分转换为字符串。 toLocaleDateString() 根据本地时间格式,把 Date 对象的日期部分转换为字符串。 UTC() 根据世界时返回 1970 年 1 月 1 日 到指定日期的毫秒数。 valueOf() 返回 Date 对象的原始值。 9.js中对小数保留两位小数,number.toFixed(2) 这个方法是四舍五入的; js中取整,parseInt(number); js中四舍五入取整,Math.round(number); js中向上取整,Math.ceil(number); js中向下取整,Math.floor(number); 10.代理服务器:Chrome->高级设置->【网络--更改代理服务器设置】->【连接--局域网设置】->里面 有一个复选框, 选中的话可以使用代理;不选中是不使用代理。 11.Web服务器端编程语言有ASP,ASP.NET,JSP,PHP,Python等等; App服务器端编程语言有C/C++,C#,Java,Python等等。 12.JS->Android原生模块->startActivity。 用到了EventBus框架( EventBus.getDefault().register(this); EventBus.getDefault().unregister(this); EventBus.getDefault().post(new MessageEvent()); @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) {/* Do something */}; )主要是方便。 (1)首先创建一个原生模块,一个原生模块是一个继承了ReactContextBaseJavaModule的Java类, 并且实现getName方法, 这个函数用于返回一个字符串名字,这个名字在JavaScript端标记这个模块。 public class GoToActivity extends ReactContextBaseJavaModule { private static final String DURATION_SHORT_KEY = "SHORT"; private static final String DURATION_LONG_KEY = "LONG"; public GoToActivity(ReactApplicationContext reactContext) { super(reactContext); } /** * getName方法。这个函数用于返回一个字符串名字,就是js中的模块名 */ @Override public String getName() { return "GoToActivity"; } /** * 返回了需要导出给JavaScript使用的常量 */ @Override public Map<String,Object> getConstants() { final Map<String,Object> constants = new HashMap<>(); constants.put(DURATION_SHORT_KEY,Toast.LENGTH_SHORT); constants.put(DURATION_LONG_KEY,Toast.LENGTH_LONG); return constants; } /** * 导出给js使用的方法,需要使用注解@ReactMethod。方法的返回类型必须为void */ @ReactMethod public void show(String message,int duration) { Toast.makeText(getReactApplicationContext(),message,duration).show(); EventBus.getDefault().post(message); } } (2)在Java这边要做的最后一件事就是注册这个模块。我们需要在应用的Package类的 createNativeModules方法中添加这个模块。 如果模块没有被注册,它也无法在JavaScript中被访问到。public class MyReactPackage implements ReactPackage { @Override public List<NativeModule> createNativeModules( ReactApplicationContext reactContext) { List<NativeModule> modules = new ArrayList<>(); modules.add(new GoToActivity(reactContext)); modules.add(new ImagePickerModule(reactContext)); return modules; } @Override public List<Class<? extends JavaScriptModule>> createJSModules() { // TODO Auto-generated method stub return Collections.emptyList(); } @Override public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { // TODO Auto-generated method stub return Collections.emptyList(); } }这个package需要在MainApplication.java文件的getPackages方法中提供。这个文件位于你的 react-native应用文件夹的android目录中。 具体路径是: android/app/src/main/java/com/your-app-name/MainApplication.java. @Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(), new MyReactPackage() // 添加这个包 ); } (3)在ReactNative项目中调用 (为了让你的功能从JavaScript端访问起来更为方便,通常我们都会把 原生模块封装成一个JavaScript模块。 这不是必须的,但省下了每次都从NativeModules中获取对应模块的步骤。这个JS文件也可以用于添加 一些其他JavaScript端实现的功能。 //定义一个GoToActivity.js文件 'use strict'; import { NativeModules } from 'react-native'; export default NativeModules.GoToActivity;)。 //然后就可以直接调用GoToActivity这个自己写的模块里的方法了。 GoToActivity.show('调用系统的Toast',ToastAndroid.SHORT); 13.Android原生UI组件: 提供原生视图很简单: 创建一个ViewManager的子类。 实现createViewInstance方法。 导出视图的属性设置器:使用@ReactProp(或@ReactPropGroup)注解。 把这个视图管理类注册到应用程序包的createViewManagers里。 实现JavaScript模块。 14.腾讯云直播SDK: SDK相关的库(jar/so)放在app/src/main/jniLibs目录下,jniLibs目录为android studio默认的 so加载目录, 推荐在集成SDK时按照demo的做法,将so和jar拷贝入您的工程的src/main/jniLibs目录下。 15.示例代码(Android),如何处理进度通知, 下面这段代码用来展示如何处理 RTMP SDK 点播播放器的播放进度通知: public class MyTestActivity implements ITXLivePlayListener{ @Override public void onPlayEvent(int event,Bundle param) { // RTMP SDK Demo 的源码中,视频画面卡住时,会在其上绘制一个半透明的loading动画。 // 这里的 stopLoadingAnimation 是将loading动画停止掉。 if (event == TXLiveConstants.PLAY_EVT_PLAY_BEGIN) { stopLoadingAnimation(); } // 如下这段代码是处理播放进度 else if (event == TXLiveConstants.PLAY_EVT_PLAY_PROGRESS) { int progress = param.getInt(TXLiveConstants.EVT_PLAY_PROGRESS); //进度(秒数) int duration = param.getInt(TXLiveConstants.EVT_PLAY_DURATION); //时间(秒数) // UI进度进行相应的调整 mSeekBar.setProgress(progress); mTextStart.setText(String.format("%2d:%2d",progress/60,progress%60)); mTextDuration.setText(String.format("%2d:%2d",duration/60,duration%60)); mSeekBar.setMax(duration); return; } // 如下这段代码是处理播放结束的事件 else if (event == TXLiveConstants.PLAY_ERR_NET_DISCONNECT || event == TXLiveConstants.PLAY_EVT_PLAY_END) { stopPlayRtmp(); mVideoPlay = false; } } mLivePlayer.setPlayListener(this); 16.React Native -- ActivityIndicator (Displays a circular loading indicator.) 17.React Native -- DrawerLayoutAndroid (抽屉布局,仅Android端使用) 18.React Native 常用命令: react-native init 项目名称 //创建项目 react-native run-android //安装创建的项目,在Android平台上,对第一次运行。 react-native start //启动项目,对已经安装好的项目。 npm install --save react-navigation //安装React Navigation 19.React Native真机调试,打开菜单-->Dev Settings-->Debug server host & port for device -->输入电脑的ip地址加端口号8081,例如:192.168.7.67:8081 20.React Native 网络请求://当前时间 var nowTime = (new Date()).valueOf(); var DoorlockHistory = { "uid": myglobal.uid, "devicesid": myglobal.devicesid, "querytime": { time: nowTime + "", queryName: "DoorlockHistory", }, }; NativeModules.QueryInternetModule.NativeMethod(JSON.stringify(DoorlockHistory), myglobal.channel); 21.React Navigation -- StackNavigator: API Definition--StackNavigator(RouteConfigs,StackNavigatorConfig); RouteConfigs--StackNavigator({ // For each screen that you can navigate to,create a new entry like this: Profile: { // `ProfileScreen` is a React component that will be the main content of the screen. screen: ProfileScreen, // When `ProfileScreen` is loaded by the StackNavigator,it will be given a `navigation` prop. // Optional: When deep linking or using react-navigation in a web app,this path is used: path: 'people/:username', // The action and route params are extracted from the path. // Optional: Override the `navigationOptions` for the screen navigationOptions: ({navigation}) => ({ title: `${navigation.state.params.username}'s Profile'`, }), }, ...MyOtherRoutes, }); StackNavigatorConfig-- initialRouteName:默认路由,就是第一个要显示的页面。 initialRouteParams; navigationOptions:对所有的screen的默认配置。 paths:对所有路由的path属性的默认配置。 mode:定义渲染风格,enum(card(IOS、Android都可以)、modal(仅IOS))。 headerMode:enum(float、screen、none)。 cardStyle:Use this prop to override or extend the default style for an individual card in stack. transitionConfig:Function to return an object that overrides default screen transitions. onTransitionStart:Function to be invoked when the card transition animation is about to start. onTransitionEnd:Function to be invoked once the card transition animation completes. Screen Navigation Options: title: Generic title that can be used as a fallback for headerTitle and tabBarLabel。 headerRight:React Element to display on the right side of the header。 header headerTitle headerBackTitle:Title string used by the back button on iOS or null to disable label. Defaults to scene title。 headerTruncatedBackTitle headerLeft headerStyle headerTitleStyle headerBackTitleStyle headerTintColor headerPressColorAndroid:Color for material ripple (Android >= 5.0 only) gesturesEnabled Navigator Props: const SomeStack = StackNavigator({ // config }); <SomeStack screenProps={/* this prop will get passed to the screen components asthis.props.screenProps */} /> 22.ReactNavigation: NavigationActions中的back方法的用法,举例:栈中有A/B/C/D四个页面,栈顶是D,从D直接跳转到A, 那么需要在B加载的时候就记下B的key,通过this.props.navigation.state.key得到,记录在一个全局变量中,然后this.props.navigation.dispatch(NavigationActions.back({key: '记录在全局变量中的那个key'})); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |