ReactNative如何在JS中引用原生自定义控件(rn变化太快,网上很多教程有坑,这个我研究后可用,特意分享)

直接写一个Demo例子,有相关功底的肯定明白,会对特别的地方进行提醒,本文基于https://blog.csdn.net/lintcgirl/article/details/53489490,但是按此链接文章不可用。

首先是JAVA部分:

 1 import com.facebook.react.ReactActivity;
 2
 3 public class MainActivity extends ReactActivity {
 4
 5     /**
 6      * Returns the name of the main component registered from JavaScript.
 7      * This is used to schedule rendering of the component.
 8      */
 9     @Override
10     protected String getMainComponentName() {
11         return "RNMyTest";
12     }
13 }
 1 import android.app.Application;
 2
 3 import com.facebook.react.ReactApplication;
 4 import com.facebook.react.ReactNativeHost;
 5 import com.facebook.react.ReactPackage;
 6 import com.facebook.react.shell.MainReactPackage;
 7 import com.facebook.soloader.SoLoader;
 8 import com.rnmytest.view.AppReactPackage;
 9
10 import java.util.Arrays;
11 import java.util.List;
12
13 public class MainApplication extends Application implements ReactApplication {
14
15   private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
16     @Override
17     public boolean getUseDeveloperSupport() {
18       return BuildConfig.DEBUG;
19     }
20
21     @Override
22     protected List<ReactPackage> getPackages() {
23       return Arrays.<ReactPackage>asList(
24           new MainReactPackage(),
25               new AppReactPackage()
26       );
27     }
28
29     @Override
30     protected String getJSMainModuleName() {
31       return "index";
32     }
33   };
34
35   @Override
36   public ReactNativeHost getReactNativeHost() {
37     return mReactNativeHost;
38   }
39
40   @Override
41   public void onCreate() {
42     super.onCreate();
43     SoLoader.init(this, /* native exopackage */ false);
44   }
45 }

第一坑,之前的项目可能创建时间太久,ReactApplication完全无法引用,后面我是重新新建一个demo测试后能成功导入,各种百度google无法解决这个方案,如有能解决的朋友请告诉我。

下面是自定义的view

 1 import com.facebook.react.ReactPackage;
 2 import com.facebook.react.bridge.NativeModule;
 3 import com.facebook.react.bridge.ReactApplicationContext;
 4 import com.facebook.react.uimanager.ViewManager;
 5 import java.util.Arrays;
 6 import java.util.Collections;
 7 import java.util.List;
 8
 9 /**
10  * Created by bingmingli on 2018/6/8.
11  */
12
13 public class AppReactPackage implements ReactPackage {
14
15     @Override
16     public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
17         return Collections.emptyList();
18     }
19
20 //    @Override
21 //    public List<Class<? extends JavaScriptModule>> createJSModules() {
22 //        return Collections.emptyList();
23 //    }
24
25     @Override
26     public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
27         return Arrays.<ViewManager>asList(
28                 new CircleManager()
29         );
30     }
31 }

