使用vue構(gòu)建移動應(yīng)用

在移動應(yīng)用中很多功能都是必不可少的,使用vue構(gòu)建移動應(yīng)用自然也就需要實(shí)現(xiàn)這些功能粤铭。之所以寫這篇文章,是希望大家能更多的將注意力放在項(xiàng)目的核心業(yè)務(wù)上杂靶,而不是過多的關(guān)注通用功能梆惯。

基礎(chǔ)設(shè)置

  • 使用vue-cli搭建項(xiàng)目框架
  • 在index.html文件中添加<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport">,在移動端設(shè)置禁止縮放吗垮,以便顯示合適大小的頁面垛吗。
  • 如果要將頁面封裝為app,那么需要將config/index.js中build的assetsPublicPath設(shè)置為'./'烁登,build獲得的頁面可以直接打開怯屉,而不需要使用服務(wù)器。

通用功能

一饵沧、頁面跳轉(zhuǎn)

一般應(yīng)用都會擁有多個頁面锨络,在vue中通過vue-router來管理頁面。移動應(yīng)用頁面跳轉(zhuǎn)時狼牺,都有轉(zhuǎn)場效果羡儿,在vue中我們也可以實(shí)現(xiàn)。
在路由文件中設(shè)置meta為數(shù)字是钥,meta表示其路由的深度掠归,然后在App.vue中設(shè)置:

<template>
  <transition :name="transitionName">
    <router-view></router-view>
  </transition>
</template>

<script>
export default {
  name: 'app',
  data () {
    return {
      transitionName: 'fade'
    }
  },
  watch: {
    '$route' (to, from) {
      let toDepth = to.meta
      let fromDepth = from.meta
      if (fromDepth > toDepth) {
        this.transitionName = 'fade-left'
      } else if (fromDepth < toDepth) {
        this.transitionName = 'fade-right'
      } else {
        this.transitionName = 'fade'
      }
    }
  }
}
</script>

<style>
</style>

監(jiān)聽$route,根據(jù)to悄泥、from meta值的大小設(shè)置不同的跳轉(zhuǎn)動畫虏冻。如果應(yīng)用到多種跳轉(zhuǎn)動畫,可以根據(jù)詳情弹囚,具體情況具體應(yīng)用厨相。

登錄跳轉(zhuǎn)

這樣實(shí)現(xiàn)跳轉(zhuǎn)效果需要在編寫router時添加設(shè)置,比較麻煩,更好的方法可以通過插件vue-navigation來實(shí)現(xiàn)领铐,更加方便悯森,無須對router進(jìn)行多余的設(shè)置。npm i -S vue-navigation安裝绪撵,在main.js中導(dǎo)入:

import Navigation from 'vue-navigation'
Vue.use(Navigation, {router}) // router為路由文件

在App.vue中設(shè)置:

this.$navigation.on('forward', (to, from) => {
    this.transitionName = 'fade-right'
 })
 this.$navigation.on('back', (to, from) => {
    this.transitionName = 'fade-left'
 })
 this.$navigation.on('replace', (to, from) => {
    this.transitionName = 'fade'
 })

vue-navigation插件還有一個重要的功能就是保存頁面狀態(tài)瓢姻,與keep-alive相似,但是keep-alive保存狀態(tài)無法識別路由的前進(jìn)后退音诈,而實(shí)際應(yīng)用中幻碱,我們的需求是返回頁面時,希望頁面狀態(tài)保存细溅,當(dāng)進(jìn)入頁面時希望獲取新的數(shù)據(jù)褥傍,使用vue-navigation可以很好的實(shí)現(xiàn)這個效果。具體使用可以查看vue-navigation有詳細(xì)使用說明與案例喇聊。

PS:
這里的動畫效果引用自animate.scss;

二恍风、底部導(dǎo)航

直接引用Tabbar組件即可,如果需要添加跳轉(zhuǎn)動畫可以在<router-view></router-view>外設(shè)置:

