详解搭建一个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 相关文章推荐
Script的加载方法小结
Jan 12 Javascript
动态创建样式表在各浏览器中的差异测试代码
Sep 13 Javascript
javascript中replace( )方法的使用
Apr 24 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
Jun 16 Javascript
Jquery 效果使用详解
Nov 23 Javascript
JavaScipt中栈的实现方法
Feb 17 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
Feb 23 Javascript
javascript实现任务栏消息提示的简单实例
May 31 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
Nov 06 Javascript
关于Vue的路由权限管理的示例代码
Mar 06 Javascript
在vue 中使用 less的教程详解
Sep 26 Javascript
详细聊聊浏览器是如何看闭包的
Nov 11 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中用文本文件做数据库的实现方法
2008/03/27 PHP
php_xmlhttp 乱码问题解决方法
2009/08/07 PHP
PHP时间戳与日期之间转换的实例介绍
2013/04/19 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
php 输出json及显示json中的中文汉字详解及实例
2016/11/09 PHP
你必须知道的Javascript知识点之&quot;字面量和对应类型&quot;说明介绍
2013/04/23 Javascript
5秒后跳转到另一个页面的js代码
2013/10/12 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
浅谈js的html元素的父节点,子节点
2016/08/06 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
2016/12/07 Javascript
vue实现百度搜索下拉提示功能实例
2017/06/14 Javascript
js 实现碰撞检测的示例
2020/10/28 Javascript
[52:09]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第二场
2014/05/26 DOTA
Python continue语句用法实例
2014/03/11 Python
Python面向对象特殊成员
2017/04/24 Python
解决Pycharm出现的部分快捷键无效问题
2018/10/22 Python
python存储16bit和32bit图像的实例
2018/12/05 Python
Python常用模块之requests模块用法分析
2019/05/15 Python
分享一个pycharm专业版安装的永久使用方法
2019/09/24 Python
Python实现对adb命令封装
2020/03/06 Python
Python 忽略文件名编码的方法
2020/08/01 Python
python中zip()函数遍历多个列表方法
2021/02/18 Python
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
澳洲在线厨具商店:Kitchen Style
2018/05/05 全球购物
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
Vision Direct比利时:在线订购隐形眼镜
2019/08/27 全球购物
股权转让协议书范本
2014/04/12 职场文书
党支部活动策划方案
2014/08/18 职场文书
深入开展党的群众路线教育实践活动心得体会
2014/11/05 职场文书
2015年幼儿园保育工作总结
2015/05/12 职场文书
初中班干部工作总结
2015/08/10 职场文书
改进工作作风心得体会
2016/01/23 职场文书
《葡萄沟》教学反思
2016/02/23 职场文书
2019年国庆祝福语(70句)
2019/09/19 职场文书
《家世》读后感:看家训的力量
2019/12/30 职场文书
Python  lambda匿名函数和三元运算符
2022/04/19 Python