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被动接收 可多端接收
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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