uni-app----白話及入門
傳統的h5只有1端,即瀏覽器。而uni-app可跨多端,雖仍屬前端,與傳統h5有不同。
如果你對h5比較瞭解,可通過本文快速瞭解uni-app。
網路模型的變化
以前網頁大多是b/s,服務端程式碼混合在頁面裡;
現在是c/s,前後端分離,通過js api(類似ajax的uni.request)獲取json資料,把資料繫結在介面上渲染。
檔案型別變化
以前是.html檔案,開發也是html,執行也是html。
現在是.vue檔案,開發是vue,經過編譯後,執行時已經變成了js檔案。
現代前端開發,很少直接使用HTML,基本都是開發、編譯、執行。所以uni-app有編譯器、執行時的概念。
檔案內程式碼架構的變化
以前一個html大節點,裡面有script和style節點;
現在template是一級節點,用於寫tag元件,script和style是並列的一級節點,也就是有3個一級節點。
以前
複製程式碼<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script type="text/javascript">
</script>
<style type="text/css">
</style>
</head>
<body>
</body>
</html>
現在。這個叫vue單檔案元件規範sfc
複製程式碼<template>
<view>
注意必須有一個view,且只能有一個根view。所有內容寫在這個view下面。
</view>
</template>
<script>
export default {
}
</script>
<style>
</style>
外部檔案引用方式變化
以前通過script src、link href引入外部的js和css;
現在是es6的寫法,import引入外部的js模組(注意不是檔案)或css
以前
複製程式碼<script src="js/jquery-1.10.2.js" type="text/javascript"></script>
<link href="css/bootstrap.css" rel="stylesheet" type="text/css"/>
現在
js要require進來,變成了物件。
在hello uni-app的common目錄有一個工具類util.js
,可以在hello uni-app中搜索這個例子檢視。
複製程式碼<script>
var util = require('../../../common/util.js'); //require這個js模組
var formatedPlayTime = util.formatTime(playTime); //呼叫js模組的方法
</script>
而在這個util.js
裡,要把之前的function封裝為物件的方法
複製程式碼function formatTime(time) {
return time;//這裡沒寫邏輯
}
module.exports = {
formatTime: formatTime
}
當然還有一些高階的用法
複製程式碼var dateUtils = require('../../../common/util.js').dateUtils; //直接使用js模組的屬性。在hello uni-app有示例
import * as echarts from '/components/echarts/echarts.simple.min.js'; //將js匯入並重命名為echarts,然後使用echarts.來繼續執行方法。在hello uni-app有示例
css外部檔案匯入
複製程式碼<style>
@import "./common/uni.css";
.uni-hello-text{
color:#7A7E83;
}
</style>
全域性樣式,在根目錄下的app.vue裡寫入,每個頁面都會載入app.vue裡的樣式。
另外,vue支援元件匯入,可以更方便的封裝一個包括介面、js、樣式的庫。
如下是匯入一個角標的元件庫,在頁面上顯示一個abc並且右上角有個數字角標1,詳見
複製程式碼<template>
<view>
<uni-badge text="abc" :inverted="true"></uni-badge><!--3.使用元件-->
</view>
</template>
<script>
import uniBadge from "../../../components/uni-badge.vue";//1.匯入元件(這步屬於傳統vue規範,但在uni-app的easycom下可以省略這步)
export default {
data() {
return {
}
},
components: {
uniBadge //2.註冊元件(這步屬於傳統vue規範,但在uni-app的easycom下可以省略這步)
}
}
</script>
如需要全域性匯入vue元件,即每個頁面都可以直接使用而不用引用和註冊的話,在專案根目錄下的main.js裡處理。如下是hello uni-app裡的例子。
複製程式碼//main.js
import pageHead from './components/page-head.vue' //匯入
Vue.component('page-head', pageHead) //註冊。註冊後在每個vue的page頁面裡可以直接使用<page-head></page-head>元件。
上述的元件使用方式屬於傳統vue的概念。uni-app 2.7以後推出了更簡單的元件使用技術easycom,無需引用和註冊元件,直接在template區域使用元件即可。
元件/標籤的變化
以前是html標籤,比如<div>
,現在是小程式元件,比如<view>
。
那麼標籤
和元件
有什麼區別,不都是用尖括號包圍起來一段英文嗎?
其實標籤是老的概念,標籤屬於瀏覽器內建的東西。但元件,是可以自由擴充套件的。
類似你可以把一段js封裝成函式或模組,你也可以把一個ui控制元件封裝成一個元件。
uni-app
參考小程式規範,提供了一批內建元件。
下為html標籤和uni-app內建元件的對映表:
- div 改成 view
- span、font 改成 text
- a 改成 navigator
- img 改成 image
- input 僅僅是輸入框。 原html規範中input不僅是輸入框,還有radio、checkbox、時間、日期、檔案選擇功能。在uni-app和小程式規範中,input僅僅是輸入框。其他功能uni-app有單獨的元件或API:radio元件、checkbox元件、時間選擇、日期選擇、圖片選擇、視訊選擇、多媒體檔案選擇(含圖片視訊)、通用檔案選擇。
- form、button、label、textarea、canvas、video 這些還在。
- select 改成 picker
- iframe 改成 web-view
- ul、li沒有了,都用view替代。做列表一般使用uList元件
- audio 不再推薦使用,改成api方式,背景音訊api文件
其實老的HTML標籤也可以在uni-app裡使用,uni-app編譯器會在編譯時把老標籤轉為新標籤,比如把div編譯成view。但不推薦這種用法,除錯H5端時容易混亂。
除了改動外,新增了一批手機端常用的新元件
- scroll-view 可區域滾動檢視容器
- swiper 可滑動區域檢視容器
- icon 圖示
- rich-text 富文字(不可執行js,但可渲染各種文字格式和圖片)
- progress 進度條
- slider 滑塊指示器
- switch 開關選擇器
- camera 相機
- live-player 直播
- map 地圖
-
cover-view 可覆蓋原生元件的檢視容器
cover-view需要多強調幾句,uni-app的非h5端的video、map、canvas、textarea是原生元件,層級高於其他元件。如需覆蓋原生元件,則需要使用cover-view元件。詳見層級介紹
除了內建元件,還有很多開源的擴充套件元件,把常用操作都進行封裝,DCloud建立了外掛市場收錄這些擴充套件元件,詳見外掛市場
js的變化
js的變化,分為執行環境變化、資料繫結模式變化、api變化3部分。
- 執行環境從瀏覽器變成v8引擎
標準js語法和api都支援,比如if、for、settimeout、indexOf等。
但瀏覽器專用的window、document、navigator、location物件,包括cookie等儲存,只有在瀏覽器中才有,app和小程式都不支援。
可能有些人以為js等於瀏覽器裡的js。其實js是ECMAScript組織管理的,瀏覽器中的js是w3c組織基於js規範補充了window、document、navigator、location等專用物件。
在uni-app的各個端中,除了h5端,其他端的js都執行在一個獨立的v8引擎下,不是在瀏覽器中,所以瀏覽器的物件無法使用。如果你做過小程式開發,對此應當很瞭解。
這意味著依賴document的很多HTML的庫,比如jqurey無法使用。
當然app和小程式支援web-view元件,裡面可以載入標準HTML,這種頁面仍然支援瀏覽器專用物件window、document、navigator、location。
- 以前的dom操作,改成vue的MVVM模式
現在前端趨勢是去dom化,改用mvvm模式,更簡潔的寫法,大幅減少程式碼行數,同時差量渲染效能更好。
uni-app使用vue的資料繫結方式解決js和dom介面互動的問題。
如果你想改變某個dom元素的顯示內容,比如一個view的顯示文字:
以前是給view設id,然後js裡通過選擇器獲取dom元素,進一步通過js進行賦值操作,修改dom元素的屬性或值。
如下演示了一段程式碼,頁面中有個顯示的文字區和一個按鈕,點選按鈕後會修改文字區的值
複製程式碼<html>
<head>
<script type="text/javascript">
document.addEventListener("DOMContentLoaded",function () {
document.getElementById("spana").innerText="456"
})
function changetextvalue () {
document.getElementById("spana").innerText="789"
}
</script>
</head>
<body>
<span id="spana">123</span>
<button type="button" onclick="changetextvalue()">修改為789</button>
</body>
</html>
現在的做法,是vue的繫結模式,給這個dom元素繫結一個js變數,在script中修改js變數的值,dom會自動變化,頁面會自動更新渲染
複製程式碼<template>
<view>
<text>{{textvalue}}</text><!-- 這裡演示了元件值的繫結 -->
<button :type="buttontype" @click="changetextvalue()">修改為789</button><!-- 這裡演示了屬性和事件的繫結 -->
</view>
</template>
<script>
export default {
data() {
return {
textvalue:"123",
buttontype:"primary"
};
},
onLoad() {
this.textvalue="456"//這裡修改textvalue的值,其實123都來不及顯示就變成了456
},
methods: {
changetextvalue() {
this.textvalue="789"//這裡修改textvalue的值,頁面自動重新整理為789
}
}
}
</script>
注意上述程式碼中的 export default {}
裡的 data(): {return { }}
。
在vue的設計中,這裡存放著頁面中需要繫結的資料,寫在data裡,才能被介面正確的繫結和渲染。
注意:uni-app的vue頁面是vue的單檔案元件規範,按照vue的定義只接受 function,必須用 return 包起來。
如果你學過小程式的資料繫結,但不瞭解vue,要注意:
- 小程式的資料繫結參考了vue,但自己修改了一些。在uni-app中只支援標準的vue,不支援小程式的資料繫結語法
- 小程式裡的setData在uni-app裡並不存在,因為vue是自動雙向資料繫結的。直接通過賦值方式修改資料,如果資料繫結到介面上,介面會自動更新渲染
從上述示例,還可看出事件的寫法變化。
- 以前,元素的事件是用onxxx="",裡面寫一段js或引用function的name,比如上述程式碼中的
onclick="changetextvalue()"
- 現在,需要在js的
export default {}
裡的methods: {}
裡寫一個方法,然後在元件中使用@click="changetextvalue()"
在js中,與data和methods平級的,如上述示例程式碼中的onload()
,稱為生命週期。在普通vue頁面裡的生命週期叫頁面生命週期。在專案根目錄的app.vue檔案中的生命週期叫應用生命週期。
除了onload
,還有onready
等很多生命週期,具體見uni-app的生命週期
在高階用法裡,vue支援給元件設ref(引用標記),這類似於之前html中給一個dom元素設id,然後在js中也可以用this.$refs.xxx
來獲取。如下:
複製程式碼<template>
<view>
<view ref="testview">11111</view>
<button @click="getTest">獲取test節點</button>
</view>
</template>
<script>
export default {
methods: {
getTest() {
console.log(this.$refs.testview)
}
}
};
</script>
- js api的變化
因為uni-app的api是參考小程式的,所以和瀏覽器的js api有很多不同,如
- alert,confirm 改成 uni.showmodel
- ajax 改成 uni.request
- cookie、session 沒有了,local.storage 改成 uni.storage
uni-app的js api還有很多,但基本就是小程式的api,把wx.xxx改為uni.xxx即可。詳見
uni-app在不同的端,支援條件編譯,無限制的使用各端獨有的api,詳見條件編譯
css的變化
標準的css基本都是支援的。
選擇器有2個變化:*選擇器不支援;元素選擇器裡沒有body,改為了page。微信小程式即是如此。
複製程式碼page{
}
單位方面,px無法動態適應不同寬度的螢幕,rem無法用於nvue/weex。如果想使用根據螢幕寬度自適應的單位,推薦使用rpx,全端支援。 尺寸單位文件
uni-app推薦使用flex佈局,這個佈局思路和傳統流式佈局有點區別。但flex的特色在於,不管是什麼技術都支援這種排版,web、小程式/快應用、weex/rn、原生的iOS、Android開發,全都支援flex。它是通吃所有端的新一代佈局方案。相關教程請自行百度學習。
uni-app的vue檔案裡支援所有web排版方式,不管是流式還是flex。但nvue裡,只支援flex,因為它在app端是使用原生排版引擎渲染的。
注意css裡背景圖和字型檔案,儘量不要大於40k,因為會影響效能。在小程式端,如果要大於40k,需放到伺服器側遠端引用或base64後引入,不能放到本地作為獨立檔案引用。
工程結構和頁面管理
uni-app的工程結構有單獨的要求,詳見
每個可顯示的頁面,都必須在 pages.json 中註冊。如果你開發過小程式,那麼pages.json類似app.json。如果你熟悉vue,這裡沒有vue的路由,都是在pages.json裡管理。
原來工程的首頁一般是index.html或default.html,是在web server裡配的。而uni-app的首頁,是在pages.json裡配的,page節點下第一個頁面就是首頁。一般在/pages/xx的目錄下。
app和小程式中,為了提升體驗,頁面提供了原生的導航欄和底部tabbar,注意這些配置是在pages.json中做,而不是在vue頁面裡建立,但點選事件的監聽在顯示的vue頁面中做。
如果你熟悉小程式開發的話,對比變化如下:
- 原來app.json被一拆為二。頁面管理,被挪入了uni-app的pages.json;非頁面管理,挪入了manifest.json
- 原來的app.js和app.wxss被合併到了app.vue中
結語
最後,本文並非uni-app的完整教程,瞭解掌握uni-app,還需要認真過一遍uni-app的文件。
掌握好vue,也仍需要進一步去vue官網學習。或通過uni-app專業視訊培訓課程,連同vue帶uni-app一起學會。
根據騰訊課堂和職友集的資料,會vue的人,比不會vue的普通前端薪資高27%哦。
如果你熟悉小程式,但不熟悉vue的話,這裡還有一篇文章總結的很好:vue和微信小程式的區別、比較
https://ask.dcloud.net.cn/article/35657