Weex系列(2) —— 頁面跳轉和通訊

Hello World項目以後就在想着這個系列接下來該怎麼寫,那就先簡單擬個目錄吧,一方面督促本身能堅持下去,一方面若是你們有興趣的話,也請多多關注個人專欄,順手點個贊啊~~css

目錄

大體就是這個順序吧,可能會微調,那下面就開始這一章吧。html

入口

標題上加了官網怎麼集成Weex到已有應用的連接,裏面提到了很重要的入口方法。vue

iOSjava

NSURL *URL = [self testURL: [self.url absoluteString]];
NSString *randomURL = [NSString stringWithFormat:@"%@%@random=%d",URL.absoluteString,URL.query?@"&":@"?",arc4random()];
[_instance renderWithURL:[NSURL URLWithString:randomURL] options:@{@"bundleUrl":URL.absoluteString} data:nil];

這是前一篇用weex腳手架初始化的helloworld項目,在WXDemoViewController.m的render方法裏面能夠看到這段代碼。
而後重點來了,weex.config.bundleUrl的值:一、取得是上面options的bundleUrl值二、若是這個值不填,取得就是咱們賦給renderWithURL的url地址。因此若是咱們加載服務器上的一個頁面js,而後這個頁面又想跳回到本地的一個頁面js,那麼在服務器頁面取bundleUrl的時候取得就是http的一個地址,是取不到咱們想要跳到本地頁面js絕對前綴地址的,有點繞,最後就講講咱們App的思路吧。我作的兩個App頁面所有都是用vue寫的,因此首頁、tab頁等頁面js確定是得打在包裏面的,咱們也有作過拉新的活動頁,這個頁面就能夠放在服務器上,支持熱更新啊,就遇到了上面的跳轉問題,我是全局取了一個bundlejs的絕對地址,在服務器上的頁面也就是咱們的拉新活動頁面裏面直接用這個地址就跳回到本地的頁面了web

- (void)renderWithURL:(NSURL *)url options:(NSDictionary *)options data:(id)data
{
    if (!url) {
        WXLogError(@"Url must be passed if you use renderWithURL");
        return;
    }
    
    self.needValidate = [[WXHandlerFactory handlerForProtocol:@protocol(WXValidateProtocol)] needValidate:url];
    
    WXResourceRequest *request = [WXResourceRequest requestWithURL:url resourceType:WXResourceTypeMainBundle referrer:@"" cachePolicy:NSURLRequestUseProtocolCachePolicy];
    [self _renderWithRequest:request options:options data:data];
    [WXTracingManager startTracingWithInstanceId:self.instanceId ref:nil className:nil name:WXTNetworkHanding phase:WXTracingBegin functionName:@"renderWithURL" options:@{@"bundleUrl":url?[url absoluteString]:@"",@"threadName":WXTMainThread}];
}

Androidapache

在WXSDKInstance.java裏面能夠看到
render(pageName,template,options,jsonInitData,flag);
renderByUrl(pageName,url,options,jsonInitData,flag);
安卓和iOS基本相似,可是這兒有兩個方法,官網的文檔是render,這一個render害死人啊,不過用weex腳手架初始化的項目用的是renderByUrl,因此若是沒看官網直接用腳手架開發的,躲過一劫啊。
能夠看到這兩個方法就差了第二個參數,下面是官網的代碼,用render方法的時候,第二個參數裏面須要用WXFileUtils.loadFileContent這個方法,並且若是option不填的話bundleUrl是取不到js地址?後面咱們加的參數的json

/**
 * WXSample 能夠替換成自定義的字符串,針對埋點有效。
 * template 是.we transform 後的 js文件。
 * option 能夠爲空,或者經過option傳入 js須要的參數。例如bundle js的地址等。
 * jsonInitData 能夠爲空。
 * width 爲-1 默認全屏,能夠本身定製。
 * height =-1 默認全屏,能夠本身定製。
 */
mWXSDKInstance.render("WXSample",WXFileUtils.loadFileContent("hello.js", this), null, null, -1, -1, WXRenderStrategy.APPEND_ASYNC);

下面就來講說幾種常見的跳轉吧segmentfault

Native -> Weex

也就是用開頭咱們提到的兩個方法,而後把咱們的bundlejs地址傳入就能夠打開Weex頁面了服務器

Weex -> Native

這個我這邊用的不多,大概思路就是,攔截處理,iOS用Scheme、[[UIApplication sharedApplication] openURL:weburl];吧,Android用intent-filter吧。weex

Weex -> Weex

你們在個人helloworld那篇bundlejs小節裏面有一個路徑截圖,能夠對比代碼參考一下,下面我也把iOS和Android的bundlejs路徑圖截出來了。

const device = weex.config.env;
getBaseUrl(url) {
    if (device.platform === 'iOS') {
      nativeBase = url.substring(0, bundleUrl.lastIndexOf('/') + 1);
    } else {
      nativeBase = 'file://assets/dist/';
    }
}
Weex頁面A:
Weex頁面B的地址 BUrl=getBaseUrl(weex.config.bundleUrl)+B.js
navigator.push({url:BUrl}, function(e) {});
就能夠跳到Weex頁面B了

clipboard.pngclipboard.png

webview -> Weex

這也是比較常遇到的一個跳轉,大體思路和Weex跳原生相似,也是一個攔截處理,這一塊就放在後面Weex系列(7) —— web組件和webview這個章節講吧。

頁面通訊這塊用的比較多的大概有下面幾種。

bundlejs路徑地址傳參

就如標題描述的同樣,weex.config.bundleUrl拿到相似A.js?a=1&b=2,和解析網頁地址同樣,拿到A傳給B的a、b後面的值。

BroadcastChannel

咱們在B頁面操做完成以後,navigator.pop()以後回到A頁面,但願A頁面的button狀態改變,由於頁面是棧式操做,A頁面不會自動刷新,能夠用Weex提供的這個BroadcastChannel通道來監聽解決,具體操做,你們點擊標題就能夠了解了。

storage

感受這個你們應該很是熟悉,對,Weex也提供給咱們了,咱們能夠愉快的使用了。

globalevent

最後仍是提一下這個globalEvent,Weex和原生經過這個能夠通訊,這個咱們用到的仍是挺多的,你們也能夠去官網瞭解一下呦。

就這麼多吧,歡迎你們關注個人專欄啊,若是有一點點喜歡,也請點個贊啊~

相關文章
相關標籤/搜索