一种蝶、快速上手
1傀顾、通過(guò)hbuilderX可視化界面
1.1、 hbuilderX下載
1.2贱鄙、下載完成之后創(chuàng)建、運(yùn)行uni-app
-
點(diǎn)擊工具欄的文件》新建》項(xiàng)目
image.png -
選擇
uni-app
類型姨谷,輸入工程名逗宁,選擇模板,點(diǎn)擊創(chuàng)建梦湘,即可創(chuàng)建成功
image.png -
在微信開(kāi)發(fā)者工具里面運(yùn)行瞎颗。進(jìn)行所創(chuàng)建的項(xiàng)目件甥,點(diǎn)擊工具欄運(yùn)行》運(yùn)行到小程序模擬器》微信開(kāi)發(fā)者工具,即可在微信開(kāi)發(fā)者工具里面體驗(yàn)
uni-app
image.png
首次使用需要配置小程序ide的相關(guān)路徑哼拔,才可運(yùn)行成功引有。
uni-app
默認(rèn)把項(xiàng)目編譯到根目錄的unpackage目錄。
image.png -
在微信開(kāi)發(fā)者工具導(dǎo)入項(xiàng)目時(shí)發(fā)現(xiàn)報(bào):請(qǐng)選擇含app.json / project.config.json的目錄
image.png
目錄顯示如下:image.png
解決:選擇含app.js文件倦逐,如圖:
image.png
2譬正、通過(guò)vue-cli命令行
- 環(huán)境安裝
// 全局安裝vue-cli
npm install -g @vue/cli
- 創(chuàng)建
uni-app
// 使用正式版(對(duì)應(yīng)HBuilderX最新正式版)
vue create -p dcloudio/uni-preset-vue my-project
// 使用alpha版(對(duì)應(yīng)HBuilderX最新alpha版)
vue create -p dcloudio/uni-preset-vue#alpha my-alpha-project
- 運(yùn)行、發(fā)布
uni-app
npm run dev:%PLATFORM%
npm run build:%PLATFORM%
%PLATFORM%
可取值如下:
值 | 平臺(tái) |
---|---|
app-plus | app平臺(tái)生成打包資源(僅支持npm run build:app-plus檬姥,也就是App平臺(tái)運(yùn)行調(diào)試不支持cli方式曾我,需在HBuilderX中運(yùn)行調(diào)試) |
h5 | H5 |
mp-alipay | 支付寶小程序 |
mp-baidu | 百度小程序 |
mp-weixin | 微信小程序 |
mp-toutiao | 字節(jié)跳動(dòng)小程序 |
mp-qq | qq 小程序 |
mp-360 | 360 小程序 |
quickapp-webview | 快應(yīng)用通用 |
quickapp-webview-union | 快應(yīng)用聯(lián)盟 |
quickapp-webview-huawei | 快應(yīng)用華為 |
二、框架
1健民、目錄結(jié)構(gòu)
2抒巢、生命周期
- 應(yīng)用生命周期:
函數(shù)名 | 說(shuō)明 |
---|---|
onLaunch | 當(dāng)uni-app 初始化完成時(shí)觸發(fā)(全局只觸發(fā)一次) |
onShow | 當(dāng) uni-app 啟動(dòng),或從后臺(tái)進(jìn)入前臺(tái)顯示 |
onHide | 當(dāng) uni-app 從前臺(tái)進(jìn)入后臺(tái) |
onError | 當(dāng) uni-app 報(bào)錯(cuò)時(shí)觸發(fā) |
onUniNViewMessage | 對(duì) nvue 頁(yè)面發(fā)送的數(shù)據(jù)進(jìn)行監(jiān)聽(tīng)秉犹,可參考 nvue 向 vue 通訊
|
onUnhandledRejection | 對(duì)未處理的 Promise 拒絕事件監(jiān)聽(tīng)函數(shù)(暫時(shí)只支持 CLI 創(chuàng)建的項(xiàng)目使用 CLI 工程蛉谜,更新 uni 相關(guān)版本到 2.0.0-alpha-28020200701003 即可支持 onShareTimeline) |
- 頁(yè)面生命周期
函數(shù)名 | 說(shuō)明 | 平臺(tái)差異說(shuō)明 | 最低版本 |
---|---|---|---|
onLoad | 監(jiān)聽(tīng)頁(yè)面加載,其參數(shù)為上個(gè)頁(yè)面?zhèn)鬟f的數(shù)據(jù)凤优,參數(shù)類型為Object(用于頁(yè)面?zhèn)鲄ⅲ┰寐瑓⒖?a target="_blank">示例 | ||
onShow | 監(jiān)聽(tīng)頁(yè)面顯示。頁(yè)面每次出現(xiàn)在屏幕上都觸發(fā)筑辨,包括從下級(jí)頁(yè)面點(diǎn)返回露出當(dāng)前頁(yè)面 | ||
onReady | 監(jiān)聽(tīng)頁(yè)面初次渲染完成俺驶。注意如果渲染速度快,會(huì)在頁(yè)面進(jìn)入動(dòng)畫(huà)完成前觸發(fā) | ||
onHide | 監(jiān)聽(tīng)頁(yè)面隱藏 | ||
onUnload | 監(jiān)聽(tīng)頁(yè)面卸載 | ||
onResize | 監(jiān)聽(tīng)窗口尺寸變化 | App棍辕、微信小程序 | |
onPullDownRefresh | 監(jiān)聽(tīng)用戶下拉動(dòng)作暮现,一般用于下拉刷新,參考示例 | ||
onReachBottom | 頁(yè)面上拉觸底事件的處理函數(shù) | ||
onTabItemTap | 點(diǎn)擊 tab 時(shí)觸發(fā)楚昭,參數(shù)為Object栖袋,具體見(jiàn)下方注意事項(xiàng) | 微信小程序、百度小程序抚太、H5塘幅、App(自定義組件模式) | |
onShareAppMessage | 用戶點(diǎn)擊右上角分享 | 微信小程序、百度小程序尿贫、字節(jié)跳動(dòng)小程序电媳、支付寶小程序 | |
onPageScroll | 監(jiān)聽(tīng)頁(yè)面滾動(dòng),參數(shù)為Object | ||
onNavigationBarButtonTap | 監(jiān)聽(tīng)原生標(biāo)題欄按鈕點(diǎn)擊事件庆亡,參數(shù)為Object | 5+ App匾乓、H5 | |
onBackPress | 監(jiān)聽(tīng)頁(yè)面返回,返回 event = {from:backbutton又谋、 navigateBack} 拼缝,backbutton 表示來(lái)源是左上角返回按鈕或 android 返回鍵娱局;navigateBack表示來(lái)源是 uni.navigateBack ;詳細(xì)說(shuō)明及使用:onBackPress 詳解 | App咧七、H5 | |
onNavigationBarSearchInputChanged | 監(jiān)聽(tīng)原生標(biāo)題欄搜索輸入框輸入內(nèi)容變化事件 | App衰齐、H5 | 1.6.0 |
onNavigationBarSearchInputConfirmed | 監(jiān)聽(tīng)原生標(biāo)題欄搜索輸入框搜索事件,用戶點(diǎn)擊軟鍵盤(pán)上的“搜索”按鈕時(shí)觸發(fā)猪叙。 | App娇斩、H5 | 1.6.0 |
onNavigationBarSearchInputClicked | 監(jiān)聽(tīng)原生標(biāo)題欄搜索輸入框點(diǎn)擊事件 | App、H5 | 1.6.0 |
onShareTimeline | 監(jiān)聽(tīng)用戶點(diǎn)擊右上角轉(zhuǎn)發(fā)到朋友圈(暫時(shí)只支持 CLI 創(chuàng)建的項(xiàng)目) | 微信小程序 | 使用 CLI 工程穴翩,更新 uni 相關(guān)版本到 2.0.0-alpha-28020200701003 即可支持 onShareTimeline |
onAddToFavorites | 監(jiān)聽(tīng)用戶點(diǎn)擊右上角收藏(暫時(shí)只支持 CLI 創(chuàng)建的項(xiàng)目) | 微信小程序 | 使用 CLI 工程犬第,更新 uni 相關(guān)版本到 2.0.0-alpha-28020200701003 即可支持 onShareTimeline |
3、路由
路由方式 | 頁(yè)面棧表現(xiàn) | 觸發(fā)時(shí)機(jī) |
---|---|---|
初始化 | 新頁(yè)面入棧 | uni-app 打開(kāi)的第一個(gè)頁(yè)面 |
打開(kāi)新頁(yè)面 | 新頁(yè)面入棧 | 調(diào)用 API uni.navigateTo 芒帕、使用組件 <navigator open-type="navigate"/> |
頁(yè)面重定向 | 當(dāng)前頁(yè)面出棧歉嗓,新頁(yè)面入棧 | 調(diào)用 API uni.redirectTo 、使用組件 <navigator open-type="redirectTo"/> |
頁(yè)面返回 | 頁(yè)面不斷出棧背蟆,直到目標(biāo)返回頁(yè) | 調(diào)用 API uni.navigateBack 鉴分、使用組件 <navigator open-type="navigateBack"/> 、用戶按左上角返回按鈕带膀、安卓用戶點(diǎn)擊物理back按鍵 |
Tab 切換 | 頁(yè)面全部出棧志珍,只留下新的 Tab 頁(yè)面 | 調(diào)用 API uni.switchTab 、使用組件 <navigator open-type="switchTab"/> 垛叨、用戶切換 Tab |
重加載 | 頁(yè)面全部出棧伦糯,只留下新的頁(yè)面 | 調(diào)用 API uni.reLaunch 、使用組件 <navigator open-type="reLaunch"/> |
4嗽元、運(yùn)行環(huán)境判斷
- 開(kāi)發(fā)環(huán)境和運(yùn)行環(huán)境可以通過(guò)
process.env.NODE_ENV
來(lái)判斷敛纲。一般用于連接測(cè)試服務(wù)器或生產(chǎn)服務(wù)器的動(dòng)態(tài)切換。
if(process.env.NODE_ENV === 'development'){
console.log('開(kāi)發(fā)環(huán)境')
}else{
console.log('生產(chǎn)環(huán)境')
}
- 判斷平臺(tái)
-- 編譯期判斷
// 編譯期判斷 編譯期判斷剂癌,即條件編譯淤翔,不同平臺(tái)在編譯出包后已經(jīng)是不同的代碼
// #ifdef H5
alert("只有h5平臺(tái)才有alert方法")
// #endif
// 如上代碼只會(huì)編譯到H5的發(fā)行包里,其他平臺(tái)的包不會(huì)包含如上代碼佩谷。
-- 運(yùn)行期編譯
運(yùn)行期判斷是指代碼已經(jīng)打入包中旁壮,仍然需要在運(yùn)行期判斷平臺(tái),此時(shí)可使用uni.getSystemInfoSync().platform
判斷客戶端環(huán)境是 Android谐檀、iOS 還是小程序開(kāi)發(fā)工具(在百度小程序開(kāi)發(fā)工具抡谐、微信小程序開(kāi)發(fā)工具、支付寶小程序開(kāi)發(fā)工具中使用 uni.getSystemInfoSync().platform
返回值均為 devtools)
switch(uni.getSystemInfoSync().platform){
case 'android':
console.log('運(yùn)行Android上')
break;
case 'ios':
console.log('運(yùn)行iOS上')
break;
default:
console.log('運(yùn)行在開(kāi)發(fā)者工具上')
break;
}
5稚补、頁(yè)面樣式與布局
- 尺寸單位(屏幕像素=px童叠,響應(yīng)式px=rpx)
uni-app寬度計(jì)算公式為:750 * 元素在設(shè)計(jì)稿中的寬度 / 設(shè)計(jì)稿基準(zhǔn)寬度
- 樣式導(dǎo)入(
@import "../../common/uni.css";
) - 內(nèi)聯(lián)樣式(支持使用 style框喳、class 屬性來(lái)控制組件的樣式)
- 支持的選擇器(
.class
#id
element
::after
::before
) - 全局樣式和局部樣式
定義在 App.vue 中的樣式為全局樣式课幕,作用于每一個(gè)頁(yè)面厦坛。在 pages 目錄下 的 vue 文件中定義的樣式為局部樣式,只作用在對(duì)應(yīng)的頁(yè)面乍惊,并會(huì)覆蓋 App.vue 中相同的選擇器杜秸。(nvue頁(yè)面暫不支持全局樣式) - css變量
CSS變量 | 描述 | App | 小程序 | H5 |
---|---|---|---|---|
--status-bar-height | 系統(tǒng)狀態(tài)欄高度 | 系統(tǒng)狀態(tài)欄高度、nvue注意見(jiàn)下 | 25px | 0 |
--window-top | 內(nèi)容區(qū)域距離頂部的距離 | 0 | 0 | NavigationBar 的高度 |
--window-bottom | 內(nèi)容區(qū)域距離底部的距離 | 0 |
- 固定值
組件 | 描述 | App | H5 |
---|---|---|---|
NavigationBar | 導(dǎo)航欄 | 44px | 44px |
TabBar | 底部選項(xiàng)卡 | HBuilderX 2.3.4之前為56px润绎,2.3.4起和H5調(diào)為一致撬碟,統(tǒng)一為 50px。但可以自主更改高度) | 50px |
- flex布局
- Flex 布局是什么莉撇?
Flex 是 Flexible Box 的縮寫(xiě)呢蛤,意為"彈性布局",用來(lái)為盒狀模型提供最大的靈活性棍郎。 - 基本概念
采用 Flex 布局的元素其障,稱為 Flex 容器(flex container),簡(jiǎn)稱"容器"涂佃。它的所有子元素自動(dòng)成為容器成員励翼,稱為 Flex 項(xiàng)目(flex item),簡(jiǎn)稱"項(xiàng)目"辜荠。
image
容器默認(rèn)存在兩根軸:水平的主軸(main axis)和垂直的交叉軸(cross axis)汽抚。主軸的開(kāi)始位置(與邊框的交叉點(diǎn))叫做main start
,結(jié)束位置叫做main end
伯病;交叉軸的開(kāi)始位置叫做cross start
造烁,結(jié)束位置叫做cross end
。
項(xiàng)目默認(rèn)沿主軸排列狱从。單個(gè)項(xiàng)目占據(jù)的主軸空間叫做main size
膨蛮,占據(jù)的交叉軸空間叫做cross size
。 - 容器的屬性
flex-direction
決定主軸的方向(即項(xiàng)目的排列方向)
- Flex 布局是什么莉撇?
.box {
flex-direction: row | row-reverse | column | column-reverse;
}
// row(默認(rèn)值):主軸為水平方向季研,起點(diǎn)在左端敞葛。
// row-reverse:主軸為水平方向,起點(diǎn)在右端与涡。
// column:主軸為垂直方向惹谐,起點(diǎn)在上沿。
// column-reverse:主軸為垂直方向驼卖,起點(diǎn)在下沿氨肌。
flex-wrap
默認(rèn)情況下,項(xiàng)目都排在一條線(又稱"軸線")上
.box{
flex-wrap: nowrap | wrap | wrap-reverse;
}
// nowrap(默認(rèn)):不換行酌畜。
// wrap:換行怎囚,第一行在上方。
// wrap-reverse:換行,第一行在下方恳守。
flex-flow
是flex-direction
屬性和flex-wrap
屬性的簡(jiǎn)寫(xiě)形式考婴,默認(rèn)值為row nowrap
。
.box {
flex-flow: <flex-direction> || <flex-wrap>;
}
justify-content
定義了項(xiàng)目在主軸上的對(duì)齊方式催烘。
.box {
justify-content: flex-start | flex-end | center | space-between | space-around;
}
// flex-start(默認(rèn)值):左對(duì)齊
// flex-end:右對(duì)齊
// center: 居中
// space-between:兩端對(duì)齊沥阱,項(xiàng)目之間的間隔都相等。
// space-around:每個(gè)項(xiàng)目?jī)蓚?cè)的間隔相等伊群。所以考杉,項(xiàng)目之間的間隔比項(xiàng)目與邊框的間隔大一倍。
align-items
定義項(xiàng)目在交叉軸上如何對(duì)齊舰始。
.box {
align-items: flex-start | flex-end | center | baseline | stretch;
}
// flex-start:交叉軸的起點(diǎn)對(duì)齊崇棠。
// flex-end:交叉軸的終點(diǎn)對(duì)齊。
// center:交叉軸的中點(diǎn)對(duì)齊丸卷。
// baseline: 項(xiàng)目的第一行文字的基線對(duì)齊易茬。
// stretch(默認(rèn)值):如果項(xiàng)目未設(shè)置高度或設(shè)為auto,將占滿整個(gè)容器的高度及老。
align-content
定義了多根軸線的對(duì)齊方式抽莱。如果項(xiàng)目只有一根軸線,該屬性不起作用
.box {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
// flex-start:與交叉軸的起點(diǎn)對(duì)齊骄恶。
// flex-end:與交叉軸的終點(diǎn)對(duì)齊食铐。
// center:與交叉軸的中點(diǎn)對(duì)齊。
// space-between:與交叉軸兩端對(duì)齊僧鲁,軸線之間的間隔平均分布虐呻。
// space-around:每根軸線兩側(cè)的間隔都相等。所以寞秃,軸線之間的間隔比軸線與邊框的間隔大一倍斟叼。
// stretch(默認(rèn)值):軸線占滿整個(gè)交叉軸。
- 項(xiàng)目的屬性
order
定義項(xiàng)目的排列順序春寿。數(shù)值越小朗涩,排列越靠前,默認(rèn)為0
.item {
order: <integer>;
}
flex-grow
定義項(xiàng)目的放大比例绑改,默認(rèn)為0谢床,即如果存在剩余空間,也不放大厘线。
.item {
flex-grow: <number>; /* default 0 */
}
flex-shrink
定義了項(xiàng)目的縮小比例识腿,默認(rèn)為1,即如果空間不足造壮,該項(xiàng)目將縮小渡讼。
.item {
flex-shrink: <number>; /* default 1 */
}
flex-basis
定義了在分配多余空間之前,項(xiàng)目占據(jù)的主軸空間(main size)。瀏覽器根據(jù)這個(gè)屬性成箫,計(jì)算主軸是否有多余空間栖雾。它的默認(rèn)值為auto,即項(xiàng)目的本來(lái)大小伟众。
.item {
flex-basis: <length> | auto; /* default auto */
}
flex
是flex-grow, flex-shrink 和 flex-basis的簡(jiǎn)寫(xiě),默認(rèn)值為0 1 auto召廷。后兩個(gè)屬性可選凳厢。
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
align-self
允許單個(gè)項(xiàng)目有與其他項(xiàng)目不一樣的對(duì)齊方式,可覆蓋align-items屬性竞慢。默認(rèn)值為auto先紫,表示繼承父元素的align-items屬性,如果沒(méi)有父元素筹煮,則等同于stretch遮精。
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
- 背景圖片
- 支持在css里設(shè)置背景圖片
- 本地背景圖片的引用路徑推薦使用以 ~@ 開(kāi)頭的絕對(duì)路徑
.test2 {
background-image: url('~@/static/logo.png');
}
- 字體圖標(biāo)(字體圖標(biāo),使用方式與普通 web 項(xiàng)目相同)
6败潦、小程序組件支持
- 使用方法
// 在pages.json 對(duì)應(yīng)頁(yè)面的 style -> usingComponents 引入組件:
{
"pages": [
{
"path": "index/index",
"style": {
"usingComponents": {
// #ifdef APP-PLUS || MP-WEIXIN || MP-QQ
"custom": "/wxcomponents/custom/index"
// #endif
// #ifdef MP-BAIDU
"custom": "/swancomponents/custom/index"
// #endif
// #ifdef MP-ALIPAY
"custom": "/mycomponents/custom/index"
// #endif
}
}
}
]
}
// 在頁(yè)面中使用
<!-- 頁(yè)面模板 (index.vue) -->
<view>
<!-- 在頁(yè)面中對(duì)自定義組件進(jìn)行引用 -->
<custom name="uni-app"></custom>
</view>