從0到0.1 擼一個基于Vant的H5簡單框架(一)

前言

本文適合對vue剛?cè)腴T的小白侣滩,通過vue-cli快速創(chuàng)建vue項目口注,以vant ui框架為基礎(chǔ)搭建的H5簡單框架。適配主流手機瀏覽器君珠。內(nèi)容可能有些不嚴(yán)謹(jǐn)或者理解錯誤的地方寝志,歡迎提出指正。

通過本文葛躏,大致可以達(dá)到以下目的:

  • 通過vue-cli創(chuàng)建一個vue項目
  • sass的配置
  • axios的二次封裝
  • vue-router簡單使用
  • vuex簡單使用
  • vant的簡單應(yīng)用
  • post-css-to-viewport移動端適配(兼容vant)
  • 登錄的token設(shè)置
  • 權(quán)限設(shè)計

閱讀之前澈段,你最好對閱讀以下官方文檔,以便快速理解:

創(chuàng)建項目

安裝vue-cli并創(chuàng)建項目

# 安裝 Vue Cli
npm install -g @vue/cli

# 創(chuàng)建一個項目
vue create vue-vant-demo

# 運行項目
cd vue-vant-demo
npm run serve

服務(wù)啟動 瀏覽器訪問http://localhost:8080/預(yù)覽頁面

簡單的vue項目已建好舰攒,接下來再根據(jù)需求添磚加瓦。

SASS預(yù)編譯處理

你可以在創(chuàng)建項目的時候選擇預(yù)處理器 (Sass/Less/Stylus)悔醋。如果當(dāng)時沒有選好摩窃,內(nèi)置的 webpack 仍然會被預(yù)配置為可以完成所有的處理。你也可以手動安裝相應(yīng)的 webpack loader:

# 安裝Sass
npm install -D sass-loader node-sass

裝node-sass的失敗率很高,執(zhí)行命令后默默祈禱吧

sass-loader node-sass 這兩個包安裝成功后猾愿,無需任何配置鹦聪,可以直接在頁面中庸sass寫css了

來測試驗證一下:

修改App.vue文件 刪除自動生成的內(nèi)容,加上測試代碼

<template>
  <div id="app">
    <div class="test">
      測試sass
    </div>
  </div>
</template>

<style lang="scss" scoped>
#app {
  width: 100%;
  height: 30px;
  .test {
    color: red;
    font-size: 14px;
  }
}
</style>

注: style 標(biāo)簽上需要加上lang 字段來指定預(yù)編譯的語言 ; scoped字段表示當(dāng)前的樣式只對當(dāng)前的頁面(組件)生效蒂秘,編譯時會加上唯一的attribute(比如data-v-7ba5bd90)

我們寫最簡單的sass嵌套的語法泽本,看頁面效果,文字已經(jīng)變成紅色姻僧,說明sass已經(jīng)生效规丽。可以放心大膽的用了撇贺。

01.jpg

vue-router路由

安裝與配置

Vue Router 是 Vue.js 官方的路由管理器赌莺。(具體可以閱讀vue-router的官網(wǎng))

首先安裝

# 安裝vue-router
npm install -s vue-router

在src目錄下新建一個views目錄,用來存放頁面松嘶。我們新建兩個頁面登錄和列表頁模板.

在src目錄下新加router目錄艘狭,用來管理路由。

具體目錄結(jié)構(gòu)如下:

src
  --views
    --login
      Index.vue
    --list
      Index.vue
  --router
    index.js

隨便在登錄頁和列表頁寫幾個字以示區(qū)分翠订,接下來巢音,我們來配置路由

/src/router/index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
// @會從src目錄查找
import Login from '@/views/login/Index.vue'
import List from '@/views/list/Index.vue'

// Vue.js 官方提供的一些插件 (例如 vue-router) 在檢測到 Vue 是可訪問的全局變量時會自動調(diào)用 Vue.use()。然而在像 CommonJS 這樣的模塊環(huán)境中尽超,你應(yīng)該始終顯式地調(diào)用 Vue.use()
Vue.use(VueRouter)

