uni-app跨平台框架官方教程


 

鏈接:https://ke.qq.com/course/343370

一、框架簡介基礎知識點

uniapp生命周期

onLaunch 當uniapp初始化完成時進行觸發,全局只觸發一次
onShow 當uniapp啟動或者從后台進入前台顯示
onHide 當uniapp從前台進入后台
onUniNViewMessage 對nvue頁面發送數據進行監聽

uniapp頁面生命周期

https://uniapp.dcloud.io/frame
參看文檔

路由

uni-app 有兩種路由跳轉方式:使用navigator組件跳轉、調用API跳轉。
1.打開新頁面,頁面重定向===》 調用 API uni.navigateTo 、使用組件 <navigator open-type="navigateTo"/>
2.頁面返回 調用 API uni.navigateBack 、使用組件 <navigator open-type="navigateBack"/> 、用戶按左上角返回按鈕、安卓用戶點擊物理back按鍵

3.Tab 切換 調用 API uni.switchTab 、使用組件 <navigator open-type="switchTab"/> 、用戶切換 Tab

4.重加載 調用 API uni.reLaunch 、使用組件 <navigator open-type="reLaunch"/>

Tips:

  • navigateTo, redirectTo 只能打開非 tabBar 頁面。
  • switchTab 只能打開 tabBar 頁面。
  • reLaunch 可以打開任意頁面。
  • 頁面底部的 tabBar 由頁面決定,即只要是定義為 tabBar 的頁面,底部都有 tabBar
  • 不能在 App.vue 里面進行頁面跳轉。

頁面樣式與布局

uni-app支持的通用css單位包括px、upx、vh。
upx 是相對於基准寬度的單位,可以根據屏幕寬度進行自適應。uni-app 規定屏幕基准寬度750upx。

upx2px

因為upx是編譯器處理的,動態綁定upx不生效
可使用 uni.upx2px(Number) 轉換為 px 后再賦值。
例如

 return uni.upx2px(750 / 2) + 'px'; 

樣式導入

使用@import語句可以導入外聯樣式表,@import后跟需要導入的外聯樣式表的相對路徑,用;表示語句結束。

@import "../../common/uni.css"; 

內聯樣式

1.style:靜態的樣式統一寫到 class 中。

<view :style="{color:color}" /> 
  1. class:用於指定樣式規則,其屬性值是樣式規則中類選擇器名(樣式類名)的集合,樣式類名不需要帶上.,樣式類名之間用空格分隔。
<view class="normal_view" /> 

選擇器

1 .class
2 #id
3 element 選擇所有 view 組件

全局樣式與局部樣式

定義在 App.vue 中的樣式為全局樣式,作用於每一個頁面。在 pages 目錄下 的 vue 文件中定義的樣式為局部樣式,只作用在對應的頁面,並會覆蓋 App.vue 中相同的選擇器。
注意: App.vue 中通過 @import 語句可以導入外聯樣式,一樣作用於每一個頁面。

CSS變量

CSS變量 描述 5+App 小程序 H5
--status-bar-height 系統狀態欄高度 系統狀態欄高度 25px 0
--window-top 內容區域距離頂部的距離 0 0 NavigationBar 的高度
--window-bottom 內容區域距離底部的距離 0 0 TabBar 的高度

固定值

uni-app 中以下組件的高度是固定的,不可修改:

組件 描述 5+App H5
NavigationBar 導航欄 44px 44px
TabBar 底部選項卡 56px 50px

Flex布局

為支持跨平台,框架建議使用Flex布局

背景圖片

uni-app 支持使用在 css 里設置背景圖片,使用方式與普通 web 項目相同,需要注意以下幾點:

  • 支持 base64 格式圖片。
  • 支持網絡路徑圖片。
  • 使用本地路徑背景圖片需注意:
    1. 圖片小於 40kb,uni-app 會自動將其轉化為 base64 格式;

    2. 圖片大於等於 40kb, 需開發者自己將其轉換為base64格式使用,或將其挪到服務器上,從網絡地址引用。

    3. 本地背景圖片的引用路徑僅支持以 ~@ 開頭的絕對路徑(不支持相對路徑)。

       .test2 { background-image: url('~@/static/logo.png'); } 

字體圖標