<template>
  <div class="content">
    <!--<transition name="fade" mode="out-in">-->
      <router-view></router-view>
    <!--</transition>-->
    <Tabbar 
      :routers="[
        {path: '/index/home', icon: 'icon-home', name: '首頁'},
        {path: '/index/loading', icon: 'icon-course', name: '加載'},
        {path: '/index/message', icon: 'icon-info', name: '信息'}
      ]"
    >
    </Tabbar>
  </div>
</template>

<script>
export default {
  name: 'Index',
  components: {Tabbar: require('components/Tabbar')},
  data () {
    return {

    }
  }
}
</script>

<style lang="scss" scoped>  
.content{
  background-color: #eee;
}
</style>

三誓篱、數(shù)據(jù)加載

加載數(shù)據(jù)與加載頁面是存在先后順序的朋贬,比較通用方法是先加載頁面,顯示數(shù)據(jù)加載效果窜骄,在數(shù)據(jù)加載完成之后顯示完整的頁面锦募。數(shù)據(jù)加載效果作為組件添加到應(yīng)用中,比較繁瑣邻遏,所以使用自定義指令的方式實(shí)現(xiàn)數(shù)據(jù)加載效果的顯示糠亩。

數(shù)據(jù)加載效果

四、接口文件

import fetch from 'isomorphic-fetch'
import store from 'store'
import router from './router'
var env = process.env.NODE_ENV
var rootUrl
if (env === 'development') {
  rootUrl = ''
}
if (env === 'production') {
  rootUrl = ''
}
const post = function (url, params = {}) {
  return fetch(rootUrl + url, {
    method: 'post',
    headers: {
      'Content-type': 'application/json; charset=utf-8',
      'Authorization': store.get('token')
    },
    body: JSON.stringify(params)
  }).then(function (res) {
    if (res.status === 401) {
      // 沒有權(quán)限
      api.logout()
    } else {
      return res.json()
    }
  })
}

const urls = [
  'classAtCurDate' // 普通接口列表
]

var api = {}

for (var url of urls) {
  (function (url) {
    api[url] = (params) => {
      console.log(url)
      return post('course/' + url, params)
    }
  })(url)
}
// 需要特殊處理的接口
api.logout = () => {
  store.clearAll()
  router.push('login')
}

api.login = (params) => {
  store.set('id', 1)
  store.set('token', 2)
  return Promise.resolve({params})
}
export default api


可以在全局設(shè)置准验,也可以在需要時導(dǎo)入

// 在main.js中導(dǎo)入api接口
import api from '../src/api'
Vue.$api = Vue.prototype.$api = api

五赎线、登錄權(quán)限設(shè)置

路由加載前,檢查是否有登錄權(quán)限(判斷用戶id是否存在)糊饱,如果存在直接跳過登錄頁進(jìn)入首頁氛驮,如果不存在在跳轉(zhuǎn)登錄頁。

router.beforeEach((to, from, next) => {
  if (cache.get('id') && to.path === '/login') {
    next('/index')
  } else if (!cache.get('id') && to.path !== '/login') {
    next('/login')
  } else {
    next()
  }
})

六济似、常用第三方組件

許多常用組件都已經(jīng)有了很好的實(shí)現(xiàn)矫废,在項(xiàng)目開發(fā)中重復(fù)造輪子是一件很不明智的事情。vue移動應(yīng)用有很多合適的庫可以選擇砰蠢,如mint-ui蓖扑、vux,這里不一一列舉台舱,想了解更多的可以自行谷歌律杠,或直接到GitHub上搜索潭流,這里已mint-ui為例,講一下比較常用的一些組件柜去。

提示組件

提示組件即顯示信息灰嫉、提示用戶的組件,toast嗓奢、alert讼撒、 prompt皆為此類。

加載數(shù)據(jù)

如上拉加載數(shù)據(jù)股耽、下拉加載(刷新)數(shù)據(jù)根盒、滾動加載數(shù)據(jù);這些在mint-ui中有較好的實(shí)現(xiàn)

