《React-Native系列》38、 ReactNative混合组件封装
在我们做ReactNative项目的过程中,我们会发现由ReactNative提供给我们的组件或API往往满足不了我们的需求,常常需要我们自己去封装Native组件。
今天我们介绍下如果封装一个简单的ReactNative组件,Native代码采用Android。
需求:实现一个组件、实现类似Android的Toast功能。
1、创建一个RN project
[javascript] view plain copy 在CODE上查看代码片派生到我的代码片
react-native init HybridDemo
如下:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
$ react-native init HybridDemo
This will walk you through creating a new React Native project in /Users/birenjie/RN/projects/HybridDemo
Installing react-native package from npm...
Setting up new React Native app in /Users/www.lxinyul.cc birenjie/RN/projects/HybridDemo
HybridDemo@0.0.1 /Users/birenjie/RN/projects/HybridDemo
└── react@15.3.2
To run your app on iOS:
cd /Users/birenjie/RN/projects/HybridDemo
react-native run-ios
- or -
Open /Users/birenjie/RN/projects/HybridDemo/ios/HybridDemo.xcodeproj in Xcode
Hit the Run button
To run your app on Android:
Have an Android emulator running (quickest way to get started), or a device connected
cd /Users/birenjie/RN/projects/HybridDemo
react-native run-android
2、使用Android Studio打开新建的项目HybridDemo,新建一个空Library
如何新建一个Android的空Library,参考:Android Studio中为项目新建及添加Library
在这里我新建了一个Libray : rn-toast-android
3、修改rn-toast-android下的build.gradle, 在dependencies中添加compile 'com.facebook.React:react-native:0.20.+'
如下:
4、在Library中新建AndroidToastModule.Java和AndroidToastPackage.java
AndroidToastModule.java代码如下:
[java] view plain copy 在CODE上查看代码片派生到我的代码片
package com.example.rn_toast_android;
import android.widget.Toast;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.common.MapBuilder;
import java.util.Map;
/**
* Created by birenjie on 16/10/11.
*/
public class AndroidToastModule extends ReactContextBaseJavaModule {
private static final String DURATION_SHORT_KEY = "SHORT";
private static final String DURATION_LONG_KEY = "LONG";
public AndroidToastModule(www.hsl85.cn/ ReactApplicationContext reactContext) {
super(reactContext);
}
@Override
public String getName() {
return "ToastForAndroid";
}
@Override
public Map<String, Object> getConstants() {
final Map<String, Object> constants = MapBuilder.newHashMap();
constants.put(DURATION_SHORT_KEY, Toast.LENGTH_SHORT);
constants.put(DURATION_LONG_KEY, Toast.LENGTH_LONG);
return constants;
}
@ReactMethod
public void show(String message, int duration) {
Toast.makeText(getReactApplicationContext(), message, duration).show();
}
}
AndroidToastPackage.java代码如下:
[java] view plain copy 在CODE上查看代码片派生到我的代码片
package com.example.rn_toast_android;
import com.example.rn_toast_android.AndroidToastModule;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.JavaScriptModule;
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;
/**
* Created by birenjie on 16/10/11.
*/
public class AndroidToastPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
return Arrays.<NativeModule>asList(new AndroidToastModule(reactContext));
}
//一般情况createJSModules()的返回值都是空集合。
@Override
public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
//如果是BaseViewManager或其子类,那么createViewwww.zhenlyule.cn/ Managers()中返回的就是加入了BaseViewManager的集合
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
5、生成package.json
在....android/rn-toast-android/目录下 执行npm init
会出现一系列的提示,按照提示完成,最后可以生成package.json 文件
6、测试我们编写的组件
在我们init的项目的根目录(index.android.js)同级目录,新建ToastForAndroid.js
ToastForAndroid.js源码如下:
[javascript] view plain copy 在CODE上查看代码片派生到我的代码片
'use strict';
import React, { Component } from 'react';
import {
NativeModules,
} from 'react-native';
const {ToastForAndroid} = NativeModules;
var ToastForAndroidDemo = {
SHORT: ToastForAndroid.SHORT,
LONG: ToastForAndroid.LONG,
show: function (
message: string,
duration: number
): void {
ToastForAndroid.show(message, www.ycyc66.cn/ duration);
},
};
module.exports = ToastForAndroidDemo;
修改index.android.js,如下:
[javascript] view plain copy 在CODE上查看代码片派生到我的代码片
/**
* Sample React Native App
* https://github.com/facebook/react-native
* @flow
*/
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
Dimensions,
TouchableHighlight,
} from 'react-native';
import ToastForAndroid from './ToastForAndroid';
var deviceWidth = Dimensions.get('window').width;
var deviceHeight = www.zhenloyl88.cn Dimensions.get('window').height;
class HybridDemo extends Component {
render() {
return (
<TouchableHighlight onPress= {()=>ToastForAndroid.show('I am clicked ', ToastForAndroid.LONG)}>
<Text style={{width:deviceWidth,height:50,backgroundColor:'red',textAlign:'center',textAlignVertical:'center'}}>点击调用Native方法</Text>
</TouchableHighlight>
);
}
}
AppRegistry.registerComponent('HybridDemo', () => HybridDemo);
我们需要修改的MainApplication.java,将AndroidToastPackage加入到ReactPackage
[java] view plain copy 在CODE上查看代码片派生到我的代码片
@Override
protected List<ReactPackage> www.wx1677.com/ getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),new AndroidToastPackage()
);
}
好,一切准备就绪,我们启动React packager Server。
运行效果如下:
至此,我们自己封装的Android Toast组件就完成了。
如果我们有npm的镜像服务器,我们还可以把我们的组件发布上去。
在..../android/rn-toast-androi www.yghrcp88.cn d/ 目录下执行
$ npm adduser //增加npm用户
$ npm publish //上传组件到npm上
这样我们就可以像使用第三方组件一样,使用自己发布的ReactNative混合组件了。
《React-Native系列》38、 ReactNative混合组件封装的更多相关文章
- React Native 系列(九) -- Tab标签组件
前言 本系列是基于React Native版本号0.44.3写的.很多的App都使用了Tab标签组件,例如QQ,微信等等,就是切换不同的选项,显示不同的内容.那么这篇文章将介绍RN中的Tab标签组件. ...
- 【REACT NATIVE 系列教程之十二】REACT NATIVE(JS/ES)与IOS(OBJECT-C)交互通信
http://blog.csdn.net/xiaominghimi/article/details/51586492 一用到跨平台的引擎必然要有引擎与各平台原生进行交互通信的需要.那么Himi先讲解R ...
- React Native之本地文件系统访问组件react-native-fs的介绍与使用
React Native之本地文件系统访问组件react-native-fs的介绍与使用 一,需求分析 1,需要将图片保存到本地相册: 2,需要创建文件,并对其进行读写 删除操作. 二,简单介绍 re ...
- React Native 系列(五) -- 组件间传值
前言 本系列是基于React Native版本号0.44.3写的.任何一款 App 都有界面之间数据传递的这个步骤的,那么在RN中,组件间是怎么传值的呢?这篇文章将介绍到顺传.逆传已经通过通知传值. ...
- React Native系列(6) - 编译安卓私有React-Native代码
为何要自己编译React Native安卓私有代码 我们在开发中遇到一个HTTP2的问题,React Native安卓客户端在和HTTP2支持的服务器通讯的过程中会有crash,见 React-Nat ...
- React Native 系列(二) -- React入门知识
前言 本系列是基于React Native版本号0.44.3写的,最初学习React Native的时候,完全没有接触过React和JS,本文的目的是为了给那些JS和React小白提供一个快速入门,让 ...
- React Native 系列(二)
前言 本系列是基于React Native版本号0.44.3写的,最初学习React Native的时候,完全没有接触过React和JS,本文的目的是为了给那些JS和React小白提供一个快速入门,让 ...
- React Native 系列(八) -- 导航
前言 本系列是基于React Native版本号0.44.3写的.我们都知道,一个App不可能只有一个不变的界面,而是通过多个界面间的跳转来呈现不同的内容.那么这篇文章将介绍RN中的导航. 导航 什么 ...
- React Native 系列(三) -- 项目结构介绍
前言 本系列是基于React Native版本号0.44.3写的,相信大家看了本系列前面两篇文章之后,对于React Native的代码应该能看懂一点点了吧.本篇文章将带着大家来认识一下React N ...
随机推荐
- Redis 和 Memcached 的区别详解
Redis的作者Salvatore Sanfilippo曾经对这两种基于内存的数据存储系统进行过比较: Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并支 ...
- tomcat多域名配置
1.找到你的tomcat然后在conf文件中找到server.xml打开: <Server port="8005" shutdown="SHUTDOWN" ...
- Cocos2d-x 3.1.1 学习日志4--cocos2d-x解决中文乱码问题的几种办法
做个打飞机的游戏,由于版本号太新,网上基本没有教教程,我的版本号是cocos2d-x 3.1.1的.今天遇到cocos2dx中中文乱码的问题.无奈仅仅好Google百度寻求答案,明确了这个问题的缘由. ...
- extern用法总结!
extern 在源文件A里定义的函数,在其他源文件中是看不见的(即不能訪问).为了在源文件B里能调用这个函数,应该在B的头部加上一个外部声明: extern 函数原型: 这样,在源文件B里也能够调 ...
- [D3] 7. Quantitative Scales
# Quantitative Scales var colorScale = d3.scale.quantile() .domain([d3.max(dataset) / 4, d3.max(data ...
- java笔试题13-11-21
中xxx科技公司java笔试题 今天去参加一个公司的面试,去先做了一份笔试题,妈的,太他妈难了(对于我来说,最后做完一个员工说你是不是投错简历了,都是空白,我说我做的大部分都对了..最后面试都没有,就 ...
- 【NodeJs】使用TCP套接字收发数据的简单实例
因为TCP协议是流协议,在收发数据的时候会有粘包的问题.本例使用自定义的SPtcp封包协议对TCP数据再进行一次封装,解决了粘包问题. 注:其性能仍有待优化.优化方向:使用TCP自带的接收窗口缓存. ...
- Anroid搭建一个局域网Web服务器
前言 很多开发者看到这个标题表示很怪异,Android怎么可能搭建服务器呢?根本用不到呀,这个项目毫无价值.我表示很理解这一类的开发者,毕竟每个人的经验经历都是有限的. 必须要说说我们的用处(需要 ...
- Android(java)学习笔记190:Eclipse中的控制台不停报错Can't bind to local 8700 for debugger
[DDMS] Can't bind to local 8600 for debugger 改成 Under Window -> Preferences -> Android -> D ...
- PHP5常量
用函数 define()设置常量 define函数有3个参数 1.必选,常量的名称,标识符 2.必选,常量的值 3.可选,默认不设置,常量名称大小写敏感.如果设置true,常量名称不区分大小写! 下面 ...