vue2.x vant2.x H5 移动端脚手架

在这里插入图片描述

文章目录

          • 一、前置准备
            • 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.1Rem 布局适配
postcss-pxtorem^5.1.1Rem 布局适配
less^4.1.2css编译
less-loader^5.0.0css编译
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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

相见恨晚!遗憾仅有不到1% 的人知道

广泛在各领域被应用的数据分析&#xff0c;现在已经是任何岗位任何职业都需要用到的技能。即便不从事职业的数据分析&#xff0c;掌握一定的数据处理能力也将成为你职场中绝对的加分项。为了跟上人才市场的能力需求&#xff0c;许多做技术开发的同学也加入了数据分析的学习热潮…

【机器人】标记不友好评论,AI工作效果是人类的4.4倍

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 不友好的评论对于系统而言是一个大问题&#xff0c;因为他们的语气会影响被评论者和未来读者对 Stack Overflow 的贡献意愿。…

VBA 常用代码及自定义函数备忘

文章目录 1. 函数1.1 Windows API1.1.1 改变当前鼠标指针形状1.1.2 Sleep 程序休眠1.2 自定义函数1.2.1 去除空格1.2.2 测试图片格式1.2.3 获取打印机信息1.2.4 GB/T 8170 修约1.2.5 邮箱格式检查1.2.6 汉字转拼音1.2.7 列标签字母与列序号数值转换1.2.8 大小写金额转换1.2.9 分…

2020年云计算的十大新兴趋

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 人们将在2020年可能会看到一些顶级云计算趋势主题&#xff0c;其中包括人工智能、自动化和多云的更大发展。 随着越来越多的…

各企业正在纷纷向“云”,背后有着哪些原因?

撰者 | Emil Sayegh译者 | Katie&#xff0c;责编 | Jerry来源 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;在全球大流行的初期&#xff0c;各地企业的目标很简单&#xff1a;继续运营。社交隔离要求使得零售&#xff0c;银行&#xff0c;医疗&#xff0c;教…

如何在Java代码中去掉烦人的“!=null”

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 问题 为了避免空指针调用&#xff0c;我们经常会看到这样的语句 if (someobject ! null) {someobject.doCalc(); } 最终&a…

vue TypeError: Cannot read property ‘upgrade‘ of undefined

这个错误的原因是&#xff1a; vue.config.js 中配置的 proxy 中的 target 上设置的 process.env.xxxxx 不存在。

吐血整理:手拿几个大厂offer的秘密武器!

怎样才能拿到大厂的offer&#xff1f;没有掌握绝对的技术&#xff0c;那么就要不断的学习。如何拿下阿里等大厂的offer呢&#xff0c;今天分享一个秘密武器&#xff0c;资深架构师整理的Java核心知识点&#xff0c;面试时面试官必问的知识点&#xff0c;篇章包括了很多知识点&a…

拿下 Gartner 容器产品第一,阿里云打赢云原生关键一战!

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 近日&#xff0c;Gartner 发布 2020 年公共云容器报告&#xff0c;据报告显示&#xff0c;阿里云和 AWS 拥有最丰富的产品布局…

银河证券上云 打开互联网金融思维的魔盒

云栖号案例库&#xff1a;【点击查看更多上云案例】 不知道怎么上云&#xff1f;看云栖号案例库&#xff0c;了解不同行业不同发展阶段的上云方案&#xff0c;助力你上云决策&#xff01; 近些年&#xff0c;很多证券公司纷纷设立“互联网金融”部门&#xff0c;推出创新业务&a…

如何轻松地将可访问LAN的Pod部署到Kubernetes集群上

撰者 | Jack Wallen 译者 | Katie&#xff0c;责编 | Jerry来源 | CSDN云计算封图 | CSDN 下载自视觉中国想要在Kubernetes集群上部署可访问LAN的Pod来达到目的&#xff1f;接下来就展示一下它实际上是多么容易。Kubernetes更具挑战性的方面之一是部署到集群&#xff0c;同时使…

车市下滑 领克汽车为什么逆势上扬?

云栖号案例库&#xff1a;【点击查看更多上云案例】 不知道怎么上云&#xff1f;看云栖号案例库&#xff0c;了解不同行业不同发展阶段的上云方案&#xff0c;助力你上云决策&#xff01; 2018年末开始&#xff0c;寒潮席卷中国汽车市场。热了20多年的中国车市&#xff0c;迎来…

使用Vant完成DatetimePicker 日期的选择器

效果演示&#xff1a; 代码 <template><div> <!-- 输入框形式--><van-fieldreadonlyclickablename"calendar":value"timeValue"label"日期选择&#xff1a;"placeholder"发生事故的时间点"click"showP…

彩生活云上转型 打造全球最大社区服务运营商

云栖号案例库&#xff1a;【点击查看更多上云案例】 不知道怎么上云&#xff1f;看云栖号案例库&#xff0c;了解不同行业不同发展阶段的上云方案&#xff0c;助力你上云决策&#xff01; 在房地产行业增速放缓的大环境下&#xff0c;转型焦虑几乎已经弥漫整个地产行业&#xf…

谷歌这波操作,预警了什么信号??

我们都知道谷歌爸爸收购了Cask Data一家公司。长期以来&#xff0c;谷歌致力于推动围绕 GoogleCloud 的企业业务&#xff0c;但在这方面一直被亚马逊和微软吊打&#xff0c;这次的收购正是为了弥补自身的短板。被收购的 Cask Data 是一家专门提供基于Hadoop的大型数据分析服务解…

【开发者成长】“机器学习还是很难用!”

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 机器学习仍然很难用&#xff0c;但情况开始有所改善了。 以下为译文&#xff1a; 我是一名Cortex贡献者&#xff0c;Cortex是…

这个年均开销3500万美元的 FBI 机密部门,将结合面部识别与大数据技术来调查案件...

撰者 | Thomas Brewster译者 | Katie&#xff0c;责编 | Jerry来源 | CSDN云计算FBI面部识别大数据&#xff0c;瞄准恐怖犯罪事件在发生大规模枪击或恐怖袭击后&#xff0c;调查人员可能会留有数小时的闭路电视录像&#xff0c;证人的视频或社交媒体的剪辑。以2013年的波士顿马…

节省50%部署时间的5大KS8服务

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; Kubernetes已然成为IT世界的重要组成部分&#xff0c;并且仍在不断地发展壮大&#xff0c;现阶段&#xff0c;Kubernetes已经…

耗时又繁重的SQL诊断优化,以后就都交给数据库自治服务DAS吧!

作者&#xff1a;斯干&#xff0c;阿里云数据库高级技术专家 在我们业务系统中&#xff0c;数据库越来越扮演着举足轻重的角色。 和其它公司一样&#xff0c;在阿里巴巴业务场景下&#xff0c;大部分业务跟数据库有着非常紧密的关系&#xff0c;数据库一个微小的抖动都有可能…