美文网首页
ReactNative与原生页面的交互

ReactNative与原生页面的交互

作者: 海浪萌物 | 来源:发表于2018-05-09 15:32 被阅读15次

    上一篇文章记录了,在原生项目中如何集成RN页面,既然有页面就肯定有交互,这篇文章记录下RN和原生页面的交互,本质上是利用通知的形式进行交互!

    RN页面:
    1、在RN页面的import里面添加引入NativeModules

    import {  
        AppRegistry, 
        StyleSheet,  
        Text,  
        View, 
        TouchableOpacity,  
        NativeModules
    } from 'react-native';
    

    2、得到响应者:

    var RNModules = NativeModules.RTModules;
    

    里面的RTModules是需要跟原生页面约定好的响应者(也可以是原生页面的类名)

    3、添加响应事件:

    class credit extends Component {
        render() {   
            return (      
                <View style={styles.container}>
                <TouchableOpacity onPress={ ()=>RNModules.RNOpenOneVCa('测试') }>
                   <Text>Hello World!</Text>
                </TouchableOpacity>
            <TouchableOpacity onPress={ ()=>RNModules.RNOpenOneVC('测试111') }>
                   <Text>Hello World!</Text>
                </TouchableOpacity>
              </View> 
        );  
        }
    }
    

    其中RNModules.RNOpenOneVCa中的RNOpenOneVCa是要跟原生界面约定好的响应方法

    原生页面:

    1、在需要监听的类中引入类

    #import "RCTBridgeModule.h"
    

    2、遵循协议:<RCTBridgeModule>

    @interface BMCRNModules : NSObject<RCTBridgeModule>
    

    3、RN提供了监听通知的宏:

    RCT_EXPORT_MODULE(RTModules)
    

    其中RTModules是需要跟RN里面NativeModules约定好的响应者(此处也可以为空,如果为空的话,在RN页面的对应位置就写上该类的类名)!

    然后在宏RCT_EXPORT_METHOD里面写好响应代码:

    RCT_EXPORT_METHOD(RNOpenOneVCa:(NSString *)msg){
    
        NSLog(@"RN传入原生界面的数据为:%@  %@",msg,[NSThread currentThread]);
        //主要这里必须使用主线程发送,不然有可能失效
        dispatch_async(dispatch_get_main_queue(), ^{
            [[NSNotificationCenter defaultCenter]postNotificationName:@"RNOpenOneVC" object:msg];
        });
    }
    

    其中RNOpenOneVCa是跟RN约定好的响应方法!

    最终代码:
    RN:

    import React, { Component } from 'react';
    import {  
        AppRegistry, 
        StyleSheet,  
        Text,  
        View, 
        TouchableOpacity,  
        NativeModules
    } from 'react-native';
    
    var RNModules = NativeModules.RTModules;
    
    class credit extends Component {
        render() {   
            return (      
                <View style={styles.container}>
                <TouchableOpacity onPress={ ()=>RNModules.RNOpenOneVCa('测试') }>
                   <Text>Hello World!</Text>
                </TouchableOpacity>
            <TouchableOpacity onPress={ ()=>RNModules.RNOpenOneVC('测试111') }>
                   <Text>Hello World!</Text>
                </TouchableOpacity>
              </View> 
        );  
        }
    }
    
    const styles = StyleSheet.create({ 
      container: {
        backgroundColor : 'red',
        height:100,
        flexDirection : 'row'
        },
    });
    AppRegistry.registerComponent('credit', () => credit);
    

    原生代码:

    RCT_EXPORT_MODULE(RTModules)
    //RN跳转原生界面
    RCT_EXPORT_METHOD(RNOpenOneVCa:(NSString *)msg){
    
        APP_LOG_INFO(@"RN传入原生界面的数据为:%@  %@",msg,[NSThread currentThread]);
        //主要这里必须使用主线程发送,不然有可能失效
        dispatch_async(dispatch_get_main_queue(), ^{
            [[NSNotificationCenter defaultCenter]postNotificationName:@"RNOpenOneVC" object:msg];
        });
    }
    //RN跳转原生界面1
    RCT_EXPORT_METHOD(RNOpenOneVC:(NSString *)msg){
    
        APP_LOG_INFO(@"RN传入原生界面的数据为:%@  %@",msg,[NSThread currentThread]);
        //主要这里必须使用主线程发送,不然有可能失效
        dispatch_async(dispatch_get_main_queue(), ^{
            [[NSNotificationCenter defaultCenter]postNotificationName:@"RNOpenOneVC" object:msg];
        });
    }
    

    相关文章

      网友评论

          本文标题:ReactNative与原生页面的交互

          本文链接:https://www.haomeiwen.com/subject/bwonrftx.html