详解搭建一个vue-cli的移动端H5开发模板


Posted in Javascript onJanuary 17, 2020

简介

vue-mobile 是是基于 vue-cli 实现的移动端 H5 开发模板,其中已经搭建好基本的开发框架,可帮助您实现快速开发。 技术栈:vue + vux + axios + less

源码地址:https://github.com/Michael-lzg/vue-mobile

功能

  • 搭建项目目录
  • 配置 css 预处理器
  • 配置 UI 组件库 vux
  • 解决移动端适配
  • 配置页面路由缓存
  • axios 请求封装
  • 工具类函数封装
  • toast 组件封装
  • dialog 组件封装
  • 底部导航组件封装
  • 列表页 demo
  • 表单页 demo
  • 搭建项目目录

按如下文件目录搭建项目框架

src                主要源码目录
|-- assets            静态资源,统一管理
|-- components          公用组件,全局组件
|-- javascript          JS相关操作处理
  |-- ajax           axios封装的请求拦截
  |-- utils           全局封装的工具类
  |-- datas           模拟数据,临时存放
|-- router            路由,统一管理
|-- store             vuex, 统一管理
|-- views             视图目录

配置 css 预处理器

1.安装依赖

npm install less less-loader --sava-dev

2.在 build/webpack.base.conf.js 里参照如下代码进行配置

{
 test: /\.less$/,
 loader: "style-loader!css-loader!less-loader"
}

配置 vux

1.安装依赖

npm install vux vux-loader --save

2.在 build/webpack.base.conf.js 里参照如下代码进行配置

const vuxLoader = require('vux-loader') //把vux-loader引入
module.exports = vuxLoader.merge(webpackConfig, {
 //把新旧配置进行merge(放到页面最底部)
 plugins: ['vux-ui']
})

3.局部注册使用

<group>
 <cell title="title" value="value" />
</group>

import { Group, Cell } from 'vux' //引入所需组件
export default {
 name: 'App',
 components: {
  //注册组件
  Group,
  Cell
 }
}

移动端适配

1.安装依赖

npm install px2rem-loader --save-dev

2.在 build/utils 进行如下配置

const px2remLoader = {
 loader: 'px2rem-loader',
 options: {
  remUnit: 100
 }
}

function generateLoaders(loader, loaderOptions) {
 const loaders = options.usePostCSS ? [cssLoader, postcssLoader, px2remLoader] : [cssLoader, px2remLoader]

 if (loader) {
  loaders.push({
   loader: loader + '-loader',
   options: Object.assign({}, loaderOptions, {
    sourceMap: options.sourceMap
   })
  })
 }

 // Extract CSS when that option is specified
 // (which is the case during production build)
 if (options.extract) {
  return ExtractTextPlugin.extract({
   use: loaders,
   fallback: 'vue-style-loader'
  })
 } else {
  return ['vue-style-loader'].concat(loaders)
 }
}

3.在 main.js 设置 html 跟字体大小

let cale = window.screen.availWidth > 750 ? 2 : window.screen.availWidth / 375
window.document.documentElement.style.fontSize = `${100 * cale}px`

这是最简单的适配方法,后续跟单独对移动端 rem 适配做详细解读。

路由配置

1.通过配置路由对象的 meta[keepAlive]值来区分页面是否需要缓存

routes: [
 {
  path: '/',
  name: 'index',
  meta: { keepAlive: true }, //需要缓存
  component: resolve => {
   require(['../views/index'], resolve)
  }
 },
 {
  path: '/list',
  name: 'listr',
  meta: { keepAlive: false }, //不需要缓存
  component: resolve => {
   require(['../views/list'], resolve)
  }
 }
]

2.在 app.vue 做缓存判断

<div id="app">
 <router-view v-if="!$route.meta.keepAlive"></router-view>
 <keep-alive>
  <router-view v-if="$route.meta.keepAlive"></router-view>
 </keep-alive>
</div>

axios 请求封装

1.设置请求拦截和响应拦截

const PRODUCT_URL = 'https://xxxx.com'
const MOCK_URL = 'http://xxxx.com'
let http = axios.create({
 baseURL: process.env.NODE_ENV === 'production' ? PRODUCT_URL : MOCK_URL
})
// 请求拦截器
http.interceptors.request.use(
 config => {
  // 设置token,Content-Type
  var token = sessionStorage.getItem('UserLoginToken')
  config.headers['token'] = token
  config.headers['Content-Type'] = 'application/json;charset=UTF-8'
  // 请求显示loading效果
  if (config.loading === true) {
   vm.$loading.show()
  }
  return config
 },
 error => {
  vm.$loading.hide()
  return Promise.reject(error)
 }
)
// 响应拦截器
http.interceptors.response.use(
 res => {
  vm.$loading.hide()
  // token失效,重新登录
  if (res.data.code === 401) {
   // 重新登录
  }
  return res
 },
 error => {
  vm.$loading.hide()
  return Promise.reject(error)
 }
)

