uniapp-入門

uniapp簡介

uni-app 是一個使用 Vue.js 開發(fā)所有前端應(yīng)用的框架兼呵,開發(fā)者編寫一套代碼兔辅,可發(fā)布到多端運(yùn)行。(ios击喂,android维苔,Web, 各種小程序)

優(yōu)點(diǎn)

  • 開發(fā)者/案例數(shù)量多
  • 平臺能力不受限
  • 性能體驗(yàn)優(yōu)秀
  • 周邊生態(tài)豐富
  • 學(xué)習(xí)成本低
  • 開發(fā)成本低

功能框架

image.png

開發(fā)規(guī)范

為了實(shí)現(xiàn)多端兼容,綜合考慮編譯速度懂昂、運(yùn)行性能等因素介时,uni-app約定以下規(guī)范

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

環(huán)境搭建

通過HBuilderX可視化界面搭建

HBuilderX:下載地址

通過cli腳手架搭建

全局安裝vue-cli

npm install -g @vue/cli

創(chuàng)建uniapp

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

創(chuàng)建uni-app

這里通過HBuilderX編譯器創(chuàng)建
點(diǎn)擊文件-》新建-》項(xiàng)目


image.png

選擇uni-app類型褐澎,輸入項(xiàng)目名,選擇默認(rèn)模板


image.png

點(diǎn)擊創(chuàng)建原探,一個uni-app就創(chuàng)建好了乱凿。

目錄結(jié)構(gòu)

.hbuilderx                    啟動調(diào)試時相關(guān)設(shè)置
components                符合vue組件規(guī)范的uniapp組件
pages                          業(yè)務(wù)頁面
static                            存放靜態(tài)資源
uni_modules                存放uni-module規(guī)范的插件
unpackage                   發(fā)布后的文件
App.vue                        應(yīng)用配置,app的全局樣式及應(yīng)用的生命周期
main.js                          Vue初始化入口文件
manifest.json                應(yīng)用配置文件咽弦,名稱徒蟆,appid,logo等型型。
pages.json                    配置頁面路由段审,導(dǎo)航條,選項(xiàng)卡等闹蒜。

應(yīng)用生命周期

函數(shù) 說明
onLaunch 當(dāng)uni-app 初始化完成時觸發(fā)(全局只觸發(fā)一次)
onShow 當(dāng) uni-app 啟動寺枉,或從后臺進(jìn)入前臺顯示
onHide 當(dāng) uni-app 從前臺進(jìn)入后臺
onError 當(dāng) uni-app 報(bào)錯時觸發(fā)
onUniNViewMessage nvue 頁面發(fā)送的數(shù)據(jù)進(jìn)行監(jiān)聽
onUnhandledRejection 對未處理的 Promise 拒絕事件監(jiān)聽函數(shù)(2.8.1+)
onPageNotFound 頁面不存在監(jiān)聽函數(shù)
onThemeChange 監(jiān)聽系統(tǒng)主題變化
<script>
        //只能再App.vue里監(jiān)聽?wèi)?yīng)用的生命周期
    export default {
        onLaunch: function() {
            console.log('App Launch')
        },
        onShow: function() {
            console.log('App Show')
        },
        onHide: function() {
            console.log('App Hide')
        }
    }
</script>

頁面生命周期(常用)

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

路由

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

路由跳轉(zhuǎn)

  • navigator 組件跳轉(zhuǎn) 文檔
  • 調(diào)用API跳轉(zhuǎn) 文檔
uni.navigateTo    保留當(dāng)前頁面姥闪,跳轉(zhuǎn)到新頁面
uni.redirectTo    關(guān)閉當(dāng)前頁面始苇,跳轉(zhuǎn)到新頁面
uni.reLaunch      關(guān)閉所有頁面,打開應(yīng)用內(nèi)的某個頁面
uni.switchTab     跳轉(zhuǎn)到tabBar頁面筐喳,并關(guān)閉其他所有非tabBar頁面
uni.navigateBack  關(guān)閉當(dāng)前頁面催式,返回上一個頁面

尺寸單位

uni-app 支持的通用 css 單位包括 px、rpx
推薦使用rpx
uni-app應(yīng)用避归,屏幕寬度以750為基準(zhǔn)荣月,自適應(yīng),頁面寬度設(shè)置750rpx就恰好為屏幕寬度梳毙。

  • 注意 在APP端或者H5端哺窄,如果屏幕寬度達(dá)到960px時,屏幕寬度以375為基準(zhǔn)账锹。

