native向js传递数据

出处

https://github.com/crazycodeboy/RNStudyNotes/tree/master/React%20Native%E5%8E%9F%E7%94%9F%E6%A8%A1%E5%9D%97%E5%90%91JS%E4%BC%A0%E9%80%92%E6%95%B0%E6%8D%AE%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E5%BC%8F
有时需要在native和js之间传递数据,有以下几种方式

Callback

Callback是最常用的设计模式之一。无论是java,oc,c#,还是js等都会看到Callback的身影;
native支持Callback类型的参数,该Callback对应js中的function。

  • 写法
//native部分
public class EasyKitModule extends ReactContextBaseJavaModule {
    private static final String TAG = EasyKitModule.class.getSimpleName();
    public EasyKitModule(ReactApplicationContext reactContext) {
        super(reactContext);
    }

    @Override
    public String getName() {
        return "EasyKit";
    }

    @ReactMethod//三个参数分别对应 js向native传的参数、js失败回调方法、js成功回调方法
    public void runWithCallback(String params, Callback errorCallback, Callback successCallback) {
        Log.i(TAG + "_params:", params);
        try {
            successCallback.invoke(getResult());//通过invoke方法将数据返回给js
        } catch (Exception e) {
            errorCallback.invoke(e.getMessage());
        }
    }
    ...
}
//js部分
export default class Tab1 extends BaseComponent {

 _onPress = () => {
        this._invokeNativeWithCallback()
    }

 _invokeNativeWithCallback = () => {
        let greetFromJS = 'hello,it is from reactjs'
        const errCallback = (errCode, errMsg) => {
            console.log(errCode, errMsg)
        }
        const successCallback = (data) => {
            console.log(data)
        }
        EasyKit.runWithCallback(//这里的三个参数与原生模块中的方法相对应
            greetFromJS,
            errCallback,
            successCallback,
        )
    }
    ...
}

Promise

Promises是es6的一个新的特性,在rn中非常重要。native也支持Promise。

  • 写法
//native部分
  @ReactMethod//接收参数对应js向native传递的参数,js中的Promise容器
    public void runWithPromise(String params, Promise promise) {
        Log.i(TAG + "_params:", params);
        try {
            int a = 10 / 0;
            promise.resolve(getResult());
        } catch (Exception e) {
            promise.reject(TAG, e.getMessage());
        }
    }
//js部分
  _invokeNativeWithPromise = () => {
        let greetFromJS = 'hello,it is from reactjs'
        new Promise((resolve, reject) => {
            const result = EasyKit.runWithPromise(greetFromJS)//这里调用native方法的时只需传前面的参数
            resolve(result)
        }).then((result) => {
            console.log(result)
        }).catch((error) => {
            console.log(error)
        })
    }

Event

native支持以事件的方式向js发送数据,像Android中的广播,iOS中的通知中心;接收方注册接收该事件即可接收到native发送的事件。

  • 写法
    这里通过js调用native方法来发送事件
  //native部分
   @ReactMethod
    public void sendEventFromNative(String params) {
        WritableMap map = Arguments.createMap();
        map.putString("nativeMsg", "hello,it is a global event from native");
        sendEvent(getReactApplicationContext(), "wishesFromNative", map);
    }
    
    private void sendEvent(ReactContext reactContext, String eventName, @Nullable WritableMap params) {
        reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit(eventName, params);//发送的事件包括事件名和需要传递的数据
    }
  //js部分
    _sendEventFromNative = () => {
        let greetFromJS = 'hello,it is from reactjs'
        //触发native发送事件
        EasyKit.sendEventFromNative(greetFromJS)
    }
    
    //定义事件处理方法
    _handleNativeEvent = (data) => {
        console.log('tab_1 receives a native event', data)
    }

    componentDidMount() {
        //这里需要先添加事件监听 参数分别为 时间名、事件处理方法
        DeviceEventEmitter.addListener('wishesFromNative', this._handleNativeEvent)
    }

    componentWillUnmount() {
        //当必要时 可注销监听事件
        DeviceEventEmitter.removeListener('wishesFromNative')
    }

方式对比

类型 缺点 优点
Callback 单次传递 传递过程可控
Promise 单次传递 传递过程可控
Event native驱动,js被动接收 可多端接收
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容

  • 【Aipm引导页】 https://58976235.wodemo.net/down/20170514/44034...
    Mr_洛寒阅读 2,534评论 3 5
  • 二哈,男,微胖界,骚断腿属性。 夜幕降临,刚刚下班的二哈,走在回家的路上,霓灯闪烁,照的人影幢幢,一阵秋风吹来,二...
    因为你世界充满爱阅读 615评论 1 1
  • @synthesize和@dynamic分别有什么作用?@property有两个对应的词,一个是 @synthes...
    笔笔请求阅读 505评论 0 1
  • 2017年12月4日 星期一 晴天 今天放学回家写完作业我就拿出PH试纸,开始实验:我用一个水瓶装了厨房自...
    鑫隆妈妈阅读 194评论 0 0
  • 入九月,雨就不止的下 不如六七月的急 不如腊月的寒 但也叫人寒毛直立 如果你正当壮年 那请脱下你洁净的鞋子 赤脚走...
    简塘凉伊阅读 232评论 0 1