uni-app 支持使用字體圖標,使用方式與普通 web 項目相同,需要注意以下幾點:

  • 支持 base64 格式字體圖標。
  • 支持網絡路徑字體圖標。
  • 網絡路徑必須加協議頭 https
  • http://www.iconfont.cn 上拷貝的代碼,默認是沒加協議頭的。
  • uni-app 本地路徑圖標字體支持情況:
    1. 字體文件小於 40kb,uni-app 會自動將其轉化為 base64 格式;

    2. 字體文件大於等於 40kb, 需開發者自己轉換,否則使用將不生效;

    3. 字體文件的引用路徑僅支持以 ~@ 開頭的絕對路徑(不支持相對路徑)。

       @font-face { font-family: test1-icon; src: url('~@/static/iconfont.ttf'); } 

<template/>和 <block/>

uni-app 支持在 template 模板中嵌套 <template/><block/>,用來進行 列表渲染條件渲染

<template/><block/> 並不是一個組件,它們僅僅是一個包裝元素,不會在頁面中做任何渲染,只接受控制屬性。

代碼示例

<template> <view> <template v-if="test"> <view>test 為 true 時顯示</view> </template> <template v-else> <view>test 為 false 時顯示</view> </template> </view> </template> 
<template> <view> <block v-for="(item,index) in list" :key="index"> <view>{{item}} - {{index}}</view> </block> </view> </template> 

ES6 支持

uni-app 在支持絕大部分 ES6 API 的同時,也支持了 ES7 的 await/async。

NPM支持

uni-app支持使用npm安裝第三方包。

TypeScript 支持

在 uni-app 中使用 ts 開發

小程序組件支持

uni-app 支持在 5+App 和小程序中使用小程序組件

平台差異說明

平台 支持情況 小程序組件存放目錄
H5 不支持  
5+App 支持微信小程序組件 wxcomponents
微信小程序 支持微信小程序組件 wxcomponents
支付寶小程序 支持支付寶小程序組件 mycomponents
百度小程序 支持百度小程序組件 swancomponents

二、vue使用注意事項

uni-app 在發布到H5時支持所有vue的語法;發布到App和小程序時,由於平台限制,無法實現全部vue語法,但uni-app仍是是對vue語法支持度最高的跨端框架。本文將詳細講解差異。

生命周期

uni-app 完整支持 Vue 實例的生命周期,同時還新增 應用生命周期頁面生命周期

詳見Vue官方文檔:生命周期鈎子

注意

  • 不要在選項屬性或回調上使用箭頭函數,比如 created: () => console.log(this.a)vm.$watch('a', newValue => this.myMethod())。因為箭頭函數是和父級上下文綁定在一起的,this 不會是如你做預期的 Vue 實例,且 this.athis.myMethod 也會是未定義的。
  • 建議使用 uni-apponReady代替 vuemounted
  • 建議使用 uni-apponLoad 代替 vuecreated

模板語法

uni-app 完整支持 Vue 模板語法。

詳見Vue官方文檔:模板語法

注意 如果使用老版的非自定義組件模式,即manifest中"usingComponents":false,部分模版語法不支持,但此模式已不再推薦使用,詳見

老版非自定義組件模式不支持情況:

  • 不支持純 HTML
  • 不支持部分復雜的 JavaScript 渲染表達式
  • 不支持過濾器

data 屬性

data 必須聲明為返回一個初始數據對象的函數;否則頁面關閉時,數據不會自動銷毀,再次打開該頁面時,會顯示上次數據。

//正確用法,使用函數返回對象 data() { return { title: 'Hello' } } //錯誤寫法,會導致再次打開頁面時,顯示上次數據 data: { title: 'Hello' } 

全局變量

實現全局變量的方式需要遵循 Vue 單文件模式的開發規范。詳細參考:uni-app全局變量的幾種實現方式

lass 支持的語法:

<view :class="{ active: isActive }">111</view> <view class="static" v-bind:class="{ active: isActive, 'text-danger': hasError }">222</view> <view class="static" :class="[activeClass, errorClass]">333</view> <view class="static" v-bind:class="[isActive ? activeClass : '', errorClass]">444</view> <view class="static" v-bind:class="[{ active: isActive }, errorClass]">555</view> 

style 支持的語法:

<view v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }">666</view> <view v-bind:style="[{ color: activeColor, fontSize: fontSize + 'px' }]">777</view> 

非H5端不支持 Vue官方文檔:Class 與 Style 綁定 中的 classObjectstyleObject 語法。

不支持示例:

<template> <view :class="[activeClass]" :style="[baseStyles,overridingStyles]"></view> </template> <script> export default { data() { return { activeClass: { 'active': true, 'text-danger': false }, baseStyles: { color: 'green', fontSize: '30px' }, overridingStyles: { 'font-weight': 'bold' } } } } </script> 

注意:以:style=""這樣的方式設置px像素值,其值為實際像素,不會被編譯器轉換。

