uniapp-入門

uniapp簡介

uni-app 是一個使用 Vue.js 開發所有前端應用的框架,開發者編寫一套代碼,可發布到多端運行。(ios,android,Web, 各種小程序)

優點

  • 開發者/案例數量多
  • 平臺能力不受限
  • 性能體驗優秀
  • 周邊生態豐富
  • 學習成本低
  • 開發成本低

功能框架

image.png

開發規范

為了實現多端兼容,綜合考慮編譯速度、運行性能等因素,uni-app約定以下規范

  • 頁面文件遵循 Vue 單文件組件 (SFC) 規范
  • 組件標簽靠近小程序規范,詳見uni-app 組件規范
  • 接口能力(JS API)靠近微信小程序規范,但需將前綴 wx 替換為 uni,詳見uni-app接口規范
  • 數據綁定及事件處理同 Vue.js 規范,同時補充了App及頁面的生命周期
  • 為兼容多端運行,建議使用flex布局進行開發

環境搭建

通過HBuilderX可視化界面搭建

HBuilderX:下載地址

通過cli腳手架搭建

全局安裝vue-cli

npm install -g @vue/cli

創建uniapp

vue create -p dcloudio/uni-preset-vue my-project

創建uni-app

這里通過HBuilderX編譯器創建
點擊文件-》新建-》項目


image.png

選擇uni-app類型,輸入項目名,選擇默認模板


image.png

點擊創建,一個uni-app就創建好了。

目錄結構

.hbuilderx                    啟動調試時相關設置
components                符合vue組件規范的uniapp組件
pages                          業務頁面
static                            存放靜態資源
uni_modules                存放uni-module規范的插件
unpackage                   發布后的文件
App.vue                        應用配置,app的全局樣式及應用的生命周期
main.js                          Vue初始化入口文件
manifest.json                應用配置文件,名稱,appid,logo等。
pages.json                    配置頁面路由,導航條,選項卡等。

應用生命周期

函數 說明
onLaunch uni-app 初始化完成時觸發(全局只觸發一次)
onShow uni-app 啟動,或從后臺進入前臺顯示
onHide uni-app 從前臺進入后臺
onError uni-app 報錯時觸發
onUniNViewMessage nvue 頁面發送的數據進行監聽
onUnhandledRejection 對未處理的 Promise 拒絕事件監聽函數(2.8.1+)
onPageNotFound 頁面不存在監聽函數
onThemeChange 監聽系統主題變化
<script>
        //只能再App.vue里監聽應用的生命周期
    export default {
        onLaunch: function() {
            console.log('App Launch')
        },
        onShow: function() {
            console.log('App Show')
        },
        onHide: function() {
            console.log('App Hide')
        }
    }
</script>

頁面生命周期(常用)

函數 說明 平臺差異
onInit 監聽頁面初始化 百度小程序獨有
onLoad 監聽頁面加載
onShow 監聽頁面顯示
onReady 監聽頁面初次渲染完成
onHide 頁面隱藏
onUnload 監聽頁面卸載
onResize 監聽尺寸變化 App,微信小程序
onPullDownRefresh 監聽下拉動作,用于下拉刷新
onReachBottom 滾動到底部事件
onPageScroll 監聽頁面滾動
onBackPress 監聽返回鍵

路由

uni-app 頁面路由為框架統一管理,需要再page.json里配置每個路由頁面及頁面樣式

路由跳轉

uni.navigateTo    保留當前頁面,跳轉到新頁面
uni.redirectTo    關閉當前頁面,跳轉到新頁面
uni.reLaunch      關閉所有頁面,打開應用內的某個頁面
uni.switchTab     跳轉到tabBar頁面,并關閉其他所有非tabBar頁面
uni.navigateBack  關閉當前頁面,返回上一個頁面

尺寸單位

uni-app 支持的通用 css 單位包括 px、rpx
推薦使用rpx
uni-app應用,屏幕寬度以750為基準,自適應,頁面寬度設置750rpx就恰好為屏幕寬度。

  • 注意 在APP端或者H5端,如果屏幕寬度達到960px時,屏幕寬度以375為基準。

頁面配置

pages.json 中配置了uni-app的頁面路徑,窗口樣式,原生的導航欄,底部原生的tabbar等。

常用屬性

  • globalStyle 默認頁面樣式
  • pages 設置頁面路徑及樣式
  • tabBar 底部tab樣式

網絡

uni.request({
    url: 'https://www.example.com/request', //僅為示例,并非真實接口地址。
    data: {
        text: 'uni.request'
    },
    header: {
        'custom-header': 'hello' //自定義請求頭信息
    },
    success: (res) => {
        console.log(res.data);
        this.text = 'request success';
    }
});

如果要返回requestTask 對象,需要至少傳入success,fail,complete參數中的一個,
如果沒傳,則會返回Promise對象,如下

// Promise
uni.request({
        url: 'https://www.example.com/request'
    })
    .then(data => {//data為一個數組,數組第一項為錯誤信息,第二項為返回數據
        var [error, res]  = data;
        console.log(res.data);
    })
或者
// Await
async function request () {
    var [error, res] = await uni.request({
        url: 'https://www.example.com/request'
    });
    console.log(res.data);
}

