在我们做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混合组件封装的更多相关文章

  1. React Native 系列(九) -- Tab标签组件

    前言 本系列是基于React Native版本号0.44.3写的.很多的App都使用了Tab标签组件,例如QQ,微信等等,就是切换不同的选项,显示不同的内容.那么这篇文章将介绍RN中的Tab标签组件. ...

  2. 【REACT NATIVE 系列教程之十二】REACT NATIVE(JS/ES)与IOS(OBJECT-C)交互通信

    http://blog.csdn.net/xiaominghimi/article/details/51586492 一用到跨平台的引擎必然要有引擎与各平台原生进行交互通信的需要.那么Himi先讲解R ...

  3. React Native之本地文件系统访问组件react-native-fs的介绍与使用

    React Native之本地文件系统访问组件react-native-fs的介绍与使用 一,需求分析 1,需要将图片保存到本地相册: 2,需要创建文件,并对其进行读写 删除操作. 二,简单介绍 re ...

  4. React Native 系列(五) -- 组件间传值

    前言 本系列是基于React Native版本号0.44.3写的.任何一款 App 都有界面之间数据传递的这个步骤的,那么在RN中,组件间是怎么传值的呢?这篇文章将介绍到顺传.逆传已经通过通知传值. ...

  5. React Native系列(6) - 编译安卓私有React-Native代码

    为何要自己编译React Native安卓私有代码 我们在开发中遇到一个HTTP2的问题,React Native安卓客户端在和HTTP2支持的服务器通讯的过程中会有crash,见 React-Nat ...

  6. React Native 系列(二) -- React入门知识

    前言 本系列是基于React Native版本号0.44.3写的,最初学习React Native的时候,完全没有接触过React和JS,本文的目的是为了给那些JS和React小白提供一个快速入门,让 ...

  7. React Native 系列(二)

    前言 本系列是基于React Native版本号0.44.3写的,最初学习React Native的时候,完全没有接触过React和JS,本文的目的是为了给那些JS和React小白提供一个快速入门,让 ...

  8. React Native 系列(八) -- 导航

    前言 本系列是基于React Native版本号0.44.3写的.我们都知道,一个App不可能只有一个不变的界面,而是通过多个界面间的跳转来呈现不同的内容.那么这篇文章将介绍RN中的导航. 导航 什么 ...

  9. React Native 系列(三) -- 项目结构介绍

    前言 本系列是基于React Native版本号0.44.3写的,相信大家看了本系列前面两篇文章之后,对于React Native的代码应该能看懂一点点了吧.本篇文章将带着大家来认识一下React N ...

随机推荐

  1. 【转】【opencv】仿射变换

    仿射变换 目标 在这个教程中你将学习到如何: 使用OpenCV函数 warpAffine 来实现一些简单的重映射. 使用OpenCV函数 getRotationMatrix2D 来获得一个  旋转矩阵 ...

  2. Android——C语言、JNI与低层调用

    JNI java native interface c的基本数据类型 int:32位,能表示的数字是2的32次方个 最高位用来表示符号位,那么还剩下31位可以表示数值,所以能表示的数字就是2的31次方 ...

  3. js 日期插件 datepicker

    点击图片出现  时间 ,增加一个点击事件 <label for="" class="width80">创建日:</label> < ...

  4. ASP.NET- 播放视频代码

    在网上找的,还不错,支持很多格式.只需要在页面放个lable,建一个放视频文件的文件夹movie,加入代码: protected void Page_Load(object sender, Event ...

  5. hadoop2.2.0集群安装

    位说明. 位).Jdk使用的1.7(1.6也可以).网络配置好,相互可以ping通,java环境安装完毕.   第一部分 Hadoop 2.2 下载 位). 下载地址:http://apache.cl ...

  6. SpringMVC项目接入Springfox实战遇到的问题集合

    为了方便的管理项目中API接口,目前总是会写好接口后,然后又要去维护一个文档,这对于开发者来说太心累了, 在网上找了好多关于API接口管理和生成文档的资料,一次偶然跟51的大神交流发现了Swagger ...

  7. C# 可访问一致性不一致

    出现原因,其中一个是返回参数的访问级别小于函数的访问级别, 也就是说当定义一个返回参数的方法的时候,如果返回参数的访问级别低于方法的访问级别就会出现这样的错误,这个是可以理解的,如果返回的参数不能被访 ...

  8. ARCproject中加入非ARC文件,或者非ARC环境中加入ARC文件

    ARC与非ARC在一个项目中同一时候使用, 选择项目中的Targets,选中你所要操作的Target,选Build Phases,在当中Complie Sources中选择须要ARC的文件双击,并在输 ...

  9. lambda与函数调用的转换

    14.38 编写一个类令其检查某个给定的string对象的长度是否与一个阈值相等.使用该对象编写程序,统计并报告在输入的文件中长度为1的单词有多少个,长度为2的单词有多少个.......长度为10的单 ...

  10. Oracle11g新特性导致空表不能导出问题

        ORACLE 11G在用EXP导出时,发现空表(没有数据或者没有用过的表)不能导出了.     查了一下资料,说是Oracle 11G中有个新特性,当表无数据时,不分配segment,以节省空 ...