const routes = [
  {
    path: '/login',
    name: 'Login',
    component: Login,
    // meta這個字段有什么用港谊? 稍等會說
    meta: {
      title: "登錄"
    }
  },
  {
    path: '/list',
    name: 'List',
    component: List,
    meta: {
      title: "列表"
    }
  },
]

const router = new VueRouter({
    // 注意:key名是routes 不是routers!!!
  routes
})

export default router

/scr/main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'

Vue.config.productionTip = false

new Vue({
    // 注冊路由
  router,
  render: h => h(App),
}).$mount('#app')

這樣我們是不是就可以通過路由訪問了?

重啟服務(wù) 訪問/login 試一下 發(fā)現(xiàn)登錄頁面寫的內(nèi)容并沒有顯示出來橙弱,也沒有報錯歧寺。。

原來我們漏了很重要的一步 需要在加上router-view 路由匹配的組件講在這里顯示

/src/App.vue

<template>
  <div id="app">
    <router-view></router-view>
  </div>
</template>

這時訪問 http://localhost:8080/#/login http://localhost:8080/#/list都可以正確訪問了

自定義頁面Title

思考:現(xiàn)在登錄和列表頁面的title都是默認(rèn)的項目名棘脐,怎么去改成自定義的title呢斜筐?

/src/views/login/Index.vue

<script>
export default {
  mounted(){
    document.title = '登錄'
  }
}
</script>

等頁面加載完成后,去改變頁面的title蛀缝,這樣雖然也能解決問題顷链,但是如果每個頁面都加上這段操作會顯得麻煩。是否還記得我們剛才在做路由配置的時候加了一個meta屬性屈梁,里面配置了title字段嗤练,這時我們可以通過全局前置守衛(wèi)來解決這個問題

/src/main.js

// 路由守衛(wèi)
router.beforeEach((to, from, next) => {
  if(to.meta.title){
    document.title = to.meta.title
  }
  next()
})

meta字段就是路由元信息字段,我們console.log(to)可以看到在讶,通過to.meta或者to.matched數(shù)組中拿到我們配置的title信息煞抬。這樣就可以為每個頁面都加上自定義的title了。

引入移動端UI框架 Vant

Vant是有贊團(tuán)隊開發(fā)的輕量級的移動端UI組件庫。

安裝

# 安裝vant
npm install vant -s

配置

我們選擇一次性引入所有組件。按需引入方式可以參考官方文檔

在main.js中注冊vant

import Vant from 'vant';
import 'vant/lib/index.css';
Vue.use(Vant);

在登錄頁我們引入按鈕組件看一下效果

/views/login/Index.vue

<template>
  <div>
    <van-button type="primary">主要按鈕</van-button>
  </div>
</template>
02.jpg

vant已經(jīng)生效,然鵝福稳,我們看到vant的樣式残拐,單位是px途茫,并不能適配不同分辨率的手機。

Vant適配

vant的官方文檔提供了Rem的適配方式溪食,具體的可以參考官方文檔

rem還要去做px->rem的計算囊卜,有點麻煩。我們通過viewport來解決適配問題错沃。

postcss-px-to-viewport是將px單位轉(zhuǎn)換為視口單位的 (vw, vh, vmin, vmax) 的 PostCSS 插件.

安裝

# 安裝到開發(fā)環(huán)境
npm install postcss-px-to-viewport -D

配置

我們需要在根目錄添加.postcssrc.js文件

具體配置如下:

const path = require('path');

