uni-app學習筆記(二)——uni-app詳解

2020-11-06 加百利真胖

uni-app (一套代碼,多端發行)

如果你會使用Vue那咱們繼續吧!

什麼是uni-app?

uni-app 是一個使用 Vue.js 開發所有前端應用的框架,開發者編寫一套代碼,可發布到iOS、Android、H5、以及各種小程序(微信/支付寶/百度/頭條/QQ/釘釘)等多個平臺。

誕生背景

多端泛濫 iOS、Android、H5、以及各種小程序(微信/支付寶/百度/頭條/QQ/釘釘)多套平臺,多套文檔,加大開發維護成本

uni-app特點

1、跨平臺

一套代碼多端發行,而不失優雅(條件編譯,保留不同平臺獨有特色功能方法調用)

<!--#ifdef MP-WEIXIN--> <view>只會編譯小程序</view><!--endif--><!--#ifdef XX-XXX--> <view>只會編譯XXX</view><!--endif-->

2、通用技術棧,學習成本低

Vue的語法,微信小程序Api,內嵌mpvue可以直接遷移,如果你會Vue可以直接入門

3、生態豐富

支持npm下載第三方模塊,支持小程序自定義組件,SDK,兼容mpvue組件,支持原生混合編碼

安裝

可以下載兩個進行配置 ,測試微信小程序與支付寶小程序同步實現
編譯工具下載HBuilderX
微信小程序開發IDE
支付寶小程序 IDE
推薦使用 HBuildX 進行開發

跨多端小程序開發

創建目錄

  1. 打開HBuilderX
  2. 左上角創建項目
  3. 選擇uni-app項目
  4. 下面是提供幾個Demo項目,可以創建學習
  5. 項目名稱能不能大寫,創建項目

運行項目

一、找到創建項目uni裡面的項目目錄

二、找到 manifest.js文件輸入

1、裡面有所有平臺配置文件

需要不同平臺測試,需要分別配置不同平臺

2、選擇微信小程序配置

配置小程序AppID
點擊最上面工具欄選擇運行
選擇運行到小程序模擬器
選擇微信小程序開發工具
第一次配置小程序開發者工具,需要打開服務

三、打開微信小程序開發左上角小

安全設置,將服務埠開啟。||工具 -> 設置 -> 安全設置,將服務埠開啟。

四、選擇HBuild停止服務,重新運行自動打開編輯工具

.nvue 是對weex的增強。如果你不開發App,那麼你不太需要nvue。

發布測試

選擇HBuild最上面工具欄,點擊發布進行打包,根據命令行提示再點擊微信開發者工具發布

注意不要直接修改微信開發工具目錄,以HBuild開發目錄為主

目錄介紹

與小程序配置相似

pages //存放分頁目錄static //存放應用引用靜態資源main.js //入口文件mainfest.json //跨平臺所有配置項文件pages.json //全局配置文件,類似App.json uni.scss//全局scss文件,在分頁任何位置,注意 style lang="scss" 需要設置 scssApp.vue // 應用配置,用來配置App全局樣式以及監聽

統一參照uni-app官方文檔

初探uni-app

添加分頁

  1. 滑鼠移動pages右鍵
  2. 右鍵新建頁面,注意檢查pages.json文件會自動寫入pages項,文件路徑

pages.json文件 style 為分頁配置項,類似小程序 page.json
修改 pages.json

知識點: uni-app分頁配置在style裡面寫,globalStyle寫全部樣式配置,在一個配置文件,這裡是有區別原生小程序開發,具體參照uni-app文檔進行配置 pages.json

配置項

配置項

navigationBarBackgroundColor HexColor //#000000 導航欄背景顏色 navigationBarTextStyle String white //導航欄標題顏色,僅支持 black/white navigationBarTitleText String //導航欄標題文字內容 navigationStyle String default //導航欄樣式,僅支持 default/custom。 backgroundColor HexColor //#ffffff 下拉窗口的背景色 微信小程序

全局配置