日期選擇

比較通用的功能物蝙,但自己實(shí)現(xiàn)起來還是相對麻煩的炎滞,借助第三方組件就可以很快的實(shí)現(xiàn)了。

使用第三方組件雖然能夠快速完成項(xiàng)目诬乞,但是不建議過度使用册赛,一些常用的組件如按鈕、表單還是應(yīng)該自己實(shí)現(xiàn)震嫉,一是因?yàn)檫@些組件實(shí)現(xiàn)不是很復(fù)雜森瘪,二是因?yàn)橥鶎@些組件每個應(yīng)用都有自己的設(shè)計(jì)要求,使用第三方然后修改樣式责掏,不但比自編寫更復(fù)雜而且增加冗余文件。

使用第三方組件庫湃望,一般有兩種導(dǎo)入方式:一是全部導(dǎo)入换衬,這樣會引入很多不必要的文件;二是只導(dǎo)入使用的組件和樣式证芭。建議使用第二種方式瞳浦,避免導(dǎo)入多余組件,mint-ui可以使用Use babel-plugin-component簡化單獨(dú)導(dǎo)入組件的寫法废士。

GitHub地址:https://github.com/x007xyz/vue-mobile

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叫潦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子官硝,更是在濱河造成了極大的恐慌矗蕊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氢架,死亡現(xiàn)場離奇詭異傻咖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)岖研,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門卿操,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事害淤∩鹊瘢” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵窥摄,是天一觀的道長镶奉。 經(jīng)常有香客問我,道長溪王,這世上最難降的妖魔是什么腮鞍? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮莹菱,結(jié)果婚禮上移国,老公的妹妹穿的比我還像新娘。我一直安慰自己道伟,他們只是感情好迹缀,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蜜徽,像睡著了一般祝懂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拘鞋,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天砚蓬,我揣著相機(jī)與錄音,去河邊找鬼盆色。 笑死灰蛙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的隔躲。 我是一名探鬼主播摩梧,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宣旱!你這毒婦竟也來了仅父?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤浑吟,失蹤者是張志新(化名)和其女友劉穎笙纤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體组力,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粪糙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忿项。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓉冈。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡城舞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寞酿,到底是詐尸還是另有隱情家夺,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布伐弹,位于F島的核電站拉馋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惨好。R本人自食惡果不足惜煌茴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望日川。 院中可真熱鬧蔓腐,春花似錦、人聲如沸龄句。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽分歇。三九已至傀蓉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間职抡,已是汗流浹背葬燎。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缚甩,地道東北人谱净。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像蹄胰,于是被迫代替她去往敵國和親岳遥。 傳聞我的和親對象是個殘疾皇子奕翔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

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

  • 轉(zhuǎn)載 :OpenDiggawesome-github-vue 是由OpenDigg整理并維護(hù)的Vue相關(guān)開源項(xiàng)目庫...
    果汁密碼閱讀 23,092評論 8 124
  • 來源:github.com Vue.js開源項(xiàng)目速查表:https://www.ctolib.com/cheats...
    zhangtaiwei閱讀 11,598評論 1 159
  • UI組件element ★11612 - 餓了么出品的Vue2的web UI工具套件 Vux ★7503 - 基于...
    董董董董董董董董董大笨蛋閱讀 8,503評論 6 123
  • 不記得哪一世種下了因緣裕寨, 今生與你相遇, 在不惑的年紀(jì)派继。 那是一個陽歷的“七夕”宾袜, 可我已不再于紅塵中期許, 佛陀...
    蕙印閱讀 252評論 0 0
  • 早上5點(diǎn)起床驾窟,為了避開黃果樹瀑布最擁擠的時間段庆猫,天還沒有亮,武漢40度的高溫绅络,我們在貴州的早晨卻感受到了絲...
    愛蔻嚴(yán)玲閱讀 529評論 1 2