頁面配置

pages.json 中配置了uni-app的頁面路徑萌业,窗口樣式,原生的導(dǎo)航欄牌废,底部原生的tabbar等咽白。

常用屬性

  • globalStyle 默認(rèn)頁面樣式
  • pages 設(shè)置頁面路徑及樣式
  • tabBar 底部tab樣式

網(wǎng)絡(luò)

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

如果要返回requestTask 對象晶框,需要至少傳入success,fail懂从,complete參數(shù)中的一個授段,
如果沒傳,則會返回Promise對象番甩,如下

// Promise
uni.request({
        url: 'https://www.example.com/request'
    })
    .then(data => {//data為一個數(shù)組侵贵,數(shù)組第一項(xiàng)為錯誤信息,第二項(xiàng)為返回?cái)?shù)據(jù)
        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);
}

數(shù)據(jù)存儲

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

數(shù)據(jù)獲取

//異步
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

運(yùn)行期判斷

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)行在開發(fā)者工具上')
       break;
}

全局變量

共用模塊

在 uni-app 項(xiàng)目根目錄下創(chuàng)建 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

將一些使用頻率較高的常量或者方法,直接擴(kuò)展到 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等平臺都實(shí)現(xiàn)了仪或。
在 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 應(yīng)用程序開發(fā)的狀態(tài)管理模式范删。它采用集中式存儲管理應(yīng)用的所有組件的狀態(tài)蕾域,并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測的方式發(fā)生變化。
舉例說明:

在 uni-app 項(xiàng)目根目錄下新建 store 目錄到旦,在 store 目錄下創(chuàng)建 index.js 定義狀態(tài)值

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>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厢绝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子带猴,更是在濱河造成了極大的恐慌昔汉,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拴清,死亡現(xiàn)場離奇詭異靶病,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)口予,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門娄周,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沪停,你說我怎么就攤上這事煤辨。” “怎么了木张?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵众辨,是天一觀的道長。 經(jīng)常有香客問我舷礼,道長鹃彻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任妻献,我火速辦了婚禮蛛株,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘育拨。我一直安慰自己谨履,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布至朗。 她就那樣靜靜地躺著屉符,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上矗钟,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天唆香,我揣著相機(jī)與錄音,去河邊找鬼吨艇。 笑死躬它,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的东涡。 我是一名探鬼主播冯吓,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疮跑!你這毒婦竟也來了组贺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤祖娘,失蹤者是張志新(化名)和其女友劉穎失尖,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渐苏,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掀潮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了琼富。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仪吧。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鞠眉,靈堂內(nèi)的尸體忽然破棺而出薯鼠,到底是詐尸還是另有隱情,我是刑警寧澤械蹋,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布人断,位于F島的核電站,受9級特大地震影響朝蜘,放射性物質(zhì)發(fā)生泄漏恶迈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一谱醇、第九天 我趴在偏房一處隱蔽的房頂上張望暇仲。 院中可真熱鬧,春花似錦副渴、人聲如沸奈附。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斥滤。三九已至将鸵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佑颇,已是汗流浹背顶掉。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挑胸,地道東北人痒筒。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像茬贵,于是被迫代替她去往敵國和親簿透。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • uni-app的基本使用 課程介紹: 基礎(chǔ)部分: 環(huán)境搭建 頁面外觀配置 數(shù)據(jù)綁定 uni-app的生命周期 組件...
    綠茵場上的碼者閱讀 43,118評論 1 21
  • 前言 18 年時候有幸接觸到 uniapp, 寫了一篇 《uni-app 入門到精通》解藻,由于一些原因老充,該方案并沒有...
    mark666閱讀 5,248評論 1 9
  • uni-app的基本使用 課程介紹: 基礎(chǔ)部分: 環(huán)境搭建 頁面外觀配置 數(shù)據(jù)綁定 uni-app的生命周期 組件...
    鹵蛋兩枚閱讀 3,543評論 0 1
  • 學(xué)習(xí)導(dǎo)覽 uniapp調(diào)研資料 1.認(rèn)識vue 2.搭建vue應(yīng)用 3.組件與api 4.生命周期 5.條件編譯 ...
    Man不經(jīng)心閱讀 16,955評論 1 6
  • uni-app的基本使用 課程介紹: 基礎(chǔ)部分: 環(huán)境搭建 頁面外觀配置 數(shù)據(jù)綁定 uni-app的生命周期 組件...
    __Mr_Xie__閱讀 1,455評論 0 1