第二坑:注释部分的方法在新版本已经去除了

 1 import android.content.Context;
 2 import android.graphics.Canvas;
 3 import android.graphics.Paint;
 4 import android.util.Log;
 5 import android.view.View;
 6
 7 import com.facebook.react.uimanager.PixelUtil;
 8
 9 public class CircleView extends View {
10     private final String TAG = "CircleView";
11     private Paint mPaint; // 画笔
12     private float mRadius;  // 圆的半径
13
14     public CircleView(Context context) {
15         super(context);
16         mPaint = new Paint();
17         mPaint.setColor(0xAA000000);
18     }
19
20     /**
21      * 设置圆的半径
22      * @param radius
23      */
24     public void setRadius(Integer radius) {
25         /**
26          * 由于JS传过的数字是dip单位,需要转换为实际像素
27          * 使用com.facebook.react.uimanager包中的PixelUtil,进行转换
28          */
29         mRadius = PixelUtil.toPixelFromDIP(radius);
30         invalidate();
31     }
32
33     @Override
34     protected void onDraw(Canvas canvas) {
35         super.onDraw(canvas);
36         canvas.drawCircle(mRadius, mRadius, mRadius, mPaint); // 画一个半径为100px的圆
37         Log.d(TAG, "绘图");
38     }
39 }
 1 import com.facebook.react.uimanager.SimpleViewManager;
 2 import com.facebook.react.uimanager.ThemedReactContext;
 3 import com.facebook.react.uimanager.annotations.ReactProp;
 4
 5 /**
 6  * Created by bingmingli on 2018/6/8.
 7  */
 8
 9 public class CircleManager extends SimpleViewManager<CircleView> {
10
11     /**
12      * 设置js引用名
13      */
14     @Override
15     public String getName() {
16         return "MCircle";
17     }
18
19     /**
20      * 创建UI组件实例
21      */
22     @Override
23     protected CircleView createViewInstance(ThemedReactContext reactContext) {
24         return new CircleView(reactContext);
25     }
26
27     /**
28      * 传输半径参数
29      */
30     @ReactProp(name = "radius")
31     public void setRadius(CircleView view, Integer radius) {
32         view.setRadius(radius);
33     }
34 }

下面是JS部分:

circle.js

 1 import React, { Component } from ‘react‘;
 2 import {
 3   View,
 4   requireNativeComponent
 5 } from ‘react-native‘;
 6
 7 import PropTypes from ‘prop-types‘
 8 // const RCTCircle = requireNativeComponent(‘MCircle‘, {
 9 //   propTypes: {
10 //     radius: PropTypes.number,
11 //     ...View.propTypes // 包含默认的View的属性
12 //   },
13 // });
14 // module.exports=RCTCircle;
15
16 var iface = {
17   name: ‘MCircle‘,
18   propTypes: {
19     radius: PropTypes.number,
20     ...View.propTypes
21   },
22 };
23
24 module.exports = requireNativeComponent(‘MCircle‘, iface);

第三坑:PropTypes的导入方式为import PropTypes from ‘prop-types‘
第四坑:...View.propTypes这个必须有,不然自己的属性不能识别
第五坑:iface里面的name 与 requireNativeComponent的第一个参数需要一致,很多教程这里不一致,导致找不到这个原生view

App.js

 1 import React, { Component } from ‘react‘;
 2 import {
 3   Platform,
 4   StyleSheet,
 5   Text,
 6   View
 7 } from ‘react-native‘;
 8
 9 import MCircle from ‘./circle‘;
10
11 const instructions = Platform.select({
12   ios: ‘Press Cmd+R to reload,\n‘ +
13     ‘Cmd+D or shake for dev menu‘,
14   android: ‘Double tap R on your keyboard to reload,\n‘ +
15     ‘Shake or press menu button for dev menu‘,
16 });
17
18 export default class App extends Component<Props> {
19   render() {
20     return (
21                 <View>
22                     <MCircle
23                           style={{width: 100, height: 100}}
24                           radius={50}
25                     />
26                 </View>
27             );
28   }
29 }
30
31 const styles = StyleSheet.create({
32   container: {
33     flex: 1,
34     justifyContent: ‘center‘,
35     alignItems: ‘center‘,
36     backgroundColor: ‘#F5FCFF‘,
37   },
38   welcome: {
39     fontSize: 20,
40     textAlign: ‘center‘,
41     margin: 10,
42   },
43   instructions: {
44     textAlign: ‘center‘,
45     color: ‘#333333‘,
46     marginBottom: 5,
47   },
48 });

提醒:导入的view必须名字也一致,这不用多说了

原文地址:https://www.cnblogs.com/lee0oo0/p/9157021.html

时间: 2024-10-09 01:04:24

ReactNative如何在JS中引用原生自定义控件(rn变化太快,网上很多教程有坑,这个我研究后可用,特意分享)的相关文章

