How to access native UI components' instance methods in React Native

前端 未结 2 844
孤城傲影
孤城傲影 2020-12-24 14:44

We can control custom native UI components\' properties by exporting native properties using RCT_EXPORT_VIEW_PROPERTY.

But how to export instance method

2条回答
  •  温柔的废话
    2020-12-24 15:23

    Thanks to @alinz's suggestion.

    This can be done within the custom native component's view manager.

    1. Obj-c side: In the native view manager expose a native method like this:

    The key is to pass in the reactTag which is the reference to the native component.

    MyCoolViewManager.m:

    RCT_EXPORT_METHOD(myCoolMethod:(NSNumber *)reactTag callback:(RCTResponseSenderBlock)callback) {
      [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) {
        MyCoolView *view = viewRegistry[reactTag];
        if (![view isKindOfClass:[MyCoolView class]]) {
          RCTLogMustFix(@"Invalid view returned from registry, expecting MyCoolView, got: %@", view);
        }
        // Call your native component's method here
        [view myCoolMethod];
      }];
    }
    
    1. JS side: Add API in the react component class:

    MyCoolView.js:

    var React = require('react-native');
    var NativeModules = require('NativeModules');
    var MyCoolViewManager = NativeModules.MyCoolViewManager;
    var findNodeHandle = require('findNodeHandle');
    
    class MyCoolView extends React.Component{
        // ...
        myCoolMethod() {
            return new Promise((resolve, reject) => {
                MyCoolViewManager.myCoolMethod(
                    findNodeHandle(this),
                    (error, result) => {
                        if (error) {
                            reject(error);
                        } else {
                            resolve(result);
                        }
                    }
                );
            });
        }
    }
    

提交回复
热议问题