文章目录

  • 一、前置准备
    • 1. 技术选型
    • 2. 创建vue项目
  • 二、Rem 布局适配
    • 2.1. px转rem
    • 2.2. 设置 rem 基准值
    • 2.3. 配置vue.config.js
    • 2.4. 重置样式表
    • 2.5. 配置样式表
    • 2.6. 安装less
    • 2.7. 注册less
    • 2.8. 代码中使用
  • 三、vant安装/配置/测试
    • 3.1. 安装vant-ui
    • 3.2. 引入与注册
    • 3.3. vant测试
  • 四、axios 工具封装
    • 4.1. 下载安装axios
    • 4.2. 创建axios实例
    • 4.3. 配置拦截器
    • 4.4. api管理
    • 4.5. 跨域代理配置
  • 五、动态路由
    • 5.1. 下载vue-router
    • 5.2. 组件注册
    • 5.3. 主页路由
    • 5.4. 实例挂载
    • 5.5. 创建home页面
    • 5.6. 引入 AppTabBar
  • 六、优化
    • 6.1. 路由守卫
    • 6.2. 异常修复
    • 6.3. 路由懒加载
一、前置准备
1. 技术选型

技术选型

组件 版本 说明
vue ^2.6.11 数据处理框架
vue-router ^3.5.3 动态路由
vant ^2.12.37 移动端UI
axios ^0.24.0 前后端交互
amfe-flexible ^2.2.1 Rem 布局适配
postcss-pxtorem ^5.1.1 Rem 布局适配
less ^4.1.2 css编译
less-loader ^5.0.0 css编译
vue/cli ~4.5.0 项目脚手架

vue-cli + vant+ less +axios 开发

2. 创建vue项目

使用vue-cli脚手架 ,采用vue2.x默认安装即可

vue ui


二、Rem 布局适配
2.1. px转rem

安装 amfe-flexible

在main.js 主入口文件引入 amfe-flexible, 它会自动设置html的font-size为屏幕宽度除以10,也就是1rem等于html根节点的font-size。假如设计稿的宽度是750px,此时1rem应该等于75px。假如量的某个元素的宽度是150px,那么在css里面定义这个元素的宽度就是 width: 2rem

npm i amfe-flexible -S

在public/index.html中替换标签

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">

在main.js 引入amfe-flexible

import 'amfe-flexible';
2.2. 设置 rem 基准值

安装 第三方插件 postcss-pxtorem
注意需要安装5.11 版本,否则报错

npm i postcss-pxtorem@5.1.1 -S

会自动将css代码中的px单位根据规则转换成rem 单位

注意: 如果css样式中 有不需要转成rem 的单位,只需将单位写成大写PX 即可。

2.3. 配置vue.config.js

在项目根目录创建vue.config.js文件,设置如下配置:

注意:修改完项目根目录下的配置文件后,一定要重启项目,这样配置文件才生效

module.exports = {lintOnSave: false, // eslint-loader 是否在保存的时候检查css: {loaderOptions: {postcss: {plugins: [// 把px单位换算成rem单位require("postcss-pxtorem")({// 换算的基数 375的设计稿,换算基数就是37.5rootValue: 37.5,selectorBlackList: [".van"], // 要忽略的选择器并保留为px。propList: ["*"], //可以从px更改为rem的属性。minPixelValue: 1 // 设置要替换的最小像素值。})]}}}
}
2.4. 重置样式表

在src/assets下创建css文件夹,新建reset.css文件
reset.css 重置样式表代码:

