美文网首页
React Native 混编1 - 封装原生的UI控件(基本控

React Native 混编1 - 封装原生的UI控件(基本控

作者: 奔波灞儿 | 来源:发表于2016-12-09 08:13 被阅读276次

如果对你的思路有丁点的帮助,麻烦帮忙点个👍哟,谢谢!!!!

我们新建一个RN工程 本文以 MyBasicUIDemo 为例

文章目的:封装一个原生的UI 控件,在RN 上使用,

案例实现功能:
1 原生的view上有一个Button,Label,点击按钮的时候让Label显示文字
2 RN 上有一个text组件,如果原生的Laebl有文字,那么显示oc传递的值,

未命名.gif

具体实现步骤:

1、打开RN工程下的ios工程,新建一个继承自UIView的类 MyBasicView

注意点: 需要导入 #import <RCTComponent.h>
写上如下代码:

在 .h 中添加我们需要的属性及方法

@interface MyBasicView : UIView

  @property (nonatomic, strong) NSString *name;  // Label上将来显示的文字

  @property (nonatomic, strong) RCTBubblingEventBlock onClickButton;  // 封装代码块 - 回调(用来接收oc传递的参数,并显示在text组件上)

@end

在 .m 中实现具体的代码

#import "MyBasicView.h"

@interface MyBasicView ()

    @property (nonatomic, weak) UILabel *myLabel;
    @property (nonatomic, weak) UIButton *myButton;

@end

@implementation MyBasicView

- (instancetype)initWithFrame:(CGRect)frame
{
  self = [super initWithFrame:frame];
  if (self) {
    
    UILabel *label = [[UILabel alloc] init];
    label.backgroundColor = [UIColor orangeColor];
    _myLabel = label;
    [self addSubview:label];
    
    UIButton *button = [[UIButton alloc] init];
    [_myButton sizeToFit];
    _myButton = button;
    [button setTitle:@"点击我显示文字" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(showText) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:button];
  }
  return self;
}

- (void)layoutSubviews
{
  [super layoutSubviews];
  
  self.myLabel.center = CGPointMake(self.frame.size.width * 0.5, self.frame.size.height * 0.5);
  
  self.myButton.center = CGPointMake(self.frame.size.width * 0.5, self.frame.size.height * 0.5 + 20);
  
}

- (void)showText
{
  self.myLabel.text = self.name;
  [self.myLabel sizeToFit];
// 执行 block封装的代码 并向RN传递参数(NSDictionary *)
  if (self.onClickButton) {
    self.onClickButton(@{@"key":@"我是原生传递给RN的文字 - 小小", @"boolKey":@(self.myLabel.text.length)});
  }
}

2、创建一个继承自RCTViewManager的管理类 RCTMyBasicViewManager 来管理我们的原生控件 MyBasicView

2.1 在该类的 .m 文件夹下写入宏
RCT_EXPORT_MODULE( )
2.2 实现 - (UIView *)view ( )方法

#import "RCTMyViewManager.h"

#import "MyBasicView.h"

@implementation RCTMyViewManager

RCT_EXPORT_MODULE()

RCT_EXPORT_VIEW_PROPERTY(name, NSString)// 导出参数供RN 使用

RCT_EXPORT_VIEW_PROPERTY(onClickButton, RCTBubblingEventBlock)// 导出参数供RN 使用

- (UIView *)view
{
  return [[MyBasicView alloc] init];   // MyBasicView的尺寸位置以及样式由RN来控制
}

@end

3、在RN 中将这个view 加载进来
3.1 新建一个 MyView的js文件(名字随便)

import React, { Component } from 'react';
import { requireNativeComponent } from 'react-native';
let RCTMyView = requireNativeComponent('RCTMyView', MyView);
// 注意  requireNativeComponent 参数1 为OC 文件中的 RCTMyViewManager 去掉Manager ,参数2 为 js中的 MyView,
// 意思是:将 manager管理的view 映射到 我们创建的js组件中,即:将原生view封装在js组件中
export default class MyView extends Component {
    render() {
        return <RCTMyView {...this.props}/>
    }
}

3.2 在index.ios.js中导入我们自定义组件MyView并使用

import MyView from './MyView'
export default class MyBasicUIDemo extends Component {  render() {    
return (        
     <View  style={styles.container}>  
        <Text style={{marginTop:20,backgroundColor:'red'}}>    
            RN的text组件:{this.state.text}  
        </Text>  
      <MyView 
          style={styles.nativeViewStyle} 
          name='canshu' 
// onClickButton 封装代码 -  拿到OC传递过来的值,显示在自己的text组件上
// 取值注意点:必须通过nativeEvent来获取
          onClickButton={(e)=>{     
           if (e.nativeEvent.boolKey){         
               this.setState({              
                  text:e.nativeEvent.key          
              })      
          }else {         
             this.setState({             
                 text:'原生label的文字消失了'          
            })      
          } 
         }}/>
</View>    
); 
 }}

最后 - 运行项目即可

相关文章

网友评论

      本文标题:React Native 混编1 - 封装原生的UI控件(基本控

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