此外還可以用 computed 方法生成 class 或者 style 字符串,插入到頁面中,舉例說明:

<template> <!-- 支持 --> <view class="container" :class="computedClassStr"></view> <view class="container" :class="{active: isActive}"></view> <!-- 不支持 --> <view class="container" :class="computedClassObject"></view> </template> <script> export default { data () { return { isActive: true } }, computed: { computedClassStr () { return this.isActive ? 'active' : '' }, computedClassObject () { return { active: this.isActive } } } } </script> 

用在組件上

非H5端暫不支持在自定義組件上使用 ClassStyle 綁定

計算屬性

完整支持 Vue官方文檔:計算屬性

條件渲染

完整支持 Vue官方文檔:條件渲染

列表渲染

完整vue列表渲染 Vue官方文檔:列表渲染

key

如果列表中項目的位置會動態改變或者有新的項目添加到列表中,並且希望列表中的項目保持自己的特征和狀態(如 <input> 中的輸入內容,<switch> 的選中狀態),需要使用 :key 來指定列表中項目的唯一的標識符。

:key 的值以兩種形式提供

  • 使用 v-for 循環 arrayitem 的某個 property,該 property 的值需要是列表中唯一的字符串或數字,且不能動態改變。
  • 使用 v-for 循環中 item 本身,這時需要 item 本身是一個唯一的字符串或者數字

當數據改變觸發渲染層重新渲染的時候,會校正帶有 key 的組件,框架會確保他們被重新排序,而不是重新創建,以確保使組件保持自身的狀態,並且提高列表渲染時的效率。

如不提供 :key,會報一個 warning, 如果明確知道該列表是靜態,或者不必關注其順序,可以選擇忽略。

注意:

事件映射表中沒有的原生事件也可以使用,例如map組件的regionchange 事件直接在組件上寫成 @regionchange,同時這個事件也非常特殊,它的 event type 有 begin 和 end 兩個,導致我們無法在handleProxy 中區分到底是什么事件,所以你在監聽此類事件的時候同時監聽事件名和事件類型既 <map @regionchange="functionName" @end="functionName" @begin="functionName"><map>。
為兼容各端,事件需使用 v-on 或 @ 的方式綁定,請勿使用小程序端的bind 和 catch 進行事件綁定。
事件修飾符
.stop:各平台均支持, 使用時會阻止事件冒泡,在非 H5 端同時也會阻止事件的默認行為
.prevent 僅在 H5 平台支持
.self:僅在 H5 平台支持
.once:僅在 H5 平台支持
.capture:僅在 H5 平台支持
.passive:僅在 H5 平台支持
若需要禁止蒙版下的頁面滾動,可使用 @touchmove.stop.prevent="moveHandle",moveHandle 可以用來處理 touchmove 的事件,也可以是一個空函數。
<view class="mask" @touchmove.stop.prevent="moveHandle"></view>
按鍵修飾符:uni-app運行在手機端,沒有鍵盤事件,所以不支持按鍵修飾符。

表單控件綁定

支持 Vue官方文檔:表單控件綁定

建議開發過程中直接使用 uni-app:表單組件

組件

Vue 組件

組件是整個 Vue.js 中最復雜的部分,支持 Vue官方文檔:組件

有且只能使用單文件組件(.vue 組件)的形式進行支持。其他的諸如:動態組件,自定義 render,和<script type="text/x-template"> 字符串模版等非H5端都不支持。

uni-app組件

uni-app 提供了豐富的UI組件,比如: picker,map 等,需要注意的是原生組件上的事件綁定,需要以 vue 的事件綁定語法來綁定,如 bindchange="eventName" 事件,需要寫成 @change="eventName"

示例

<picker mode="date" :value="date" start="2015-09-01" end="2017-09-01" @change="bindDateChange"> <view class="picker"> 當前選擇: {{date}} </view> </picker> 

全局組件

uni-app 支持配置全局組件,需在 main.js 里進行全局注冊,注冊后就可在所有頁面里使用該組件。

注意Vue.component 的第一個參數必須是靜態的字符串。

示例

main.js 里進行全局注冊

import Vue from 'vue' import pageHead from './components/page-head.vue' Vue.component('page-head',pageHead) 

index.vue 里可直接使用組件

<template> <view> <page-head></page-head> </view> </template> 

常見問題

  1. 如何獲取上個頁面傳遞的數據
  2. 如何設置全局的數據和全局的方法
  3. 如何捕獲 app 的 onError
  4. 組件屬性設置不生效解決辦法

使用nvue Weex注意事項

使用HTML5+注意事項

條件編譯