如何在js里引用php变量

如何在js里面引用php的变量 php代码------------------------------------------- js代码------------------------------------------- cheche1984 | 浏览 16259 次  2013-01-15 17:04 2013-01-17 17:47 最佳答案 在js中可以使用<?php ?>来输出你需要引用的变量.例如在你的第一个红色区域替换为 <?php echo $a; ?>在你的第二

如何在JS中应用正则表达式

背景:在之前的随笔中写过C#中如何使用正则表达式,这篇随笔主要讲如何在js中应用正则表达式 如下代码: 1 $("#zhengze").click(function () { 2 var tmp = "我是中国人" + '\n' + "我来自beijing"; 3 //var pattern = /[\n]/; 4 //tmp = tmp.replace(pattern, " "); 5 alert(tmp); 6 }); 当

js中的原生Ajax和JQuery中的Ajax

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). js中的Ajax: 参数介绍: open(String method,String url,boolean asynch);        准备请求:             url:            get/post            true/false:            true:异步            false:同步 readyState  

记一次在node.js中使用crypto的createCipheriv方法进行加密时所遇到的坑

Node.js的crypto模块提供了一组包括对OpenSSL的哈希.HMAC.加密.解密.签名,以及验证等一整套功能的封装.具体的使用方法可以参考这篇文章中的描述:node.js_crypto模块. 本文重点介绍在使用createCipheriv方法时所遇到的坑.对应的解密算法createDecipheriv应该是一样的问题. 按照文档中的描述,createCipheriv方法接受三个参数:algorithm用于指定加密算法,如aes-128-ecb.aes-128-cbc等:key是用于加密

ajax异步处理时,如何在JS中获取从Servlet或者Action中session,request

ssh项目中,我需要登陆某个页面(如a.jsp),通过onblur()鼠标失去焦点后来触发js函数(函数是ajax请求)请求到相应的action,处理完成后将数据存放到session对象里面,然后在a.jsp中用el表达式获取想要的数据.可是问题来了,不知道为什么在打开浏览器第一次登录a页面时,a页面不会显示想要的数据,刷新后就有数据了,之后也正常. 后来查询了各种博客,各种网上的一些说法,最后总结出了自己的一套思路,仅供参考. 以下是在Action中 根据用户id查询出用户信息 .......

如何在JS中计算扑克牌中的顺子、对子、半顺、豹子、杂六

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>如何计算扑克牌中的顺子.对子.半顺.豹子.杂六</title> 5 <meta charset="utf-8"/> 6 </head> 7 <body> 8 号码1:<input type="number" value="5" id="num1&q

如何在JS中获取Request方法

方法 function GetRequest() { var url = location.search; //获取url中"?"符后的字串 var theRequest = new Object(); if (url.indexOf("?") != -1) { var str = url.substr(1); strs = str.split("&"); for (var i = 0; i < strs.length; i++)

img 标签内如何在src中引用变量

<html><head><script language="javascript">var adres="https://offlintab.firefoxchina.cn/static/img/search/baidu_web.png";function imgUrl() {        document.images.imgInit.src = adres;    }</script></head>&

在嵌入式学习过程中的困惑——有人说软件技术变化太快,现在学的东西过两年就要完全淘汰,是吗?

有人说软件技术变化太快,现在学的东西过两年就要完全淘汰,是吗? 你知道这话是什么人说的吗?必然是已经被淘汰的人说的.比如Delphi.BCB.PB这些开发工具和语言,都曾经很是风光了一阵,但现在已经完全被Java和.NET取代了.那么Java和.NET会不会被取代呢,也许在相当长的时间内还不会. 这些被淘汰的程序员有一些共同的特点:只会用鼠标拖拽控件,离开IDE就不知道如何工作,学点儿花拳绣腿的功夫就想吃一辈子,对学习新技术不感兴趣,做一天和尚撞一天钟.现在请回头看看1,在整个软件技术领域,这些