在我们做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. Yslow 之 高性能网站建设指南(High.Performance.Web.Sites)

    一个朋友做了2年前端重构,不知道 YSLOW.我推荐给他的时候,他惊呼这工具很强大. YSLOW 只是 Yahoo 前端发布的一个评测网站前端质量的插件.它的原理是基于 Yahoo 前端工程师提出来的 ...

  2. oracle 语句优化

    1. 选用适合的ORACLE优化器         ORACLE的优化器共有3种: a. RULE (基于规则)   b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化器,可 ...

  3. MyEclipse中Web项目的发布和运行

    1.右键对应项目的名称:MyEclipse|Add and Remove Project Deployments... 2.点击Add按钮,选择Tomcat7.x,Deploy type选择Explo ...

  4. UIApplication和delegate

  5. CSS 列表 你知道吗

    CSS 列表属性允许你放置.改变列表项标志,或者将图像作为列表项标志.CSS 列表从某种意义上讲,不是描述性的文本的任何内容都可以认为是列表.人口普查.太阳系.家谱.参观菜单,甚至你的所有朋友都可以表 ...

  6. SDWebImage原理小结

    先贴上github上的地址:https://github.com/rs/SDWebImage,至于安装方式这里就不多说了,它的框架说明中都有,不过建议使用cocoaPod来安装比较好,方便日后的维护代 ...

  7. c#常用工具类:文件和二进制转换

    //================二进制相关转换类============== #region 将文件转换为二进制数组 /// <summary> /// 将文件转换为二进制数组 /// ...

  8. Codeforces 114A-Cifera(暴力)

    A. Cifera time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...

  9. 【web开发学习笔记】ibatis学习总结

    ibatis学习总结 ibatis数据库配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCT ...

  10. c的基础 1. 无符号数和补码

    计算机中储存和处理的信息是以二进制信号表示的.单个的位不是是很实用,而将这些位 组合在一起,加上某种解释,即给不同的可能位模式赋予含义,我们就行表示怎样有限集合的元素,即实现各种数据结构.计算机中使用 ...