在我们做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. 解决jquery animate({scrollTop$pos},500)与$(window).scroll方法冲突的问题

    当点击节点时 先移除$(window).on("scroll")监听事件 在animate动画结束之后再添加上 $('#J_tab li').on('click', functio ...

  2. spring boot项目配置文件集合

    表 1. Spring Boot 推荐的基础 POM 文件 名称 说明 spring-boot-starter 核心 POM,包含自动配置支持.日志库和对 YAML 配置文件的支持. spring-b ...

  3. [转载]大道至简!!!从SAP HANA作为SAP加速器的方式,看ERP on HANA的春天

    I AM A ABAPER! 科技的进步,一定会使一些东西变得越来越精简! 大道至简!!! 文章很好!!!!!!!!!!! -------------------------------------- ...

  4. android80 HttpClient框架提交数据 get方式

    package com.itheima.httpclient; import java.io.IOException; import java.io.InputStream; import java. ...

  5. iOS 如何做才安全--逆向工程 - Reveal、IDA、Hopper、https抓包 等

    http://www.cnblogs.com/dahe007/p/5546990.html

  6. MVVM架构的一次实践,重写iOS头条客户端

    前言: 一个iOS头条APP,使用MVVM架构实现,代码中有注释,封装了AFN网络请求,解媾代码,使用起来非常方便.用最经典的TableView展示,后续不断更新,喜欢就star或fork一下,有问题 ...

  7. 使用内省方式操作JavaBean

    内省,英文中称作introspector.主要对javaBean进行操作,JavaBean是一个特殊的Java类,该类中方法名符合特定的规则(其实就是getXXX,setXXX),我们一般是利用get ...

  8. mac 下 php 安装 中的坑

    brew Error: Formulae found in multiple taps http://www.trylife.cn/brew-error-formulae-found-in-multi ...

  9. 【原】个人对win7开机黑屏只有鼠标排障总结

    个人对win7开机黑屏只有鼠标排障总结 文:铁乐猫 第一种情况是explorer.exe进程丢失或损坏有关: 判断方法是按Ctrl+Alt+Del键能呼出任务管理器,结束explorer.exe进程, ...

  10. Linux删除文件Argument list too long问题的解决方案

    方法一:使用find find . -name 文件 | xargs rm -f 但文件数量过多,find命令也会出现问题: -bash: /bin/find: Argument list too l ...