2.封装 get 和 post 请求方法

function get(url, data, lodaing) {
 return new Promise((resolve, reject) => {
  http
   .get(url)
   .then(
    response => {
     resolve(response)
    },
    err => {
     reject(err)
    }
   )
   .catch(error => {
    reject(error)
   })
 })
}

function post(url, data, loading) {
 return new Promise((resolve, reject) => {
  http
   .post(url, data, { loading: loading })
   .then(
    response => {
     resolve(response)
    },
    err => {
     reject(err)
    }
   )
   .catch(error => {
    reject(error)
   })
 })
}

export { get, post }

3.把 get,post 方法挂载到 vue 实例上。

// main.js
import { get, post } from './js/ajax'
Vue.prototype.$http = { get, post }
工具类函数封装
添加方法到 vue 实例的原型链上
export default {
 install (Vue, options) {
  Vue.prototype.util = {
   method1(val) {
    ...
   },
   method2 (val) {
    ...
   },
 }
}

2.在 main.js 通过 vue.use()注册

import utils from './js/utils'
Vue.use(utils)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
Oct 11 Javascript
Jquery实现三层遍历删除功能代码
Apr 23 Javascript
客户端js性能优化小技巧整理
Nov 05 Javascript
js文件Cookie存取值示例代码
Feb 20 Javascript
js密码强度检测
Jan 07 Javascript
Vue.js实现无限加载与分页功能开发
Nov 03 Javascript
简单谈谈JS中的正则表达式
Sep 11 Javascript
详解bootstrap用dropdown-menu实现上下文菜单
Sep 22 Javascript
javascript按顺序加载运行js方法
Dec 01 Javascript
vue webpack开发访问后台接口全局配置的方法
Sep 18 Javascript
ECharts地图绘制和钻取简易接口详解
Jul 12 Javascript
JavaScript中的全局属性与方法深入解析
Jun 14 Javascript
jQuery实现王者荣耀手风琴效果
Jan 17 #jQuery
JS实现transform实现扇子效果
Jan 17 #Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
Jan 16 #jQuery
浅谈VUE中演示v-for为什么要加key
Jan 16 #Javascript
Vue引入Stylus知识点总结
Jan 16 #Javascript
js实现提交前对列表数据的增删改查
Jan 16 #Javascript
react实现移动端下拉菜单的示例代码
Jan 16 #Javascript
You might like
PHP生成短网址方法汇总
2016/07/12 PHP
laravel学习教程之存取器
2016/07/30 PHP
php中通用的excel导出方法实例
2017/12/30 PHP
asp函数split()对应php函数explode()
2019/02/27 PHP
JavaScript 乱码问题
2009/08/06 Javascript
extjs grid设置某列背景颜色和字体颜色的方法
2010/09/03 Javascript
jquery插件珍藏(图片局部放大/信息提示框)
2013/01/08 Javascript
JavaScript初学者建议:不要去管浏览器兼容
2014/02/04 Javascript
Js实现手机发送验证码时按钮延迟操作
2014/06/20 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
jQuery取得iframe中元素的常用方法详解
2016/01/14 Javascript
JS实现鼠标滑过显示边框的菜单效果
2016/09/21 Javascript
微信小程序 获取当前地理位置和经纬度实例代码
2016/12/05 Javascript
详解vue 实例方法和数据
2017/10/23 Javascript
详解ES6语法之可迭代协议和迭代器协议
2018/01/13 Javascript
原生js实现获取form表单数据代码实例
2019/03/27 Javascript
vue中在vuex的actions中请求数据实例
2019/11/08 Javascript
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
使用python解析xml成对应的html示例分享
2014/04/02 Python
python实现简易学生信息管理系统
2020/04/05 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
Python爬取股票信息,并可视化数据的示例
2020/09/26 Python
利用CSS3实现折角效果实例源码
2016/09/28 HTML / CSS
纽约21世纪百货官网:Century 21
2016/08/27 全球购物
副总经理工作职责
2013/11/28 职场文书
高中生活自我鉴定
2014/01/18 职场文书
新闻传媒系求职信范文
2014/04/19 职场文书
亲子活动总结
2014/04/26 职场文书
售后客服个人自我评价
2014/09/14 职场文书
村委会贫困证明范本
2014/09/17 职场文书
大三学年自我鉴定范文(3篇)
2014/09/28 职场文书
2014年企业党支部工作总结
2014/12/04 职场文书
社区艾滋病宣传活动总结
2015/05/07 职场文书
java多态注意项小结
2021/10/16 Java/Android