globalStyle: { //...全局配置}

局部配置 參照 pages.style內容

> pages數組,決定誰排在前面

修改pages導致文件查找失敗,檢查無誤,重啟編輯工具

pages:[ { path: "xxx/xxx/xxx", style: { //...局部配置 } }]

系統自帶底部tabBar欄配置

如果配置tabBar需要保證abBar第一個路由,配置在第一個pages的第一個

"tabBar": { "color": "#7A7E83", "selectedColor": "#3cc51f", "borderStyle": "black", "backgroundColor": "#ffffff", "list": [{ "pagePath": "pages/component/index", "iconPath": "static/image/icon_component.png", "selectedIconPath": "static/image/icon_component_HL.png", "text": "組件" }, { "pagePath": "pages/API/index", "iconPath": "static/image/icon_API.png", "selectedIconPath": "static/image/icon_API_HL.png", "text": "接口" }] }

常用基本操作

優先嘗試根據Vue使用操作,例如使用 v-for 替換wx:for

表達式

僅此而已,有Vue使用相似,不能使用流程控制語句

<view>{{name}}</view> <!--讀取變量-->​<view>{{msg+'Msea'}}</view><!--拼接變量--><view>{{10-9}}</view> <!--運算符--><view>{{0||"NB"}}</view> <!--邏輯運算符-->​<!--數據類型方法--><view>{{'Msea'.indexOf('xxx')!==-1?'太原最靚仔':'no'}}</view><view>{{"我愛北京天安門".substr(0,2)}}</view>

屬性綁定

<image :src="'https://www.w3school.com.cn/i/eg_tulip.jpg'"/>

動態樣式

<view :class="`${'box'}`+''+`12`">{{`1`+1}}</view> <view :class="{className:true}"></view><view :class="['box',true?'col2':'']"></view><view class="box1212" :class="['box',true?'col2':'']"></view><view :style="{ color: 'red', fontSize: 20 + 'px' }">666</view><view :style="[{ color: pink, fontSize: 20 + 'px' }]">777</view>

指令

<view class="box" v-show="true">v-show</view>​<view v-if="text==='登陸'">{{'歡迎'+name+'登陸'}}</view><view v-else-if="text==='未登陸'">未登陸</view><view v-else>!!!!!</view>​<input type="text" v-model="val">{{val}} <!--數據雙項綁定--><!--支持v-model修飾符--><input type="text" v-model.number="val">{{val+11}}

事件

<!--事件,阻止事件冒泡--><view @click="test1(true)"> <!--傳入參數--> <button @click.stop="test2">test</button></view>

遍歷

<!--數組遍歷--><ul id="example-1"> <li v-for="(item,index) in items"> {{ item.message }} </li></ul>​<!--對象遍歷--><div v-for="(value, name, index) in object"> {{ index }}. {{ name }}: {{ value }}</div>

路由跳轉

頁面棧最多十層。使用uni.navigateTo頻繁切換,會導致棧溢出,跳轉失敗

// 非tabbar配置的頁面我們使用 navigateTo跳轉時保留老頁面,一般用於需要返回uni.navigateTo({ url: "../one/one?name=Msea"})// 跳轉pages.json>tabbar>配置過的頁面,使用 switchTabuni.switchTab({ url: "../one/one"})// 不保留當前頁面,跳轉非配置頁面uni.redirectTo({ url: "../one/one"})

響應式單位rpx

推薦使用最近公告推薦使用rpx替代upx

基於蘋果6 1px =2rpx

<view class="box1"></view><view class="box2"></view><style lang="scss">.box1{ width:200rpx; height:200rpx; background:red;}.box2{ width:100px; height:100px; background:pink;}</style>

節點操作

微信小程序裡面沒有 window,document對象,那如果需要進行dom操作

var query=uni.createSelectorQuery();​query.select(".titlerh").boundingClientRect((nodes)=>{ console.log(nodes)}).exec();​query.select(".box1") .boundingClientRect() .selectAll(".box2") .boundingClientRect() .exec((res)=>{ console.log(res);});

組件

創建文件夾 components目錄統一寫法,滑鼠右鍵創建組件

所有組件與屬性名都是小寫,單詞之間以連字符-連接。

<template> <uni-test/></template><script> import uniTest from "../../components/test.vue" export default { data() { return {}; }, methods:{ test(){ this.text = "登錄"; } }, components: { uniTest //引入組件 } }</script><style lang="scss"> ...style</style>

生命周期

應用生命周期 App.vue

App({ onLaunch (options) { console.log("小程序初始化"); }, onShow (options) console.log("小程序顯示"); }, onHide () { console.log("小程序隱藏"); }})

分頁生命周期 pages

Page({ onLoad: function(options) { // 頁面創建時執行 console.log("頁面加載"); }, onShow: function() { console.log("頁面進入"); }, onReady: function() { console.log("頁面首次渲染完畢時執行"); }, onHide: function() { console.log("頁面離開"); }, onPullDownRefresh: function() { // 觸發下拉刷新時執行 console.log("下拉觸發"); //enablePullDownRefresh 開啟下拉 }, onReachBottom: function() { // 頁面觸底時執行 console.log("下拉到底"); }, onShareAppMessage: function (e) { // 頁面被用戶分享時執行 //通過按鈕調用 //點擊觸發彈窗 <button open-type="share">分享</button> console.log("用戶分享"); return { title: '妹子圖片', path: '/pages/index/index', //當前頁面 path imageUrl: "/images/1.jpg", desc: '面向百度開發', success: (res) => { console.log("轉發成功", res); }, fail: (res) => { console.log("轉發失敗", res); } } }, onPageScroll: function() { console.log("頁面滾動時執行"); }, onResize: function() { console.log("屏幕旋轉觸發"); }})

組件生命周期

uni-app components組件支持的生命周期,與vue標準組件的生命周期相同。wx小程序支持生命周期

beforeCreate(){} // 在實例初始化之後被調用created(){} // 在實例創建完成後被立即調用。beforeMount(){} // 在掛載開始之前被調用。mounted(){} // 掛載到實例上去之後調用。beforeDestroy(){} // 實例銷毀之前調用。在這一步,實例仍然完全可用。

UI組件

uni-ui

使用方法與微信小程序一致,推薦使用uni-ui

<scroll-view :scroll-x="true" style="boder:1px solid red;white-space:nowrap" @scroll="scroll"> <view style=" background:red; width:200px;height:100px; display:inline-block;" ></view> <view style="background:yellow;width:200px;height:100px;display:inline-block;"></view> <view style="background:pink;width:200px;height:100px;display:inline-block;"></view> <view style="background:blue;width:200px;height:100px;display:inline-block;"></view></scroll-view>

引入三方UI

例如 Vant Weapp 下載

  1. 根目錄下創建 wxcomponents
  2. 將下載包內部 dist包粘貼到uni-app根目錄wxcomponents文件夾下
  3. 配置

{ "path" : "pages/one/one", "style" : { "usingComponents":{ "van-button": "/wxcomponents/dist/button/index" //參照wx組件引 } }}

  1. 在App.vue,引入樣式

<style> /*每個頁面公共css */ @import "/wxcomponents/dist/common/index.wxss";</style>

  1. 在one分頁內直接使用van-button組件,不需要引入
  2. 注意如果報錯,檢查路徑如果沒有問題,可以選擇重編輯器重新啟動微信開發工具

常用API調用

獲取用戶授權彈窗

<button open-type="getUserInfo" @getuserinfo="eventName"> 獲取頭像暱稱 </button>getUserInfo: function(e) { app.globalData.userInfo = e.detail.userInfo this.setData({ userInfo: e.detail.userInfo, hasUserInfo: true })}

返回所有用戶授權

wx.getSetting({success:()=>{"返回用戶所有用戶授權"}})

照相機接口

因為,調用照相機獲取臨時圖片格式,直接上傳三方伺服器,是不支持的,需要微信做解析,轉發

wx.uploadFile 上傳微信需要做轉發看不到傳輸的參數

uni.chooseImage({ count: 1, //圖片張數 sizeType: ['original', 'compressed'],//原圖,壓縮圖, sourceType: ['album', 'camera'], //本地相冊,拍照 success :res=> { const tempFilePaths = res.tempFilePaths//微信小程序圖片臨時路徑 this.setData({tempFilePaths}); }})// 預覽接口viewImgs(index) { uni.previewImage({ current: this.data.tempFilePaths[index], // 當前顯示圖片的http連結 urls:this.data.tempFilePaths // 需要預覽的圖片http連結列表 });}, //小程序圖片上傳 fileUplaod() { uni.uploadFile({ url: "http://wxs.ixinangou.net/index/index/dofiles", filePath: this.data.tempFilePaths[0], name: "file", //上傳圖片key formData: { user: "MSea" //需要額外攜帶參數 }, header: { "content-type": "multipart/form-data" }, success: res => { console.log("data"); } }); }

請求

微信原生請求接口

注意設置,不校驗合法域名,回憶怎麼添加合法域名

//GET 會自動拼接參數//queryStringParamsuni.request({ method: "GET", url: "https://cnodejs.org/api/v1/topics", data: { uname: "Msea" }, success: (res) => { console.log(res) }})//POST 默認參數為payLoad,為jsonuni.request({ method: "POST", url: "https://cnodejs.org/api/v1/topics", data: { uname: "Msea" }, success: (res) => { console.log(res) }})//POST form-data 數據 // 'content-type': 'multipart/form-data' 用於文件上傳 uni.request({ url: 'https://cnodejs.org/api/v1/topic/5433d5e4e737cbe96dcef312', data:{fileId:'123'}, method:'POST', header: { 'content-type': 'application/x-www-form-urlencoded' }, success:function(res){}})

地圖使用

地圖組件

<map id="map" longitude="經度" latitude="緯度" scale="縮放級別(14)" bindcontroltap="點擊地圖觸發FN" markers="{{添加標記}}" bindtap="markertap" 點解地圖觸發 show-location 將地圖中心移置當前定位點,此時需設置地圖組件 show-location 為true。 style="width: 100%; height: 300px;"></map>

移動地圖中心點

移動端測試有效

onShow: function() { // 地圖上下文對象 this.mapCtx = uni.createMapContext('map'); }, ckMap(e){ //小程序不支持 Objcet.assign var temp={ iconPath: "/assets/img/local.png", id: 0, width: 25, height: 25, ...e.detail } var markers=this.data.markers; markers.push(temp); this.setData({markers},()=>{ var data={ ...e.detail }; this.mapCtx.moveToLocation(data) }) }

定位

uni.getLocation({ type: 'gcj02', //騰訊地圖坐標系 success:(res)=> { const latitude = res.latitude const longitude = res.longitude }})

用戶授權彈窗

app.json配置文件

//app.json{ "pages": ["pages/index/index"], "permission": { "scope.userLocation": { "desc": "熊貓創客需要獲取您的位置親" // 高速公路行駛持續後臺定位 } }}

獲取當前位置並移動地圖中心點

wx.getLocation({ type: 'gcj02', //騰訊地圖坐標系 success: (res) => { const latitude = res.latitude const longitude = res.longitude var temp = { iconPath: "/assets/img/local.png", id: 0, width: 25, height: 25, latitude, longitude } var markers = this.data.markers; markers.push(temp); this.setData({ markers }, () => { var data = { latitude, longitude }; this.mapCtx.moveToLocation(data) }) }})

vuex

uni-app已經內置了vuex

  1. 在項目的根目錄下,創建一個名為store的文件夾

import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)const store = new Vuex.Store({ state: { num:0 }, mutations: { add(store){ store.num++; } }, actions: {}})export default store

  1. main.js入口文件引入

import store from './store'Vue.prototype.$store = store; const app = new Vue({ ...App, store})app.$mount()

  1. 組件內引入

<template> <view> <view>{{num}}</view> <button @click="test">test1</button> </view></template><script> import { mapState, mapMutations } from 'vuex'; export default { computed:{ ...mapState(['num']) }, methods:{ test() { console.log(this.$store.commit("add")) } } }</script>

條件編譯

可以安裝支付寶小程序進行測試

#ifdef %PLATFORM% //這些代碼只在該平臺編譯 #endif #ifdef : if defined 僅在某個平臺編譯#ifndef : if not defined 在除裡該平臺的其他編譯#endif : end if 結束條件編譯%PLATFORM% 需要編譯的平臺,上面的MP就是各個小程序的意思常用 %PLATFORM% h5 h5平臺MP-WEIXIN 微信小程序MP-ALIPAY 支付寶小程序MP-BAIDU 百度小城MP-TOUTIAO 頭條小程序

總結: 優先使用Vue用法,只要實現微信開發,支持wx,ui,api,統一使用uni的Api,多看文檔

相關焦點

  • uni-app學習筆記(一)-- uni-app簡介
    ,其實也沒那麼輕鬆,學習成本還是挺高的)儘管現在已經有了 react-native 和Flutter這樣的 優秀的技術但個人認為H5+技術,更加接近手機端原生規範。基本等於0因為它採用了小程序的項目架構,同時結合vue框架技術來編寫參考這個連結即可 (mpvue)http://mpvue.com/
  • uni-app學習筆記
    平時做移動開發很少接觸css,最近在寫uni-app要用到css所以少不了學習這方面的知識。今天的筆記也是一些基礎知識,關於盒子模型當中的一些比較不錯的屬性,也是常用屬性。在 CSS 盒子模型的默認定義裡,你對一個元素所設置的 width 與 height 只會應用到這個元素的內容區。
  • uni-app國內火熱的小程序/H5/App一條龍開發平臺
    我覺得uni-app是目前國內最為火熱的小程序、H5和App一條龍開發平臺。當然還有一些其它平臺,如京東的taro,主要針對小程序/H5。還有近兩年特火的Flutter(google出品),主要針對App,性能不錯,但小程序的生態還需要發展,學習成本較高。
  • 風靡業內的跨端開源框架 uni-app 入駐 CODE.CHINA
    >https://codechina.csdn.net/dcloud/uni-app項目簡介:uni-app 是一個使用 Vue.js 開發所有前端應用的框架,可實現開發一套代碼同時發布到iOS、Android、H5、以及各種小程序(微信/支付寶/百度/頭條/QQ/
  • 萬能前端框架uni app初探01:搭建開發環境
    前言:從本節開始,我來帶領大家學習uni app,這是一款逆天的前端框架,基於vue.js,同一套代碼,可發布到iOS、Android、H5、以及各種小程序等多個平臺,本節,我們部署在微信小程序和一、基礎知識1.uni app簡介​uni-app​ 是一個使用 Vue.js 開發所有前端應用的框架,開發者編寫一套代碼,可發布到iOS、Android、H5、以及各種小程序(微信/支付寶/百度/頭條/QQ/
  • uni-app開發注意事項總結
    一、HBuilderX - uni-app發布1、uni-app發布為H51、在 manifest.json二、vue-cli -uni-app發布1、運行、發布uni-app、js、css 等)被引用到才會被包含進去。
  • 真實測評:用uni-app開發小程序,比原生開發好在哪裡?
    小程序開發也一樣,uni-app框架中,同樣可調用微信提供的所有原生代碼。故如果存在某些API(平臺特有或新增API),uni-app尚未封裝,開發者可直接在uni-app中編寫微信原生API,即wx.開頭的各種API。
  • b2b2c電子商城(uni-app,微信小程序,APP, H5)開發源碼
    商城前端使用uni-app開發, 可打包部署到微信小程序, APP, H5,系統後臺則是用java語言開發。獎金指出、團隊業績內容管理,官方資訊、活動通知、素材管理、常見問題營銷推廣,首頁輪播、廣告管理、優惠券、團購秒殺、拼團管理應用設置,基礎設置、微信支付、支付寶支付、多媒體存儲、簡訊設置分潤設置,推廣分潤、銷售分潤、團隊業績分潤、培訓分潤統計分析,商品銷量統計、會員增長統計、訂單銷量統計技術棧:前端:vue後端:springcloud springboot uni-app
  • 圖文講解uni-app的PC寬屏適配方案
    uni-app以目前手機屏幕為主窗體(window),在左/右/上三個方向,新擴展 leftWindow、rightWindow、topWindow三個窗體,這三個窗體可設定在屏幕寬度大於某一閥值時自動出現(展現分欄的寬屏設計),屏幕寬度小於某一閥值後自動消失(恢復單窗口的窄屏設計)。
  • uni-app實現簡單API攔截
    前端是一個苦逼的活,技術在不斷變化,需求千變萬化,如何應對各種需求保證得心應手呢,那就是不斷學習。藝高人膽大,只有了解學習和掌握才能不被前端的後浪拍在沙灘上。今天我們簡單了解一下uni-app:官網的解釋時uni-app 是一個使用 Vue.js 開發跨平臺應用的前端框架,可以讓開發者編寫一套代碼,便可以編譯到iOS、Android、H5、小程序等多個平臺。當然框架儘可能的處理各端差異,保證我們使用一致性,所以使用起來感覺還不錯,畢竟誰想反覆的開發同一個項目到不同平臺呢。
  • 詳解:uni-app|vue組件實現水珠晃動loading純CSS動效
    小凡在【uni-app項目|vue組件形式實現的科技感loading純CSS動效】文章中詳細講解過如何進行必要的配置工作,點擊右側連結查看科技感Loading動效詳解 下載Hbuilder X 新建uni-app項目 在pages文件夾下創建home文件夾
  • uni-app實現裡程碑突破!
    HBuilderX1.0發布的另一個重磅的就是uni-app uni-app被定義為終極跨平臺開發框架,隨著HBuilderX1.0的發布,同樣迎來了裡程碑突破! uni-app的體驗好於傳統跨平臺開發,可以跨iOS、Android、微信小程序,但產品發布初期限制較多,缺少三方生態。
  • 多端開發框架uni-app 1.2發布
    uni-app遵循Vue.js語法規範,一套代碼,多端發行,切實解決了眾多開發者的痛點;故自8月份發布以來,已有上萬名開發人員擁抱uni-app,目前已累計創建了數萬個應用,活躍的開發者們每天在QQ群中產生數萬條交流記錄。  奔跑的腳步不會停止,歷時一個多月的打磨,uni-app 1.2版本正式發布,支持發行到H5平臺。
  • Android uni-app 封裝原生插件
    這邊文章圖文講解一下怎麼封裝原生插件,並且在下一章uni-app實現音視頻通話。1.uni-app是什麼?2.uni-app的特點跨平臺更多真正做到「一套代碼、多端發行」!條件編譯:優雅的在一個項目裡調用不同平臺的特色功能!
  • uni-app 1.4 發布,一套代碼,發行多個平臺
    支持更多小程序平臺uni-app 1.4 版本新增支持百度、支付寶小程序,從此一次開發,可發布小程序(微信/支付寶/百度)、H5、App(iOS/Android)6大平臺!項目,會提示選擇項目模板$ vue create -p dcloudio/uni-preset-vue my-project# 進入項目目錄$ cd my-projectTips:如果之前已使用過老版本的uni-app cli插件,則通過npm將uni-app升級到最新版,即可獲得將原有uni-app項目轉換到各家小程序的能力支持支付寶小程序使用如下命令進行支付寶小程序的編譯預覽及發行打包
  • uni-app小程序開發指南
    npm install -g @vue/cli複製代碼3.2 創建uni-app應用vue create -p dcloudio/uni-preset-vue wxapp複製代碼創建成功後修改manifest.json,配置已註冊的小程序appId3.3 uni-ui庫uni-ui是DCloud提供的基於vue組件,flex布局的跨端ui框架。
  • 如何在HBuilderX創建uni-app並綁定阿里雲
    工具HBuilderX微信開發者工具技術vueuni-appJavaScript在HBuilderX開發工具中,可以創建uni-app框架項目;其中,還可以進行雲開發,啟用uniCloud可以選擇騰訊雲,也可以選擇阿里雲。
  • 如何使用uni-app項目中的數字角標
    工具HBuilderX微信開發者工具技術Vueuni-appJavaScriptwxml1、打開HBuilderX工具,創建uni-app項目,然後在pages文件夾下,新建uni-app頁面,輸入名稱example,點擊創建按鈕
  • uni-app 2.2 發布,大幅優化 H5 端性能體驗
    讓我們意外,或者說驚喜的是,有大量開發者用uni-app只編寫H5版,並沒有多端發布(可參考案例)。這其實也符合uni-app的初衷,uni-app的定位並不是需要多端發布時才用uni-app。uni-app是一個使用vue.js開發所有前端應用的統一框架。對於一個前端工程師來說,使用uni-app做多端效率更高,做單一端也沒問題,並在各端有不少出彩的地方。
  • 如何使用uni-app項目中的Combox 組合框
    工具HBuilderX微信開發者工具技術uni-appvueJavaScript微信小程序1、在uni-app項目中,新建uni-app頁面,輸入名稱combox新建uni-app頁面,輸入名稱combox2、打開頁面文件,插入uni-combox,綁定數據源和欄位,設置屬性