移动端骨架搭建vue+vant

关于如何创建一个vue cli3+的项目就再赘述

首先安装vant

npm i vant -S

看官方文档,vant框架提供了多种引入方式,此处我们用vant推荐的方式,自动按需引入组件

首先安装一个插件[babel-plugin-import](babel-plugin-import 是一款 babel 插件,它会在编译过程中将 import 的写法自动转换为按需引入的方式

npm i babel-plugin-import -D

安装成功之后,在babel.config.js中进行如下配置

module.exports = {
  presets: [
    '@vue/cli-plugin-babel/preset'
  ],
    "plugins": [
        ["import", {
            "libraryName": "vant",
            "libraryDirectory": "es",
            "style": true
        }]
    ]
}

配置好之后,需要在index.html文件中去移入vant的样式


此时vant就算是配置成功了,如果要用vant 的组件,可以在当前页面去引入使用,或者在main中去引入,即可在页面中直接使用(小提示:引入babel-plugin-import插件之后,将不允许"导入所有组件"这种配置方式)

举个栗子(在main,js中去引入):

import { Lazyload } from 'vant';
Vue.use(Lazyload );

在页面中引入:


在移动端中,如何做显示适配,相信都有所了解,此处还是安装vant推荐的两个rem适配工具(Vant 中的样式默认使用px作为单位)

  • [postcss-pxtorem] 是一款 postcss 插件,用于将单位转化为 rem
  • [lib-flexible] 用于设置 rem 基准值
npm install postcss-pxtorem lib-flexible -D

等待一段时间,安装好之后在postcss.config中做如下配置

module.exports = {
    plugins: {
        'autoprefixer': {
            browsers: ['Android >= 4.0', 'iOS >= 7']
        },
        'postcss-pxtorem': {
            rootValue: 37.5,//rem是根据根元素字体大小进行适配(根据设计稿来改变大小,现在设计稿通常是750,那值改成75就可以了)
            propList: ['*']
        }
    }
};

另外需要在main.js去引入工具

import "lib-flexible/flexible";

在项目根目录下创建vue.config.js文件

module.exports = {
    lintOnSave: false,//过滤掉eslink,不过你自觉代码严谨可以忽略这个步骤(也就是所谓的严格模式)
};

移动端还需要处理的一个问题,有30毫秒点击延迟,解决方法如下(同时也解决了在ios中,input需要双击和长按才能获取焦点的问题)

npm install fastclick -D

安装成功之后,在main.js中去引入

import  FastClick from 'fastclick';
const ver=str.match(/cpu iphone os (.*?) like mac os/);
if(!ver){//非IOS系统
    // 引入fastclick 做相关处理
    FastClick.attach(document.body);
}
else {
    if(parseInt(ver[1])< 11){
        // 引入fastclick 做相关处理
        FastClick.attach(document.body);
    }
}

有时候同时操作多项目,需要更改端口号,所以需要去配置一些环境变量

根目录下创建.env(放置通用环境变量的配置)

会自动读取这些文件

NODE_ENV = "development";
BASE_URL = "./"; //请求的基本的url,请求的通用的地址
VUE_APP_BASE_API = "/dev-api";  //开发请求的接口

根目录下创建.env.development(放置开发环境变量的配置)

NODE_ENV = "development";
BASE_URL = "./";//请求的基本的url,请求的通用的地址
VUE_APP_BASE_API = "/dev-api";//开发请求的接口

根目录下创建.env.prodcution(放置生产环境变量的配置)

NODE_ENV = "production";
BASE_URL = "./";
VUE_APP_BASE_API = "/prod-api";//生产请求的接口

配置好之后,在vue.config.js中配置

console.log(process.env.NODE_ENV); // 可以查看当前环境变量
const port = process.env.port || 9090; //配置端口号
const path = require('path');//找到路径
// const webpack = require('webpack')
function resolve(dir) {
    return path.join(__dirname,dir);
}
module.exports = {
    lintOnSave: false,
    // lintOnSave:process.env.NODE_ENV === "development",(项目中一般如此配置,当然此处不希望她检测就直接关闭)

    devServer:{
        port, //端口号就是自己设置的值
        open:true, //默认运行就打开页面
        overlay:{   //报错全屏显示
            warnings:false,//警告不需要提示
            errors:true
        },
        proxy:{ // 跨域
          [process.env.VUE_APP_BASE_API]:{  //通用的去获取接口
            target:'http://xxx.cn',
             changeOrigin:true,//是否更改请求中的host值,决定是否能跨域
              pathRewrite:{ //重写路径
                  [process.env.VUE_APP_BASE_API]:""
              }
          }
        }
    },
    configureWebpack:{
        name:"project", //配置名称
        resolve:{
            alias:{
                '@':resolve('src'),//用@直接查找到src,下方同理
                'views':resolve('src/views'),//封装的方法,在上方
                'components':resolve('src/components'),
                'utils':resolve('src/utils'),
                'style':resolve('src/style'),
                'assets':resolve('src/assets')
            }
        },
    },
    pluginOptions: {//配置icon
        // ...
        pwa: {
            iconPaths: {
                favicon32: './favicon.ico',
                favicon16: './favicon.ico',
                appleTouchIcon: './favicon.ico',
                maskIcon: './favicon.ico',
                msTileImage: './favicon.ico'
            }
        }
    }

};

在项目开发完成之后,我们可能不再需要console.log,此时可以用一个插件来实现这个想法

npm install babel-plugin-transform-remove-console --save-dev

babel.config.js

//此处是安装了vant
const plugins = [
    ["import", {
        "libraryName": "vant",
        "libraryDirectory": "es",
        "style": true
    }]
];

if (process.env.NODE_ENV === 'production') {
    plugins.push("transform-remove-console")
}
module.exports = {
  presets: [
    '@vue/cli-plugin-babel/preset'
  ],
    plugins: plugins
}

在实际开发中,我们需要对接很多的接口,此时统一管理接口,是最好的,防止后端调整方法,我们还得去页面找

首先在src下创建一个api文件夹,新建一个api.js

api.js

import  index from './api.js'
import  login from './login.js'

export default{
    index,
    login,
    home,
    user,
}

index.js

export default {
    index:"http://xxx.cn/",//接口地址存放在此
}

home.js

export default {
    uploadone:"index/upload/uploadone",//图片上传接口
}

同时在可以单独建立一个http.js防止axios的封装和拦截器,这个网上多的是,就不再赘述,此处为不封装时,就放在main.js中加入一句话

axios.defaults.baseURL = "http://xxx.cn/";//接口地址

此时在页面调用接口就是
xxx.vue

let data = {
       xxx:xxx//你需要向后端发送的键值对
 };
 this.$axios.post(this.$api.home.uploadone, this.$Qs.stringify(data),)//qs需要在main.js去引入
      .then((res) => {
       console.log(res);
       if (res.data.code) {//请求成功时
                        //你的逻辑
        } else {//请求失败时
        this.$toast(res.data.msg)//打印后端提供的错误信息   toast是vue的一个轻提示,可在main中全局引入
        }
        }).catch((err) => {
                console.log(err);
       });

另外说一下路由守卫,在router的index.js中去配置

index.js

import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

const routes = [
    {
        path: '/',
        name: 'login',
        redirect: '/login'//设置首页
    },
    {
        path: '/login',
        name: 'login',
        component: () => import(/* webpackChunkName: "Article" */
            'views/login.vue'),
        meta: {
            requireAuth: false,//这个是路由拦截的一个标志,符合一定条件开放路由,此处false是不验证路由
            title: '授权绑定'
        }
    },
    {
        path: '/home',
        name: 'home',
        component: () => import(/* webpackChunkName: "Article" */
            'views/Home/Home.vue'),
        meta: {
            requireAuth: true,//相对的,true就是不开放路由,没满足条件不能跳转
            title: '个人中心'
        }
    },
    {
        path: '*',
        name: '404',//设置404页面,出现某些未知错误时候,可以跳转到这个页面,避免出现一些奇怪的bug。影响用户体验
        component: () => import(/* webpackChunkName: "404" */
            'views/404.vue'),
        meta: {
            requireAuth: true
        }
    },
];

const router = new VueRouter({
    mode: 'hash',//因项目需要,此处采用hash模式
    routes
});

// 路由守卫
router.beforeEach((to, from, next) => {
    let getFlag = Boolean(localStorage.getItem("token"));从缓存中取到token
    if (to.meta.requireAuth) {  // 判断该路由是否需要登录权限
        if (getFlag === true) {  // 通过vuex state获取当前的token是否存在
            // console.log('进了登录方法');
            if(to.name == 'home' ){//因项目需要,某些页面设置不同的背景色
                window.document.body.style.backgroundColor = '#f7f7f7';
            }else {
                window.document.body.style.backgroundColor = '';
            }
            if(to.meta.title){//设置单独某页面的title
                document.title = to.meta.title;
            }else {
                document.title = '阿米尔'
            }
            next();
        }
        else {
            // this.$toast('登录失败');
            console.log('应该路由拦截了');
            next({
                path: '/login',
                query: {redirect: to.fullPath}  // 将跳转的路由path作为参数,登录成功后跳转到该路由
            })
        }
    }
    else {
        next();
    }
});

export default router

你可能感兴趣的:(移动端骨架搭建vue+vant)