react native js中调用native中的方法

react native js中调用native中的方法

这里主要涉及到几个类

  1. java
    /**
    <ul><li>Base class for Catalyst native modules that require access to the {@link ReactContext}</li>
    <li>instance.
    */
    ReactContextBaseJavaModule //native的类继承该类

2.ReactPackage—-所有的继承自ReactContextBaseJavaModule的子类,都会注册到这个ReactPackage里维护的一个集合里。

3.关键的类ReactApplication,里面只有一个方法ReactNativeHost,该抽象类中主要实现方法getPackages,这里会获取在上面ReactPackage中的列表,我们将会在这注册自己书写的packages,这里默认会注册一个MainReactPackage。

具体代码流程

native端主要有三个类:

//module类
public class TestDemoModule extends ReactContextBaseJavaModule {
    public TestDemoModule(ReactApplicationContext reactContext) {
        super(reactContext);
    }

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

    @ReactMethod
    public void show(String str) {
        Toast.makeText(getReactApplicationContext(), str, Toast.LENGTH_SHORT).show();
    }
}

下面是package类,module会注册到modules这个集合里:

public class TestDemoPackage implements ReactPackage {
    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();

        modules.add(new TestDemoModule(reactContext));

        return modules;
    }

    @Override
    public List<Class<? extends JavaScriptModule>> createJSModules() {
        return Collections.emptyList();
    }

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }
}

下面就是在MainApplication中ReactNativeHost通过getPackages获取native端的注册类,


public class MainApplication extends Application implements ReactApplication {

    private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
        @Override
        public boolean getUseDeveloperSupport() {
            return BuildConfig.DEBUG;
        }

        @Override
        protected List<ReactPackage> getPackages() {
            return Arrays.<ReactPackage>asList(
                    new MainReactPackage(),
                    new TestDemoPackage()
            );
        }
    };

    @Override
    public ReactNativeHost getReactNativeHost() {
        return mReactNativeHost;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        SoLoader.init(this, /* native exopackage */ false);
    }

上面完成了整体的编写,下面是在js端的调用:

这里简单列出两种:

  • 直接直接引入getName返回的名字,代码如下:

    import {
      AppRegistry,
      StyleSheet,
      Text,
      View,
      TestDemoModule,
    } from 'react-native';
    
    var {NativeModules}=require('react-native');
    var testDemoModuleAndroid = NativeModules.TestDemoModule;
    //下面就可以调用了,
    testDemoModuleAndroid.show('Hello Toast of native');
  • 直接引入NativeModules,这个就更简单了:

    import {
      AppRegistry,
      StyleSheet,
      Text,
      View,
      NativeModules,
    } from 'react-native';
    //直接使用,是不是更简单
    NativeModules.TestDemoModule.show('成功调用原生方法');

总结

上面就是两种方法,还是很简单的吧,希望能给初学的同学参考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Native提供了一个名为`WebView`的组件,可以用来加载并运行HTML页面,并且可以与HTML页面的JavaScript代码进行交互。使用WebView可以实现在React Native调用JavaScript方法的功能,具体步骤如下: 1. 安装WebView组件:在React Native项目执行`npm install react-native-webview`命令安装WebView组件。 2. 导入WebView组件:在需要使用WebView组件的文件,使用`import { WebView } from 'react-native-webview';`语句导入WebView组件。 3. 在render()方法使用WebView组件:使用`<WebView />`标签创建一个WebView组件,并设置`source`属性为HTML页面的URL或者本地文件路径。 4. 在JavaScript定义需要调用方法:在HTML页面定义需要调用的JavaScript方法,并使用`window.ReactNativeWebView.postMessage()`方法React Native发送消息。 5. 在React Native调用JavaScript方法:使用WebView组件的`injectJavaScript()`方法向WebView注入JavaScript代码,调用在HTML页面定义的方法。 示例代码如下: ``` import React, { Component } from 'react'; import { WebView } from 'react-native-webview'; class MyWebView extends Component { onMessage = (event) => { const { data } = event.nativeEvent; // 收到HTML页面发送的消息 console.log(data); } render() { return ( <WebView source={{uri: 'https://example.com'}} onMessage={this.onMessage} /> ); } } export default MyWebView; ``` HTML页面代码: ``` <button onclick="sendMessage()">发送消息</button> <script> function sendMessage() { window.ReactNativeWebView.postMessage('Hello from HTML!'); } </script> ``` 在React Native调用HTML页面的`sendMessage()`方法: ``` webViewRef = React.createRef(); // 在componentDidMount()方法获取WebView组件的引用 componentDidMount() { this.webViewRef.current.injectJavaScript(` sendMessage(); `); } ``` 上述代码通过在HTML页面定义了一个`sendMessage()`方法,并使用`window.ReactNativeWebView.postMessage()`方法发送消息到React Native。在React Native使用`injectJavaScript()`方法向WebView注入JavaScript代码,调用HTML页面的`sendMessage()`方法,从而实现了React Native调用JavaScript方法的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值