module.exports = ({ file })=> {
  const designWidth = file.dirname.includes(path.join('node_modules', 'vant')) ? 375 : 750;
  return {
    plugins: {
      autoprefixer: {}, // 用來給不同的瀏覽器自動添加相應(yīng)前綴栅组,如-webkit-,-moz-等等
      "postcss-px-to-viewport": {
        unitToConvert: "px", // 要轉(zhuǎn)化的單位
        viewportWidth: designWidth, // UI設(shè)計稿的寬度
        unitPrecision: 6, // 轉(zhuǎn)換后的精度捎废,即小數(shù)點位數(shù)
        propList: ["*"], // 指定轉(zhuǎn)換的css屬性的單位笑窜,*代表全部css屬性的單位都進(jìn)行轉(zhuǎn)換
        viewportUnit: "vw", // 指定需要轉(zhuǎn)換成的視窗單位,默認(rèn)vw
        fontViewportUnit: "vw", // 指定字體需要轉(zhuǎn)換成的視窗單位登疗,默認(rèn)vw
        selectorBlackList: ["wrap"], // 指定不轉(zhuǎn)換為視窗單位的類名排截,
        minPixelValue: 1, // 默認(rèn)值1,小于或等于1px則不進(jìn)行轉(zhuǎn)換
        mediaQuery: true, // 是否在媒體查詢的css代碼中也進(jìn)行轉(zhuǎn)換辐益,默認(rèn)false
        replace: true, // 是否轉(zhuǎn)換后直接更換屬性值
        // exclude: [/node_modules/], // 設(shè)置忽略文件断傲,用正則做目錄名匹配
        landscape: false // 是否處理橫屏情況
      }
    }
  }
};

上面配置項的注釋已經(jīng)很清楚,按說明配置就可以了智政。因為vantpx也需要轉(zhuǎn)成vw认罩,所以exclude不能再配置node_modules或者通過正則不匹配vant

另外,viewportWidth屬性需要配置UI設(shè)計稿的寬度续捂,vant是按375的設(shè)計稿設(shè)計的垦垂,而我們一般開發(fā)時的設(shè)計稿為750,所以這個值是需要做一下判斷來賦值牙瓢。

webpackplugins可以配置對象劫拗,也可以配置一個函數(shù),函數(shù)調(diào)用時可以傳入兩個參數(shù)矾克,環(huán)境對象(env)和一個map對象页慷。該對象描述了傳遞給webpack的選項,可以從中獲取output-filename胁附,來判斷是否是vant酒繁,從而為vant賦不同的值。

最后我們重新啟動服務(wù)控妻,看我們的樣式是否已被轉(zhuǎn)成vw:

03.jpg

特別注意 postcss-px-to-viewport插件不能轉(zhuǎn)換行內(nèi)樣式 州袒,所以你寫樣式的時候盡量寫外鏈的樣式或者寫到style

未完待續(xù)

這篇先寫到這,這些都是最基礎(chǔ)的應(yīng)用饼暑,基本相關(guān)官網(wǎng)都有更詳細(xì)的文檔稳析。還是建議多看官方文檔洗做,少走彎路弓叛。

下次更新的內(nèi)容:

  • vant實現(xiàn)登錄頁面彰居、列表頁
  • axios的二次封裝
  • mock數(shù)據(jù)
  • 接口跨域、代理
  • 角色/權(quán)限設(shè)置

我的掘金地址:

掘金傳送門

參考文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撰筷,一起剝皮案震驚了整個濱河市陈惰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毕籽,老刑警劉巖抬闯,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異关筒,居然都是意外死亡溶握,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門蒸播,熙熙樓的掌柜王于貴愁眉苦臉地迎上來睡榆,“玉大人,你說我怎么就攤上這事袍榆≌陀欤” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵包雀,是天一觀的道長宿崭。 經(jīng)常有香客問我,道長才写,這世上最難降的妖魔是什么葡兑? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮赞草,結(jié)果婚禮上讹堤,老公的妹妹穿的比我還像新娘。我一直安慰自己房资,他們只是感情好蜕劝,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著轰异,像睡著了一般岖沛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搭独,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天婴削,我揣著相機與錄音,去河邊找鬼牙肝。 笑死唉俗,一個胖子當(dāng)著我的面吹牛嗤朴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播虫溜,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼雹姊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了衡楞?” 一聲冷哼從身側(cè)響起吱雏,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘾境,沒想到半個月后歧杏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡迷守,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年犬绒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兑凿。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡凯力,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出急膀,到底是詐尸還是另有隱情沮协,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布卓嫂,位于F島的核電站慷暂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏晨雳。R本人自食惡果不足惜行瑞,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望餐禁。 院中可真熱鬧血久,春花似錦、人聲如沸帮非。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽末盔。三九已至筑舅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陨舱,已是汗流浹背翠拣。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留游盲,地道東北人误墓。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓蛮粮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谜慌。 傳聞我的和親對象是個殘疾皇子然想,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355