數據存儲

//異步
uni.setStorage({
    key: 'storage_key',
    data: 'hello',
    success: function () {
        console.log('success');
    }
});
//同步
try {
    uni.setStorageSync('storage_key', 'hello');
} catch (e) {
    // error
}

數據獲取

//異步
uni.getStorage({
    key: 'storage_key',
    success: function (res) {
        console.log(res.data);
    }
});
//同步
try {
    const value = uni.getStorageSync('storage_key');
    if (value) {
        console.log(value);
    }
} catch (e) {
    // error
}

判斷平臺

編譯期判斷

// #ifdef H5
    alert("只有h5平臺才有alert方法")
// #endif

運行期判斷

switch(uni.getSystemInfoSync().platform){
    case 'android':
       console.log('運行Android上')
       break;
    case 'ios':
       console.log('運行iOS上')
       break;
    default:
       console.log('運行在開發者工具上')
       break;
}

全局變量

共用模塊

在 uni-app 項目根目錄下創建 common 目錄,然后在 common 目錄下新建 helper.js 用于定義公用的方法。

const now = Date.now || function () {  
    return new Date().getTime();  
};

在其他頁面中使用

<script>  
    import helper from '../../common/helper.js';  

    export default {  
        data() {  
            return {};  
        },  
        onLoad(){  
            console.log('now:' + helper.now());  
        },  
        methods: {  
        }  
    }  
</script>

掛載 Vue.prototype

將一些使用頻率較高的常量或者方法,直接擴展到 Vue.prototype 上,每個 Vue 對象都會“繼承”下來。
在main.js中掛載屬性/方法

Vue.prototype.now = Date.now || function () {  
    return new Date().getTime();  
};  

在其他頁面中使用

<script>  
    export default {  
        data() {  
            return {};  
        },  
        onLoad(){  
            console.log('now:' + this.now());  
        },  
        methods: {  
        }  
    }  
</script>

globalData

小程序中有個globalData概念,可以在 App 上聲明全局變量。 Vue 之前是沒有這類概念的,但 uni-app 引入了globalData概念,并且在包括H5、App等平臺都實現了。
在 App.vue 可以定義 globalData ,也可以使用 API 讀寫這個值。

在App.vue中定義

<script>  
    export default {  
        globalData: {  
            text: 'text'  
        },  
        onLaunch: function() {  
            console.log('App Launch')  
        },  
        onShow: function() {  
            console.log('App Show')  
        },  
        onHide: function() {  
            console.log('App Hide')  
        }  
    }  
</script>  

<style>  
    /*每個頁面公共css */  
</style>  

在其他頁面中使用

賦值:getApp().globalData.text = 'test'

取值:console.log(getApp().globalData.text) // 'test'

Vuex

Vuex 是一個專為 Vue.js 應用程序開發的狀態管理模式。它采用集中式存儲管理應用的所有組件的狀態,并以相應的規則保證狀態以一種可預測的方式發生變化。
舉例說明:

在 uni-app 項目根目錄下新建 store 目錄,在 store 目錄下創建 index.js 定義狀態值

const store = new Vuex.Store({  
    state: {  
        login: false,  
        token: '',  
        avatarUrl: '',  
        userName: ''  
    },  
    mutations: {  
        login(state, provider) {  
            console.log(state)  
            console.log(provider)  
            state.login = true;  
            state.token = provider.token;  
            state.userName = provider.userName;  
            state.avatarUrl = provider.avatarUrl;  
        },  
        logout(state) {  
            state.login = false;  
            state.token = '';  
            state.userName = '';  
            state.avatarUrl = '';  
        }  
    }  
})

然后,需要在 main.js 掛載 Vuex

import store from './store'  
Vue.prototype.$store = store

最后,在頁面中使用

<script>  
    import {  
        mapState,  
        mapMutations  
    } from 'vuex';  

    export default {  
        computed: {  
            ...mapState(['avatarUrl', 'login', 'userName'])  
        },  
        methods: {  
            ...mapMutations(['logout'])  
        }  
    }  
</script>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容

  • uni-app的基本使用 課程介紹: 基礎部分: 環境搭建 頁面外觀配置 數據綁定 uni-app的生命周期 組件...
    綠茵場上的碼者閱讀 46,418評論 1 21
  • 前言 18 年時候有幸接觸到 uniapp, 寫了一篇 《uni-app 入門到精通》,由于一些原因,該方案并沒有...
    mark666閱讀 5,336評論 1 9
  • uni-app的基本使用 課程介紹: 基礎部分: 環境搭建 頁面外觀配置 數據綁定 uni-app的生命周期 組件...
    鹵蛋兩枚閱讀 3,607評論 0 1
  • 學習導覽 uniapp調研資料 1.認識vue 2.搭建vue應用 3.組件與api 4.生命周期 5.條件編譯 ...
    Man不經心閱讀 17,223評論 1 6
  • uni-app的基本使用 課程介紹: 基礎部分: 環境搭建 頁面外觀配置 數據綁定 uni-app的生命周期 組件...
    __Mr_Xie__閱讀 1,473評論 0 1