• 第1年5月25日 weex WXComponent


    1.

    扩展组件

    1. 新建一个基类为 WXComponent 的类。如果这个类里什么代码也不写,它和默认的的 div 组件能力是一致的。
    2. 覆盖 WXComponent 中的生命周期方法
    • loadView
      一个组件默认对应于一个 view,如果未覆盖 loadView 提供自定义 view,会让 WXComponent 基类创建 WXViewWXView 继承自 UIView。比如我们要实现一个组件支持地图功能,我们可以返回系统的 MKMapView
    - (UIView *)loadView {
        return [MKMapView new];
    }
    
    • viewDidLoad 对组件 view 需要做一些配置,比如设置 delegate,可以在 viewDidLoad 生命周期做。如果当前 view 没有添加 subview 的话,不要设置 view 的 frame,WeexSDK 会根据 style 进行排版后设置。
    - (void)viewDidLoad {
          ((MKMapView*)self.view).delegate = self;
    }
    
    1. 注册组件
    [WXSDKEngine registerComponent:@"map" withClass:[WXMapComponent class]];
    
    1. 在前端代码中使用新组件
    <template>
        <div>
            <map style="width:200px;height:200px"></map>
        </div>
    </template>
    

    #自定义事件

    1. 对于每个组件,WeexSDK 默认提供了一些事件能力,如点击等。假如想给我们的地图组件提供 mapLoaded 事件。
    <template>
        <div>
            <map style="width:200px;height:200px" @mapLoaded="onMapLoaded"></map>
        </div>
    </template>
    
    <script>
    export default {
        methods: {
            onMapLoaded:function(e) {
                console.log("map loaded"+JSON.stringify(e))
            }
        }
    }
    </script>
    
    1. 覆盖组件生命周期方法,记录事件是否需要处理

    我们需要额外添加一个 BOOL 成员 mapLoaded 用来记录该事件是否生效。

    - (void)addEvent:(NSString *)eventName {
        if ([eventName isEqualToString:@"mapLoaded"]) {
            _mapLoaded = YES;
        }
    }
    
    - (void)removeEvent:(NSString *)eventName {
        if ([eventName isEqualToString:@"mapLoaded"]) {
            _mapLoaded = NO;
        }
    }
    
    1. 给前端发送事件
    - (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView {
        if (_mapLoaded) {
            [self fireEvent:@"mapLoaded" params:@{@"customKey":@"customValue"} domChanges:nil];
        }
    }
    

    #自定义属性

    给我们的地图组件添加一个新的属性 showTraffic。在前端代码里可以控制组件是否显示车流情况。

    <template>
        <div>
            <map style="width:200px;height:200px" showTraffic="true"></map>
        </div>
    </template>
    
    1. 覆盖组件初始化方法 initWithRef... 给组件添加一个成员变量记录 showTraffic 属性的值,并在 init 方法中初始化。
    - (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDictionary *)styles attributes:(NSDictionary *)attributes events:(NSArray *)events weexInstance:(WXSDKInstance *)weexInstance {
        if(self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance]) {
            if (attributes[@"showsTraffic"]) {
                _showsTraffic = [WXConvert BOOL: attributes[@"showsTraffic"]];
            }
        }
        return self;
    }
    
    1. 在生命期事件中记得将属性值同步给地图控件
    - (void)viewDidLoad {
      ((MKMapView*)self.view).showsTraffic = _showsTraffic;
    }
    
    1. 当属性更新时,同步给地图控件
    - (void)updateAttributes:(NSDictionary *)attributes {
        if (attributes[@"showsTraffic"]) {
            _showsTraffic = [WXConvert BOOL: attributes[@"showsTraffic"]];
            ((MKMapView*)self.view).showsTraffic = _showsTraffic;
        }
    }
    

    #更多的组件生命期方法

    组件是由 Weex 管理的,比如创建、布局、渲染、销毁。Weex 组件的生命周期方法都是可以重写的,你可以在这些生命周期中去做自己的事情。

    方法描述
    initWithRef:type:… 用给定的属性初始化一个component.
    layoutDidFinish 在component完成布局时候会调用.
    loadView 创建component管理的view.
    viewWillLoad 在component的view加载之前会调用.
    viewDidLoad 在component的view加载完之后调用.
    viewWillUnload 在component的view被释放之前调用.
    viewDidUnload 在component的view被释放之后调用.
    updateStyles: 在component的style更新时候调用.
    updateAttributes: 在component的attribute更新时候调用.
    addEvent: 给component添加event的时候调用.
    removeEvent: 在event移除的时候调用.

    #给组件添加方法

    在组件代码中使用宏 WX_EXPORT_METHOD 声明组件方法供前端调用。

    @implementation WXMyComponent
    
    WX_EXPORT_METHOD(@selector(focus))
    
    - (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDictionary *)styles attributes:(NSDictionary *)attributes events:(NSArray *)events weexInstance:(WXSDKInstance *)weexInstance {
       if (self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance]) {
           // handle your attributes
           // handle your styles
       }
    
       return self;
    }
    
    - (void)focus {
        NSLog(@"you got it");
    }
    @end
    

    在 JS 中调用 focus 方法。

    <template>
      <mycomponent ref='mycomponent'></mycomponent>
    </template>
    <script>
      module.exports = {
        created: function() {
          this.$refs.mycomponent.focus();
        }
      }
    </script>

    https://weex.apache.org/zh/guide/extend/extend-ios.html#%E8%87%AA%E5%AE%9A%E4%B9%89-module

    2.uni-app

    https://nativesupport.dcloud.net.cn/NativePlugin/course/ios

  • 相关阅读:
    c# 日期函数DateTime.ToString()日期的各种格式 (本人亲测)
    C# Excel导入、导出【源码下载】
    微信支付服务器CA证书更换服务器安装der证书的方法 DigiCert的根证书
    重置winsock目录解决不能上网的问题
    模型验证组件 FluentValidation
    对于“Newtonsoft.Json”已拥有为“NETStander.Library”定义的依赖项,解决办法
    .NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(一)
    C# 中参数验证方式的演变
    一步一步ITextSharp 低级操作函数使用
    Winform 打印PDF顺序混乱,获取打印队列
  • 原文地址:https://www.cnblogs.com/javastart/p/14809113.html
Copyright © 2020-2023  润新知