从0到0.1 撸一个基于Vant的H5简单框架(一)

前言

本文适合对vue刚入门的小白,通过vue-cli快速创建vue项目,以vant ui框架为基础搭建的H5简单框架。适配主流手机浏览器。内容可能有些不严谨或者理解错误的地方,欢迎提出指正。

通过本文,大致可以达到以下目的:

  • 通过vue-cli创建一个vue项目
  • sass的配置
  • axios的二次封装
  • vue-router简单使用
  • vuex简单使用
  • vant的简单应用
  • post-css-to-viewport移动端适配(兼容vant)
  • 登录的token设置
  • 权限设计

阅读之前,你最好对阅读以下官方文档,以便快速理解:

创建项目

安装vue-cli并创建项目

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

# 创建一个项目
vue create vue-vant-demo

# 运行项目
cd vue-vant-demo
npm run serve

服务启动 浏览器访问http://localhost:8080/预览页面

简单的vue项目已建好,接下来再根据需求添砖加瓦。

SASS预编译处理

你可以在创建项目的时候选择预处理器 (Sass/Less/Stylus)。如果当时没有选好,内置的 webpack 仍然会被预配置为可以完成所有的处理。你也可以手动安装相应的 webpack loader:

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

装node-sass的失败率很高,执行命令后默默祈祷吧

sass-loader node-sass 这两个包安装成功后,无需任何配置,可以直接在页面中庸sass写css了

来测试验证一下:

修改App.vue文件 删除自动生成的内容,加上测试代码

<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 标签上需要加上lang 字段来指定预编译的语言 ; scoped字段表示当前的样式只对当前的页面(组件)生效,编译时会加上唯一的attribute(比如data-v-7ba5bd90)

我们写最简单的sass嵌套的语法,看页面效果,文字已经变成红色,说明sass已经生效。可以放心大胆的用了。

01.jpg

vue-router路由

安装与配置

Vue Router 是 Vue.js 官方的路由管理器。(具体可以阅读vue-router的官网)

首先安装

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

在src目录下新建一个views目录,用来存放页面。我们新建两个页面登录和列表页模板.

在src目录下新加router目录,用来管理路由。

具体目录结构如下:

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

随便在登录页和列表页写几个字以示区分,接下来,我们来配置路由

/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 是可访问的全局变量时会自动调用 Vue.use()。然而在像 CommonJS 这样的模块环境中,你应该始终显式地调用 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')

这样我们是不是就可以通过路由访问了?

重启服务 访问/login 试一下 发现登录页面写的内容并没有显示出来,也没有报错。。

原来我们漏了很重要的一步 需要在加上router-view 路由匹配的组件讲在这里显示

/src/App.vue

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

这时访问 http://localhost:8080/#/login http://localhost:8080/#/list都可以正确访问了

自定义页面Title

思考:现在登录和列表页面的title都是默认的项目名,怎么去改成自定义的title呢?

/src/views/login/Index.vue

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

等页面加载完成后,去改变页面的title,这样虽然也能解决问题,但是如果每个页面都加上这段操作会显得麻烦。是否还记得我们刚才在做路由配置的时候加了一个meta属性,里面配置了title字段,这时我们可以通过全局前置守卫来解决这个问题

/src/main.js

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

meta字段就是路由元信息字段,我们console.log(to)可以看到,通过to.meta或者to.matched数组中拿到我们配置的title信息。这样就可以为每个页面都加上自定义的title了。

引入移动端UI框架 Vant

Vant是有赞团队开发的轻量级的移动端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已经生效,然鹅,我们看到vant的样式,单位是px,并不能适配不同分辨率的手机。

Vant适配

vant的官方文档提供了Rem的适配方式,具体的可以参考官方文档

rem还要去做px->rem的计算,有点麻烦。我们通过viewport来解决适配问题。

postcss-px-to-viewport是将px单位转换为视口单位的 (vw, vh, vmin, vmax) 的 PostCSS 插件.

安装

# 安装到开发环境
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: {}, // 用来给不同的浏览器自动添加相应前缀,如-webkit-,-moz-等等
      "postcss-px-to-viewport": {
        unitToConvert: "px", // 要转化的单位
        viewportWidth: designWidth, // UI设计稿的宽度
        unitPrecision: 6, // 转换后的精度,即小数点位数
        propList: ["*"], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换
        viewportUnit: "vw", // 指定需要转换成的视窗单位,默认vw
        fontViewportUnit: "vw", // 指定字体需要转换成的视窗单位,默认vw
        selectorBlackList: ["wrap"], // 指定不转换为视窗单位的类名,
        minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换
        mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false
        replace: true, // 是否转换后直接更换属性值
        // exclude: [/node_modules/], // 设置忽略文件,用正则做目录名匹配
        landscape: false // 是否处理横屏情况
      }
    }
  }
};

上面配置项的注释已经很清楚,按说明配置就可以了。因为vantpx也需要转成vw,所以exclude不能再配置node_modules或者通过正则不匹配vant

另外,viewportWidth属性需要配置UI设计稿的宽度,vant是按375的设计稿设计的,而我们一般开发时的设计稿为750,所以这个值是需要做一下判断来赋值。

webpackplugins可以配置对象,也可以配置一个函数,函数调用时可以传入两个参数,环境对象(env)和一个map对象。该对象描述了传递给webpack的选项,可以从中获取output-filename,来判断是否是vant,从而为vant赋不同的值。

最后我们重新启动服务,看我们的样式是否已被转成vw:

03.jpg

特别注意 postcss-px-to-viewport插件不能转换行内样式 ,所以你写样式的时候尽量写外链的样式或者写到style

未完待续

这篇先写到这,这些都是最基础的应用,基本相关官网都有更详细的文档。还是建议多看官方文档,少走弯路。

下次更新的内容:

  • vant实现登录页面、列表页
  • axios的二次封装
  • mock数据
  • 接口跨域、代理
  • 角色/权限设置

我的掘金地址:

掘金传送门

参考文档

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342