條件編譯是里用特殊的注釋作為標記,在編譯時根據這些特殊的注釋,將注釋里面的代碼編譯到不同平台。

寫法:以 #ifdef 或 #ifndef 加** %PLATFORM%** 開頭,以 #endif 結尾。

API 的條件編譯

// #ifdef  %PLATFORM%
平台特有的API實現
// #endif

組件的條件編譯

pages.json 的條件編譯

static 目錄的條件編譯

+性能優化建議

+uni-app跨端開發注意事項

+高效開發技巧

- 使用代碼塊直接創建組件模板

為提升開發效率,HBuilderX將 uni-app 常用代碼封裝成了以 u 開頭的代碼塊,如在 template 標簽內輸入 ulist 回車,會自動生成如下代碼:

<view class="uni-list"> <view class="uni-list-cell"> <view class="uni-list-cell-navigate uni-navigate-right" v-for="(item,index) in list" :key="index"> {{item.value}} </view> </view> </view> 

代碼塊分為Tag代碼塊、JS代碼塊,如在 script 標簽內輸入 uShowToast 回車,會自動生成如下代碼:

uni.showToast({ title: '', mask: false duration: 1500 }); 

uni-app已支持代碼塊見下方列表。

Tag代碼塊

uButton
uCheckbox
uGrid
uList
uListMedia
uRadio
uSwiper

JS代碼塊

uRequest
uGetLocation
uShowToast
uShowLoading
uHideLoading
uShowModal
uShowActionSheet
uNavigateTo
uNavigateBack
uRedirectTo
uStartPullDownRefresh
uStopPullDownRefresh
uLogin
uShare
uPay

- 使用 Chrome 調試

- 使用各家小程序開發工具調試

- 關於 App 的調試

+常見問題

uni-app 中可使用的 UI 框架:http://ask.dcloud.net.cn/article/35489

uni-app App整包升級檢測: https://ask.dcloud.net.cn/article/34972

uni-app 資源熱更新: https://ask.dcloud.net.cn/article/35667

uni-app 導航欄開發指南: https://ask.dcloud.net.cn/article/34921

uni-app 實現全局變量: https://ask.dcloud.net.cn/article/35021

微信小程序轉換uni-app指南:https://ask.dcloud.net.cn/article/35786

mpvue 項目(組件)遷移指南、示例及資源匯總: https://ask.dcloud.net.cn/article/34945

uni-app 引用 npm 第三方庫: https://ask.dcloud.net.cn/article/19727

uni-app 中使用微信小程序第三方 SDK 及資源匯總:https://ask.dcloud.net.cn/article/35070

uni-app 中使用 5+ 的原生界面控件(包括map、video、livepusher、barcode、nview):https://ask.dcloud.net.cn/article/35036

uni-app 的 H5 版使用注意事項:https://ask.dcloud.net.cn/article/35232

uni-app各環節(HBuilderX、cli、自定義基座、本地sdk、雲打包引擎)版本兼容性說明:https://ask.dcloud.net.cn/article/35845

uni-app 中選擇和上傳非圖像、視頻文件:https://ask.dcloud.net.cn/article/35547

=============================================

模版語法和數據綁定

實例

1.請求數據,把數據data存儲入news數組,頁面模版自動刷新列表

            uni.request({ url: 'https://unidemo.dcloud.net.cn/api/news', method: 'GET', data: {}, success: res => { console.log(res); this.news = res.data; }, fail: () => {}, complete: () => {} }); 

2.點擊傳入文章id,通過uni.navigateTo url+id 打開文章頁

          @tap="tapnews" :data-newsid="item.post_id" tapnews(e){ console.log(e); var newsids= e.currentTarget.dataset.newsid; console.log(newsids); uni.navigateTo({ url: '../info/info?newsid='+ newsids }); } 

3.顯示文章頁面

            uni.request({ url: 'https://unidemo.dcloud.net.cn/api/news/36kr/'+ e.newsid, method: 'GET', data: {}, success: res => { this.title = res.data.title; this.strings = res.data.content; console.log(strings); uni.hideLoading(); }, fail: () => {}, complete: () => {} }); 

4. 根目錄的pages.json嚴格模式可以跳轉自定義頁面測試

    "condition": { //模式配置,僅開發期間生效 "current": 0, //當前激活的模式(list 的索引項) "list": [{ "name": "news", //模式名稱 "path": "pages/info/info", //啟動頁面,必選 "query": "newsid=5196737" //啟動參數,在頁面的onLoad函數里面得到。 } ] }



作者:Neyo_涼
鏈接:https://www.jianshu.com/p/132a3de98238


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM