美文网首页
weexeros js和原生交互之Module拓展2019.3

weexeros js和原生交互之Module拓展2019.3

作者: cj2527 | 来源:发表于2019-03-14 10:37 被阅读0次

    官方建议:请优先使用官方扩展的 widget,不建议直接使用Module,如果需要直接引用Module的话,一定要自己在封装一层类似我们的 widget,因为原生Module在后续版本中可能会有所修改,统一封装一层对以后升级改动会小一些!

    Module 扩展

    Module是 js 与 native 交互的机制,比如像页面跳转、网络请求等一些操作,需要 native 通过扩展 Module 的方式提供接口供 js 调用,自定义 module 的步骤:

    1.  自定义的module类 必须实现 WXModuleProtocol
    2.  必须添加宏WX_EXPORT_METHOD, 它可以被weex识别,它的参数是 JavaScript调用 module指定方法的参数
    3.  添加@synthesized weexInstance,每个moudle对象被绑定到一个指定的实例上   
    4.  Module 方法会在UI线程中被调用,所以不要做太多耗时的任务在这里,如果要在其他线程执行整个module 方法,需要实现WXModuleProtocol中- (NSThread *)targetExecuteThread的方法,这样,分发到这个module的任务会在指定的线程中运行
    5.  Weex 的参数可以是 String 或者Map      
    6.  Module 支持返回值给 JavaScript中的回调,回调的类型是      WXModuleCallback,回调的参数可以是String或者Map
    

    官方实例一:网络请求 Module bmAxios
    可能 native 端的同学会有疑问,为啥名字是 Axios,因为前端有个著名的网络请求库就叫'Axios',类似于 iOS 端的 AFNetwork,所以为了方便前端同学识别 module 的作用故起名为 bmAxios。
    注:两者是不一样的
    原生端:
    1.1头文件遵守WXModuleProtocol协议

    #import <Foundation/Foundation.h>
    #import <WeexSDK.h>
    
    @interface BMAxiosNetworkModule : NSObject <WXModuleProtocol>
    @end
    

    1.2实现文件

    @implementation BMAxiosNetworkModule
    
    
    
    // 1.绑定一个 weexInstance 实例
    @synthesize weexInstance;
    
    //2.将方法暴露出去,这个一定要添加,不然 js 端调不到这个方法
    WX_EXPORT_METHOD(@selector(fetch:callback:))
    
    /**
     3.方法实现
    
     @param info:js调用方法传递的参数 
     @param callback: 通过callback 将结果数据回传给 js
     */
    - (void)fetch:(NSDictionary *)info callback:(WXModuleCallback)callback
    {
        /* 添加判断 */
        if (![info isKindOfClass:[NSDictionary class]]) {
            WXLogError(@"js request info Error");
            return;
        }
    
        // 解析 info
        BMAxiosRequestModel *requestModel = [BMAxiosRequestModel yy_modelWithJSON:info];
        // 创建请求
        BMCommonRequest *api = [[BMCommonRequest alloc] initWithRequestModel:requestModel];
    
        [((BMBaseViewController *)weexInstance.viewController) addRequest:api];
        // 触发请求
        [api startRequestResult:^(id data) {
    
            WXLogInfo(@"request data: %@",data);
            // 将数据结果回传给 js
            if (callback) {
                callback(data);
            }
    
        }];
    }
    

    注:callback返回数据格式]

      resData 数据    
      {
         status:0,   //状态码,0表示操作成功 9表示操作失败,数据请求Module bmAxios 此参数为 http请求的状态码如:200、404、503等
        errorMsg: '错误描述信息',
        data: 数据
      }
    

    1.3注册Module


    图片.png

    1.4在weex使用
    1.4.1先引入
    var axios = weex.requireModule('bmAxios')
    1.4.2调用方法
    如:发送请求 fetch(info,callback)

    // 示例
    axios.fetch({
        method: 'GET'                // 请求类型 GET、POST、HEAD、PUT、DELETE、PATCH
        url: 'http://xxx/xxx',       // 请求api,完整地址
        header: {}                   // 自定义请求头requestHeader
        data: {}                     // 请求参数
        timeout: 3000                // 超时时间(耗秒):默认3000毫秒
    }, function(resData){                        
        // resData 数据    
        // {
        //    status:200,   // http 请求状态吗
        //    errorMsg: '错误信息',
        //    data: 数据
        // }
    })
    

    官方请优先使用官方扩展的 widget,不建议直接使用Module,如果需要直接引用Module的话,一定要自己在封装一层类似我们的 widget
    看下官方封装的widget的Axios.js

    解读Axios.js未完待续

    相关文章

      网友评论

          本文标题:weexeros js和原生交互之Module拓展2019.3

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