天天看點

深入折騰 Weex,知乎日報用戶端開發

深入折騰了一下 weex,做了一個知乎日報的用戶端,同時實作了一種目前 weex 尚未提供的 native 頁面切換思路。

最後效果如下:

深入折騰 Weex,知乎日報用戶端開發
深入折騰 Weex,知乎日報用戶端開發

這個 demo 主要實踐 4 件事情:

1. 子產品注冊

2. 元件注冊

2. native 方法調用

4. native 頁面切換 & 參數傳遞

整個 app 隻有兩個頁面,都是純 weex 編寫的,對于第一個頁面非常的簡單,布局類似于 ios 的 tableview

然後我們使用 this.$sendhttp 發起 http 請求,這裡知道,weex 僅僅是一個渲染引擎,對于 http 請求,mtop 請求,甚至圖檔加載等功能,是需要業務注入實作類的。比如 weexdemo 裡面的 sendhttp 就是注入了 wxstreammodule 子產品,然後在實作裡面使用了 nsurlconnection,這個設計非常不錯,在具體的業務當中,你可以把實作代碼替換成任何你想要的 http 庫。

這就是 weex 注冊子產品的原理,其中圖檔子產品是用 sdwebimage 實作的。我們同樣也可以将其他的 native 方法注冊到子產品裡面,例如:

然後在 javascript 代碼裡面隻需要用 this.$call("event", "log", "hello, world!"); 就能在 native 裡面輸出 hello world! 這提供了強大的擴充能力。

首頁的展示是較為簡單的,用的是 weex 自帶的 image 和 text,但是詳情頁是一個 web 頁面,貌似我還沒找到 weex 提供的 webview 渲染元件。(但是奇怪的是,我自建 wxwebviewcomponent 的時候提示 duplicated symbol,難道是還未實作麼),是以我們需要自建一個 wxcomponent,用于 webview 渲染。

當然我們也可以使用 native 代碼打開一個 webview,不過這樣顯然不如純 weex 實作有趣。

這個 component 支援 url 和 html 兩種 attribute,意味着可以從 url 或者 html 代碼渲染他。我們把它注冊到 webnode 這個名字上面,就能在詳情頁使用它了:

然後最最關鍵的事情來了,當使用者點選一行的時候,我們要從首頁跳到詳情頁,而這兩個頁面都是 weex 的(目前貌似 weex 沒有提供這樣的能力)。

但是沒有關系,我們有 module,這裡我實作了一套邏輯,包括了本地頁面 push 和 weex 頁面上下文傳遞邏輯。

然後在首頁 onclick 的時候,隻要把 context 帶到 module 裡面的 push 方法,往下透傳過下一個 weex 頁面,就能完成下個頁面的初始化。

具體來說,這裡面使用了一個資料綁定上面的技巧,我把 weex 頁面上的 data 字段放置了一個 "{{context}}"

這是一個占位符,會在 native code 裡面被 push 傳進來的 context 替換(這是一個 nsdictionary),處理的過程隻是做一次字元串替換

然後我們的上下文就會被綁定到下一個 weex 頁面,其實根據這個思路,我們可以做更多的 weex 和本地的互動,甚至把它做成 framework 友善使用。

整個流程如下:

首頁 weex 渲染 --> onclick --> module 傳遞上下文到下一個 weex --> weex 自定義元件 webview 渲染

以上就是整個 demo 的完整思路。

最後

weex 的子產品注冊、元件注冊非常的有用,給業務擴充自己的能力,自定義自己的功能提供了強大的基礎。

當然也希望 weex 可以在 native 互動方面提供更多有用的方法。

繼續閱讀