@charset "utf-8";html{background-color:#fff;color:#000;font-size:12px}
body,ul,ol,dl,dd,h1,h2,h3,h4,h5,h6,figure,form,fieldset,legend,input,textarea,button,p,blockquote,th,td,pre,xmp{margin:0;padding:0}
body,input,textarea,button,select,pre,xmp,tt,code,kbd,samp{line-height:1.5;font-family:tahoma,arial,"Hiragino Sans GB",simsun,sans-serif}
h1,h2,h3,h4,h5,h6,small,big,input,textarea,button,select{font-size:100%}
h1,h2,h3,h4,h5,h6{font-family:tahoma,arial,"Hiragino Sans GB","微软雅黑",simsun,sans-serif}
h1,h2,h3,h4,h5,h6,b,strong{font-weight:normal}
address,cite,dfn,em,i,optgroup,var{font-style:normal}
table{border-collapse:collapse;border-spacing:0;text-align:left}
caption,th{text-align:inherit}
ul,ol,menu{list-style:none}
fieldset,img{border:0}
img,object,input,textarea,button,select{vertical-align:middle}
article,aside,footer,header,section,nav,figure,figcaption,hgroup,details,menu{display:block}
audio,canvas,video{display:inline-block;*display:inline;*zoom:1}
blockquote:before,blockquote:after,q:before,q:after{content:"\0020"}
textarea{overflow:auto;resize:vertical}
input,textarea,button,select,a{outline:0 none;border: none;}
button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}
mark{background-color:transparent}
a,ins,s,u,del{text-decoration:none}
sup,sub{vertical-align:baseline}
html {overflow-x: hidden;height: 100%;font-size: 50px;-webkit-tap-highlight-color: transparent;}
body {font-family: Arial, "Microsoft Yahei", "Helvetica Neue", Helvetica, sans-serif;color: #333;font-size: .28em;line-height: 1;-webkit-text-size-adjust: none;}
hr {height: .02rem;margin: .1rem 0;border: medium none;border-top: .02rem solid #cacaca;}
a {color: #25a4bb;text-decoration: none;}
2.5. 配置样式表

在main.js 文件中, 引入重置样式表reset.css,去掉标签的默认样式

// 引入重置样式表
import '@/assets/css/reset.css'
2.6. 安装less

预编译语言,编译成css, 在main.js 引入使用
依次执行:

npm install less -S
npm install less-loader@5.0.0  -S

注意:此处安装less-loader 版本需是5.x版本,否则报错,默认安装的是最新版本,所以安装需指定版本号

2.7. 注册less

//在main.js中,引入less并使用

import less from 'less'
Vue.use(less)
2.8. 代码中使用
<style lang='less' scoped></style>
三、vant安装/配置/测试
3.1. 安装vant-ui

官网地址: https://vant-contrib.gitee.io/vant/#/zh-CN/

  • 项目目录下安装vant:
npm i vant -S

或者

yarn add vant

在package.json文件中看到上面效果即安装成功

3.2. 引入与注册

-​ 在main.js 文件中引入vant 对应的js和css 文件

//导入所有组件
import Vant from 'vant';
import 'vant/lib/index.css';Vue.use(Vant)
3.3. vant测试

在src下的App.vue组件中的内容,替换成以下内容进行测试

<template><div id="app"><H1>Home组件测试vant组件</H1><van-button type="primary">主要按钮</van-button><van-button type="info">信息按钮</van-button><van-button type="default">默认按钮</van-button><van-button type="warning">警告按钮</van-button><van-button type="danger">危险按钮</van-button></div>
</template><script>export default {name: 'App',components: {}
}
</script><style lang='less' scoped>
h1{color: #25a4bb;margin-bottom: 15px;
}
</style>

效果图

四、axios 工具封装
4.1. 下载安装axios
npm install axios
4.2. 创建axios实例

在src目录下创建utils目录, 创建request.js 文件.

// 导入axios
import axios from 'axios';
// 使用自定义配置新建一个axios 实例,对axios 做一些基础配置
const instance = axios.create({baseURL: 'http://kumanxuan1.f3322.net:8001/',timeout: 5000,headers: { 'X-Custom-Header': 'foobar' }
});export default instance
4.3. 配置拦截器
// 添加请求拦截器
instance.interceptors.request.use(function (config) {//请求之前执行该函数, 一般在该处设置tokenlet token = localStorage.getItem("token");if (token) {config.headers["token"] = token}// 在发送请求之前做些什么return config;
}, function (error) {// 对请求错误做些什么return Promise.reject(error);
});//响应拦截器
instance.interceptors.response.use(response => {//1.非200响应//2.token过期//3.异地登陆//4.非对象加密的解密return response.data
})
4.4. api管理

在src目录下创建https 目录, 目录下创建http.js 文件,该文件主要用来管理所有的http请求的,如下:

// 所有的请求都放在该目录
import instance from "../utils/request";//1. 获取首页数据列表
export function getIndexList() {return instance.get('/index/index')
}//2. 分类页 Category
// 全部分类数据接口
export function GetChannelDataApi(params) {return instance({url: '/api/catalog/index',method: 'get',params})
}// 3.根据关键字搜索接口
export function GetSearchData(params) {return instance.get('/goods/list', {params})
}//4.登陆
export function GoLogin(params) {return instance({url: '/auth/loginByWeb',method: 'post',data: params})
}//5.根据id查询对应数据接口
export function getDetailData(params) {return instance.get('/goods/detail', {params})
}
4.5. 跨域代理配置
devServer: {port: 8080,proxy: {'/api': {target: "http://kumanxuan1.f3322.net:8001/",pathRewrite: {'^/api': ''}}}}

由于配置文件修改了,这里一定要记得重新 npm run serve !!

五、动态路由
5.1. 下载vue-router
npm install vue-router
5.2. 组件注册

在src下创建router文件夹,并添加index.js,再次文件中安装使用vue-router

import Vue from 'vue'
import VueRouter from 'vue-router'Vue.use(VueRouter)
5.3. 主页路由
// 配置项目路由
const router = new VueRouter({routes: [{path: '/',redirect: '/home' // 重定向},{path: '/home', //首页name: 'Home',component: () => import('@/views/home/Home'),meta: {isShowTabbar: true}// children: [ // 二级路由 不能加'/' 加'/'表示一级路由//   {//     path: 'searchPopup',//     component: () => import('@/views/home/search/searchPopup.vue'),//     name: 'searchpopup',//     meta: {//       isshowtabbar: false//     },//   }// ],}]
})
5.4. 实例挂载

main.js: router 挂载到根实例对象上
在main.js 文件中引入router 文件下的index.js 路由配置文件,并在根实例中注册。

// 在 入口文件mian.js 引入路由文件
import router from '@/router/index.js';
new Vue({render: h => h(App),router  // router 挂载到根实例对象上
}).$mount('#app')

根据路由配置,在src目录下的views 文件中,分别创建tabbar 对应的组件文件。
components /AppTabBar.vue

<template><div class="app-tab-bar"><!-- 下方导航 --><van-tabbarv-model="active"active-color="#ee0a24"inactive-color="#000"@change="onChange"shape="round"route><van-tabbar-item icon="home-o" to="/home">首页</van-tabbar-item><van-tabbar-item icon="label-o" to="/topic">专题</van-tabbar-item><van-tabbar-item icon="apps-o" to="/category">分类</van-tabbar-item><van-tabbar-item icon="shopping-cart-o" to="/cart">购物车</van-tabbar-item><van-tabbar-item icon="user-o" to="/user">我的</van-tabbar-item></van-tabbar></div>
</template><script>
export default {name: "app-tab-bar",data () {return {active:0}},methods: {onChange(m) {this.active = m},},
};
</script><style></style>
5.5. 创建home页面

在src/views下创建home文件夹,并创建Home.vue页面
内容如下:

<template><div><H1>Home组件测试vant组件</H1><van-button type="primary">主要按钮</van-button><van-button type="info">信息按钮</van-button><van-button type="default">默认按钮</van-button><van-button type="warning">警告按钮</van-button><van-button type="danger">危险按钮</van-button></div>
</template><script>
export default {name: "Home"
}
</script><style lang='less' scoped>
h1{color: #25a4bb;margin-bottom: 15px;
}
</style>
5.6. 引入 AppTabBar

将AppTabBar.vue导入app.vue 跟组件,将App.vue内容覆盖即可

<template><div id="app"><!-- 路由匹配到的组件将显示在这里 --><router-view> </router-view><!-- 底部tabbar 组件 --><AppTabBar v-show="$route.meta.isShowTabbar"></AppTabBar></div>
</template><script>
import AppTabBar from "@/components/AppTabBar";export default {name: 'App',components: {AppTabBar,},}
</script>
<style lang='less' scoped></style>

启动项目

npm run serve

六、优化
6.1. 路由守卫

在router 目录下的index.js 文件中,设置路由前置守卫,代码案例如下,用来判断购物车页面只能在用户登录的情况下才能查看。

// 路由前置守卫
router.beforeEach((to, from, next) => {// 有token就表示已经登录// 想要进入购物车页面,必须有登录标识token// console.log('to:', to)// console.log('from:', from)let token = localStorage.getItem('token')if (to.path == '/cart') {// 此时必须要有tokenif (token) {next(); // next()去到to所对应的路由界面} else {Vue.prototype.$toast('请先登录');// 定时器setTimeout(() => {next("/user"); // 强制去到"/user"所对应的路由界面}, 1000);}} else {// 如果不是去往购物车的路由,则直接通过守卫,去到to所对应的路由界面next()}
})
6.2. 异常修复

编程式导航在跳转到与当前地址一致的URL时会报错,但这个报错不影响功能:
在src/router/index.js中新增以下内容

// 该段代码不需要记,理解即可
// 在vue-router在3.1.0版本之后,push和replace方法会返回一个promise对象,如果跳转到相同的路由,就报promise uncaught异常
const originalPush = VueRouter.prototype.push;
VueRouter.prototype.push = function push(location) {return originalPush.call(this, location).catch((err) => err);
};
6.3. 路由懒加载

在src/main.js中新增

// 引入vant 提供过的懒加载
import { Lazyload } from 'vant';Vue.use(Lazyload);

vue2.x vant2.x H5 移动端脚手架相关推荐

  1. android h5 禁止缩放,vue h5移动端禁止缩放代码

    vue h5移动端禁止缩放代码 安卓 在index.html里面写 ios 在APP.vue里面写 window.onload = function() { document.addEventList ...

  2. pdfh5.js 基于pdf.js和jQuery,web/h5/移动端PDF预览手势缩放插件。

    pdfh5.js 基于pdf.js和jQuery,web/h5/移动端PDF预览手势缩放插件. 注意:本地绝对路径地址不能加载,跨域问题用代理或者服务端解决. svg模式渲染存在缺陷,只能渲染普通pd ...

  3. H5 移动端 获取腾讯地图计算两经纬度的实际距离(可批量)_多地打卡

    文章目录 一.H5移动端 1. 安装vue-jsonp 2. 引入腾讯sdk 3. 实例化 4. 二点求距离 5. 多点求距离 文档地址: https://lbs.qq.com/service/web ...

  4. php清除h5格式,移动端H5页面端怎样除去input输入框的默认样式

    这次给大家带来移动端H5页面端怎样除去input输入框的默认样式,移动端H5页面端除去input输入框的默认样式的注意事项有哪些,下面就是实战案例,一起来看一下. 前两天在开发在微信访问的HTML5页 ...

  5. html5首页图标怎么除掉,移动端H5页面端如何除去input输入框的默认样式

    移动端H5页面端如何除去input输入框的默认样式 发布时间:2020-09-29 16:41:58 来源:亿速云 阅读:124 作者:小新 这篇文章主要介绍了移动端H5页面端如何除去input输入框 ...

  6. H5移动端项目案例、web手机微商城实战开发

    自微信生态圈一步步强大后,关于移动端购物的趋势,逐渐成为大众关心的内容,目前市场上关于移动商城的制定就有大量版本,比如.微商城.移动商城.移动webAPP.微信商城各等各种定义层出不穷,这就对于移动端 ...

  7. 开源全平台版知识付费系统源码 支持微信小程序+公众号+H5+PC端

    分享一个开源全平台版知识付费系统源码,系统支持微信小程序+公众号+H5+PC端,一套系统实现全端数据及用户体系全面打通,轻松实现店铺全网一站式运营.含完整代码包和详细搭建教程. 系统支持视频课程.音频 ...

  8. tv端h5_最新版H5双端影视APP源码

    最新版H5 双端影视app 源码 V3 全新后台 下载页美化 后台登录 bug 修复 准备工作 1.将源码解压到新的文件夹: 2.使用 notepad++批量替换 URL[http://demo.co ...

  9. JSAPI支付——H5网页端调起支付接口

    1 /**2 * JSAPI支付--H5网页端调起支付接口3 */4 class JsApi_pub extends Common_util_pub5 {6 var $code;//code码,用以获 ...

最新文章

  1. Hive时间是String格式截取字串和转换数据类型小贴士
  2. Python 技术篇-使用pygame库实现音乐播放实例演示,带漂亮小界面!
  3. 尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(一)
  4. 注意.NET Core进行请求转发问题
  5. 领域应用 | NLP 和知识图谱:金融科技领域的“双子星”
  6. 红橙Darren视频笔记 筛选View 属性动画 Adapter模式 组合动画AnimatorSet 观察者模式(对比Android ListView) 练习
  7. WebService、RMI、RPC、XML-RPC、JSON-RPC、SOAP、REST(rest-api、restful)等web服务实现方案概念...
  8. RGB与YUV的转换
  9. etcdctl的使用
  10. MATLAB中定积分的求解
  11. 【UX/UI原型模板】中国地图元件库操作说明(省份+直辖市+自治区+行政特区详细地图)
  12. ASIO Link Pro 声卡跳线(搭配福克斯特solo声卡)
  13. 踩坑日记:Parameter ‘XXX‘ not found. Available parameters are [param5, param6]解决一下午。。。。
  14. linux 防火墙加固,Iptables 加固服务器安全
  15. 【散分】庆祝自己的csdn博客突破100万访问量
  16. 导出excel文件 java_java实现导出excel文件
  17. DPG(确定策略梯度)
  18. 威联通TS-532x 篇一: ssh admin登录密码
  19. 向日葵远程连接,对面电脑无法操作,但鼠标可移动
  20. Mysql进阶三板斧(一)带你彻底搞懂View视图的原理及应用

热门文章

  1. 新当选ACM Fellow李向阳教授:心有理想 向阳而生
  2. 史上最强虎妈:她是一介农妇,17岁嫁给50岁老头,23岁守寡,却养出35个博士...
  3. 苦思冥想时,吃什么,尝一口,酥脆掉渣,鲜掉眉毛!
  4. 坚持早起21天,每月躺赚5000元!
  5. (pytorch-深度学习系列)pytorch中backwards()函数对梯度的操作
  6. c++实现决策树分类汽车评估数据集_R有监督机器学习-分类方法
  7. ubuntu 安装cmake
  8. 如何为Kubernetes实现原地升级
  9. Serverless 服务选型
  10. 冠赢网络:游戏盾彻底解决DDoS/CC攻击