如何在React Native中访问本机UI组件的实例方法

Der*_*Hsu 15 react-native

我们可以通过使用导出本机属性来控制自定义本机UI组件的属性RCT_EXPORT_VIEW_PROPERTY.

但是如何导出本机UI组件的实例方法?

Der*_*Hsu 15

感谢@alinz建议.

这可以在自定义本机组件的视图管理器中完成.

  1. 对象侧:在本机视图管理器中公开这样的本机方法:

关键是传入reactTag哪个是对本机组件的引用.

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];
  }];
}
Run Code Online (Sandbox Code Playgroud)
  1. JS方面:在react组件类中添加API:

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);
                    }
                }
            );
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案似乎不适用于本机版本的新版本.addUIBlock不再可以从uiManager调用.试着找出解决这个问题的方法. (3认同)
  • 我在github上找到了一个工作示例.看看这个.https://github.com/ProjectSeptemberInc/gl-react-native/blob/master/ios/GLCanvasManager.m#L38 (2认同)