大前端時代背景下,前端開發人員掌握單一的 Web 端開發能力已經遠遠不夠了,微信小程式、安卓 APP、IOS APP,甚至是 Windows 桌面端,還有最近出的鴻蒙系統開發,都成了我們成長需要掌握的技能。所以呢,市面上各種「跨平臺」開發解決方案層出不窮,比較有代表性的就是: UniAPP 、 Flutter、 React Native、Taro、Weex 等等。
UniAPP 是基於「 Vue + 微信小程式 」語言體系,開發人員學習成本低上手快,同時隨著如今 UniAPP 生態也逐步趨於成熟。所以,基於 UniAPP 開發多端專案,已經是很多中小型企業常用的技術解決方案。
那麼,今天呢,我們就從 UniAPP 基礎開始,對照企業級實踐標準,從零到一,一步一步打造一個 多端(微信小程式 + H5 + 安卓 APP + IOS APP)的社群論壇類專案。
學前須知:
課程簡介:
uni-app 是一個使用 Vue.js 開發所有前端應用的框架,開發者編寫一套程式碼,可釋出到 iOS、Android、H5,以及各種小程式(微信/支付寶/百度/頭條/ QQ /釘釘)等多個平臺,方便開發者快速交付,不需要轉換開發思維,不需要更改開發習慣。
幾十萬應用、uni 統計月活12億、70+ 微信 / QQ群
在跨端的同時,通過條件編譯 + 平臺特有 API 呼叫,可以優雅的為某平臺寫個性化程式碼,呼叫專有能力而不影響其他平臺
載入新頁面速度更快、自動 diff 更新資料,App 端支援原生渲染支撐更流暢的使用者體驗,小程式端的效能優於市場其他框架
外掛市場數千款外掛,支援 NPM、支援小程式元件和SDK,微信生態的各種 sdk 可直接用於跨平臺 APP
基於通用的前端技術棧,採用 vue 語法+微信小程式 api,無額外學習成本
HBuilderX 是通用的前端開發工具,但為uni-app
做了特別強化。
下載 App 開發版,可開箱即用;如下載標準版,在執行或發行uni-app
時,會提示安裝uni-app
外掛,外掛下載完成後方可使用
選擇uni-app
型別,輸入工程名,選擇模板,點選建立,即可成功建立。
uni-app自帶的模板有 Hello uni-app ,是官方的元件和API範例。
還有一個重要模板是 uni ui專案模板,日常開發推薦使用該模板,已內建大量常用元件。
主要包括:瀏覽器執行、真機執行、小程式執行等
主要包括:雲端原生 APP 、離線原生 APP、H5、各種小程式
┌─components uni-app元件目錄 │ └─comp-a.vue 可複用的a元件 ├─hybrid 存放本地網頁的目錄(自建) ├─platforms 存放各平臺專用頁面的目錄(自建) ├─pages 業務頁面檔案存放的目錄 │ ├─index │ │ └─index.vue index頁面 │ └─list │ └─list.vue list頁面 ├─static 存放應用參照靜態資源(如圖片、視訊等)的目錄,注意:靜態資源只能存放於此 ├─wxcomponents 存放小程式元件的目錄(自建) ├─common 公共資源(自建) ├─api 請求封裝(自建) ├─store 狀態管理(自建) ├─main.js Vue初始化入口檔案 ├─App.vue 應用設定,用來設定App全域性樣式以及監聽 應用生命週期 ├─manifest.json 設定應用名稱、appid、logo、版本等打包資訊 └─pages.json 設定頁面路由、導覽列、索引標籤等頁面類資訊
提示
static
下目錄的 js 檔案不會被 webpack 編譯,裡面如果有 es6 的程式碼,不經過轉換直接執行,在手機裝置上會報錯。less、scss
等資源同樣不要放在 static
目錄下,建議這些公共的資源放在common
目錄下manifest.json
檔案是應用的組態檔,用於指定應用的名稱、圖示、許可權等,我們也可以在這裡為 Vue 為H5 設定跨域攔截處理器
vue.config.js
是一個可選的組態檔,如果專案的根目錄中存在這個檔案,那麼它會被自動載入,一般用於設定 webpack 等編譯選項。官方檔案
pages.json
檔案用來對 uni-app 進行全域性設定,決定頁面檔案的路徑、視窗樣式、原生的導航欄、底部的原生tabbar 等。它類似微信小程式中app.json
的頁面管理部分。
官方檔案
屬性 | 型別 | 必填 | 描述 |
---|---|---|---|
globalStyle | Object | 否 | 設定預設頁面的視窗表現 |
pages | Object Array | 是 | 設定頁面路徑及視窗表現 |
easycom | Object | 否 | 元件自動引入規則 |
tabBar | Object | 否 | 設定底部 tab 的表現 |
condition | Object | 否 | 啟動模式設定 |
subPackages | Object Array | 否 | 分包載入設定 |
preloadRule | Object | 否 | 分包預下載規則 |
uni.scss
檔案的用途是為了方便整體控制應用的風格。比如按鈕顏色、邊框風格,uni.scss
檔案裡預置了一批scss變數預置。官方檔案
uni-app
官方擴充套件外掛(uni ui)及 外掛市場 上很多三方外掛均使用了這些樣式變數,如果你是外掛開發者,建議你使用 scss 預處理,並在外掛程式碼中直接使用這些變數(無需 import 這個檔案),方便使用者通過搭積木的方式開發整體風格一致的App。
uni.scss
是一個特殊檔案,在程式碼中無需 import 這個檔案即可在scss程式碼中使用這裡的樣式變數。uni-app的編譯器在webpack設定中特殊處理了這個 uni.scss,使得每個 scss 檔案都被注入這個uni.scss,達到全域性可用的效果。如果開發者想要less、stylus的全域性使用,需要在vue.config.js中自行設定webpack策略。
App.vue
是uni-app的主元件,所有頁面都是在App.vue
下進行切換的,是頁面入口檔案。但App.vue
本身不是頁面,這裡不能編寫檢視元素。
這個檔案的作用包括:呼叫應用生命週期函數、設定全域性樣式、設定全域性的儲存globalData
應用生命週期僅可在App.vue
中監聽,在頁面監聽無效。
main.js
是uni-app的入口檔案,主要作用是初始化vue
範例、定義全域性元件、使用需要的外掛如vuex。
官方檔案
template 內約會靜態資源,如 image,video 等標籤的 src 屬性時,可以使用相對路徑或絕對路徑,形式如下:
<!-- 絕對路徑,/static指根目錄下的static目錄,在cli專案中/static指src目錄下的static目錄 --> <image class="logo" src="/static/logo.png"></image> <image class="logo" src="@/static/logo.png"></image> <!-- 相對路徑 --> <image class="logo" src="../../static/logo.png"></image>
注意
js 檔案或 script 標籤內,可以使用相對路徑和絕對路徑,形式如下:
// 絕對路徑,@指向專案根目錄,在cli專案中@指向src目錄 import add from '@/common/add.js' // 相對路徑 import add from '../../common/add.js'
css 檔案或 style 標籤內,可以使用相對路徑和絕對路徑,形式如下:
/* 絕對路徑 */ @import url('/common/uni.css'); @import url('@/common/uni.css'); /* 相對路徑 */ @import url('../../common/uni.css');
css 檔案或 style 標籤內參照的圖片路徑,可以使用相對路徑也可以使用絕對路徑,形式如下:
/* 絕對路徑 */ background-image: url(/static/logo.png); background-image: url(@/static/logo.png); /* 相對路徑 */ background-image: url(../../static/logo.png);
學習一個工具的目的核心是什麼?是為了解決核心業務邏輯問題,業務邏輯很多時候簡單的解釋一句話:「在合適的時機幹合適的事情」,OK!什麼是合適的時機呢?簡單的說,頁面執行過程中,各個階段的回撥函數就是頁面中的時機,我們也叫這個為「生命週期勾點函數」,當然,業務中我們也會寫到很多「回撥」的邏輯,這些回撥其實也是咱們自定義的時機,UniAPP 的生命週期勾點函數回撥函數有哪些呢?我們來理解一下!
uni-app
完整支援 Vue
範例的生命週期,同時還新增 應用生命週期 及 頁面生命週期。
函數名 | 說明 |
---|---|
onLaunch | 當uni-app 初始化完成時觸發(全域性只觸發一次) |
onShow | 當 uni-app 啟動,或從後臺進入前臺顯示 |
onHide | 當 uni-app 從前臺進入後臺 |
onError | 當 uni-app 報錯時觸發 |
onUniNViewMessage | 對 nvue 頁面傳送的資料進行監聽,可參考 nvue 向 vue 通訊 |
onUnhandledRejection | 對未處理的 Promise 拒絕事件監聽函數(2.8.1+) |
onPageNotFound | 頁面不存在監聽函數 |
onThemeChange | 監聽系統主題變化 |
函數名 | 說明 |
---|---|
onLoad | 監聽頁面載入,其引數為上個頁面傳遞的資料,引數型別為Object(用於頁面傳參),參考範例 |
onShow | 監聽頁面顯示。頁面每次出現在螢幕上都觸發,包括從下級頁面點返回露出當前頁面 |
onReady | 監聽頁面初次渲染完成。注意如果渲染速度快,會在頁面進入動畫完成前觸發 |
onHide | 監聽頁面隱藏 |
onUnload | 監聽頁面解除安裝 |
onResize | 監聽視窗尺寸變化 |
onPullDownRefresh | 監聽使用者下拉動作,一般用於下拉重新整理,參考範例 |
onReachBottom | 頁面捲動到底部的事件(不是scroll-view滾到底),常用於下拉下一頁資料。具體見下方注意事項 |
onTabItemTap | 點選 tab 時觸發,引數為Object,具體見下方注意事項 |
onShareAppMessage | 使用者點選右上角分享 |
onPageScroll | 監聽頁面捲動,引數為Object |
onNavigationBarButtonTap | 監聽原生標題列按鈕點選事件,引數為Object |
onBackPress | 監聽頁面返回 |
onNavigationBarSearchInputChanged | 監聽原生標題列搜尋輸入框輸入內容變化事件 |
onNavigationBarSearchInputConfirmed | 監聽原生標題列搜尋輸入框搜尋事件,使用者點選軟鍵盤上的「搜尋」按鈕時觸發。 |
onNavigationBarSearchInputClicked | 監聽原生標題列搜尋輸入框點選事件 |
onShareTimeline | 監聽使用者點選右上角轉發到朋友圈 |
onAddToFavorites | 監聽使用者點選右上角收藏 |
uni-app 頁面路由全部交給框架統一管理,開發者需要在pages.json裡設定每個路由頁面的路徑及頁面樣式(類似小程式在 app.json 中設定頁面路由)。
"pages": [ { "path": "pages/index", "style": { "navigationBarTitleText": "路由設定", "navigationBarBackgroundColor": "#FFFFFF", "navigationBarTextStyle": "black", "backgroundColor": "#FFFFFF", "enablePullDownRefresh": true } }, { "path": "pages/user", "style": { "navigationBarTitleText": "路由設定", "navigationBarBackgroundColor": "#FFFFFF", "navigationBarTextStyle": "black", "backgroundColor": "#FFFFFF", "enablePullDownRefresh": true } }]
uni-app
有兩種頁面路由跳轉方式:使用navigator元件跳轉(標籤式導航)、呼叫API跳轉(程式設計式導航)
框架以棧的形式管理當前所有頁面, 當發生路由切換的時候,頁面棧的表現如下:
路由方式 | 頁面棧表現 | 觸發時機 |
---|---|---|
初始化 | 新頁面入棧 | uni-app 開啟的第一個頁面 |
開啟新頁面 | 新頁面入棧 | 呼叫 API uni.navigateTo 、使用元件 <navigator open-type="navigate" /> |
頁面重定向 | 當前頁面出棧,新頁面入棧 | 呼叫 API uni.redirectTo 、 使用元件 |
頁面返回 | 頁面不斷出棧,直到目標返回頁 | 呼叫 API uni.navigateBack 、 使用元件 、 使用者按左上角返回按鈕、安卓使用者點選物理back按鍵 |
Tab 切換 | 頁面全部出棧,只留下新的 Tab 頁面 | 呼叫 API uni.switchTab 、 使用元件 、 使用者切換 Tab |
過載入 | 頁面全部出棧,只留下新的頁面 | 呼叫 API uni.reLaunch 、 使用元件 |
getCurrentPages() 函數用於獲取當前頁面棧的範例,以陣列形式按棧的順序給出,第一個元素為首頁,最後一個元素為當前頁面。
注意
: getCurrentPages() 僅用於展示頁面棧的情況,請勿修改頁面棧,以免造成頁面狀態錯誤。
說明:頁面生命週期的 onLoad()監聽頁面載入,其引數為上個頁面傳遞的資料,如:
//頁面跳轉並傳遞引數uni.navigateTo({ url: 'page2?name=liy&message=Hello'});
url為將要跳轉的頁面路徑 ,路徑後可以帶引數。引數與路徑之間使用?
分隔,引數鍵與引數值用=
相連,不同引數用&
分隔。如 ‘path?key1=value2&key2=value2’,path為下一個頁面的路徑,下一個頁面的onLoad函數可得到傳遞的引數。
// 頁面 2 接收引數 onLoad: function (option) { //option為object型別,會序列化上個頁面傳遞的引數 console.log(option.name); //列印出上個頁面傳遞的引數。 console.log(option.message); //列印出上個頁面傳遞的引數。 }
注意
:url 有長度限制,太長的字串會傳遞失敗,並且不規範的字元格式也可能導致傳遞失敗,所以對於複雜引數建議使用 encodeURI、decodeURI 進行處理後傳遞
因小程式有體積和資源載入限制,各家小程式平臺提供了分包方式,優化小程式的下載和啟動速度。
所謂的主包,即放置預設啟動頁面及 TabBar 頁面,而分包則是根據 pages.json 的設定進行劃分。
在小程式啟動時,預設會下載主包並啟動主包內頁面,當使用者進入分包內某個頁面時,會把對應分包自動下載下來,下載完成後再進行展示,此時終端介面會有等待提示。
"subPackages": [ { "root": "news", "pages": [{ "path": "index", "style": { "navigationBarTitleText": "新聞中心", "navigationBarBackgroundColor": "#FFFFFF", "navigationBarTextStyle": "black", "backgroundColor": "#FFFFFF" } } ] } ... ],// 預下載分包設定"preloadRule": { "pages/index": { "network": "all", "packages": ["activities"] }}
uni-app 為開發者提供了一系列基礎元件,類似 HTML 裡的基礎標籤元素,但 uni-app 的元件與 HTML 不同,而是與小程式相同,更適合手機端使用。
雖然不推薦使用 HTML 標籤,但實際上如果開發者寫了p
等標籤,在編譯到非H5平臺時也會被編譯器轉換為 view
標籤,類似的還有 span
轉 text
、a
轉navigator
等,包括 css 裡的元素選擇器也會轉,但為了管理方便、策略統一,新寫程式碼時仍然建議使用view等元件。
開發者可以通過組合這些基礎元件進行快速開發, 基於內建的基礎元件,可以開發各種擴充套件元件,元件規範與vue元件相同。
案例
:知心姐姐佈局實現
uni-app
的 js 程式碼,h5 端執行於瀏覽器中,非 h5 端 Android 平臺執行在 v8 引擎中,iOS 平臺執行在 iOS 自帶的 jscore 引擎中。所以,uni-app
的 jsAPI 由標準 ECMAScript 的 js API 和 uni 擴充套件 API 這兩部分組成。
ECMAScript 由 Ecma 國際管理,是基礎 js 語法。瀏覽器基於標準 js 擴充了window、document 等 js API;Node.js 基於標準 js 擴充了 fs 等模組;小程式也基於標準 js 擴充套件了各種 wx.xx、my.xx、swan.xx 的 API。
標準 ecmascript 的 API 非常多,比如:console、settimeout等等。
非 H5 端,雖然不支援 window、document、navigator 等瀏覽器的 js API,但也支援標準 ECMAScript。
開發者不要把瀏覽器裡的 js 等價於標準 js。
所以 uni-app 的非 H5 端,一樣支援標準 js,支援 if、for 等語法,支援字串、陣列、時間等變數及各種處理方法,僅僅是不支援瀏覽器專用物件。
案例
:知心姐姐聊天功能
元件是 vue
技術中非常重要的部分,元件使得與ui相關的輪子可以方便的製造和共用,進而使得vue使用者的開發效率大幅提升,在專案的component
目錄下存放元件,uni-app
只支援 vue
單檔案元件(.vue 元件)
元件可以使用「全域性註冊」和「頁面引入」兩種方式進行使用,使用分為三步:
匯入 import xxx from 'xxx'
註冊 Vue.use('xx',xx)
components:{ xxx }
使用 <xx />
父元件通過自定義屬性向子元件傳遞資料
子元件通過 props
接收父元件傳遞的資料
slot
分發給子元件slot
標籤上新增屬性,向父元件通訊資料,作用域插槽uni.$on
建立一個全域性事件uni.$emit
來觸發全域性事件,實現多元件見的資料通訊Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式儲存管理應用的所有元件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。
Vue多個元件之間需要共用資料或狀態。
import { mapState, mapActions} from 'vuex'export default { computed: { ...mapState(['loginState', 'userInfo']) }, methods: { ...mapActions(['userLoginAction', 'userLogoutAction']), }}
注意:配合使用 Storage 來實現重新整理頁面後狀態持續保持的業務需求
uni-app
可通過 process.env.NODE_ENV
判斷當前環境是開發環境還是生產環境,一般用於連線測試伺服器或生產伺服器的動態切換。
在HBuilderX 中,點選「執行」編譯出來的程式碼是開發環境,點選「發行」編譯出來的程式碼是生產環境
if(process.env.NODE_ENV === 'development'){ console.log('開發環境')}else{ console.log('生產環境')}
平臺判斷有2種場景,一種是在編譯期判斷,一種是在執行期判斷。
編譯期判斷編譯期判斷,即條件編譯,不同平臺在編譯出包後已經是不同的程式碼,
// #ifdef H5 alert("只有h5平臺才有alert方法")// #endif// 如上程式碼只會編譯到H5的發行包裡,其他平臺的包不會包含如上程式碼。
執行期判斷 執行期判斷是指程式碼已經打入包中,仍然需要在執行期判斷平臺,此時可使用 uni.getSystemInfoSync().platform
判斷使用者端環境是 Android、iOS 還是小程式開發工具
switch(uni.getSystemInfoSync().platform){ case 'android': console.log('執行Android上') break; case 'ios': console.log('執行iOS上') break; default: console.log('執行在開發者工具上') break;}
uni-app 已將常用的元件、JS API 封裝到框架中,開發者按照 uni-app 規範開發即可保證多平臺相容,大部分業務均可直接滿足,但每個平臺有自己的一些特性,因此會存在一些無法跨平臺的情況。
在 C 語言中,通過 #ifdef、#ifndef 的方式,為 windows、mac 等不同 os 編譯不同的程式碼。 uni-app
參考這個思路,為 uni-app
提供了條件編譯手段,在一個工程裡優雅的完成了平臺個性化實現。
條件編譯是用特殊的註釋作為標記,在編譯時根據這些特殊的註釋,將註釋裡面的程式碼編譯到不同平臺。
**寫法:**以 #ifdef 或 #ifndef 加 %PLATFORM% 開頭,以 #endif 結尾。
\#ifdef
:if defined 僅在某平臺存在\#ifndef
:if not defined 除了某平臺均存在%PLATFORM% 可取值如下:
值 | 平臺 |
---|---|
APP-PLUS | App |
APP-PLUS-NVUE | App nvue |
H5 | H5 |
MP-WEIXIN | 微信小程式 |
MP-ALIPAY | 支付寶小程式 |
MP-BAIDU | 百度小程式 |
MP-TOUTIAO | 位元組跳動小程式 |
MP-QQ | QQ小程式 |
MP-360 | 360小程式 |
MP | 微信小程式/支付寶小程式/百度小程式/位元組跳動小程式/QQ小程式/360小程式 |
QUICKAPP-WEBVIEW | 快應用通用(包含聯盟、華為) |
QUICKAPP-WEBVIEW-UNION | 快應用聯盟 |
QUICKAPP-WEBVIEW-HUAWEI | 快應用華為 |
推薦:《》
以上就是你必須瞭解的UniAPP入門知識整理的詳細內容,更多請關注TW511.COM其它相關文章!