vue移动端开发全家桶
Posted 鱼樱、、
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue移动端开发全家桶相关的知识,希望对你有一定的参考价值。
一句命令搞定全家桶: npm install vue-router vue-resource vuex --save
main.js配置:
import Vue from ‘vue‘
import VueResource from ‘vue-resource‘
import VueRouter from ‘vue-router‘
import Vuex from ‘vuex‘
import App from ‘./App.vue‘
Vue.use(VueResource)
Vue.use(VueRouter)
Vue.use(Vuex)
new Vue({
el: ‘#app‘,
render: h => h(App)
})
其他预处理器sass/less、ui组件、插件按项目/需求各自喜好加载。
rem 适配:(index.html引入)
!function (window) {
/* 设计图文档宽度 */
var docWidth = 750;
var doc = window.document,
docEl = doc.documentElement,
resizeEvt = ‘orientationchange‘ in window ? ‘orientationchange‘ : ‘resize‘;
var recalc = (function refreshRem () {
var clientWidth = docEl.getBoundingClientRect().width;
/* 8.55:小于320px不再缩小,11.2:大于420px不再放大 */
docEl.style.fontSize = Math.max(Math.min(20 * (clientWidth / docWidth), 11.2), 8.55) * 5 + ‘px‘;
return refreshRem;
})();
/* 添加倍屏标识,安卓为1 */
docEl.setAttribute(‘data-dpr‘, window.navigator.appVersion.match(/iphone/gi) ? window.devicePixelRatio : 1);
if (/iP(hone|od|ad)/.test(window.navigator.userAgent)) {
/* 添加ios标识 */
doc.documentElement.classList.add(‘ios‘);
/* IOS8以上给html添加hairline样式,以便特殊处理 */
if (parseInt(window.navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/)[1], 10) >= 8)
doc.documentElement.classList.add(‘hairline‘);
}
if (!doc.addEventListener) return;
window.addEventListener(resizeEvt, recalc, false);
doc.addEventListener(‘DOMContentLoaded‘, recalc, false);
}(window);
# 移动端点击事件300ms延迟
建议使用 fastclisk 插件,在 webpack 入口文件 main.js 中如下配置:
const FastClick = require(‘fastclick‘);
document.addEventListener(‘DOMContentLoaded‘, function () {
FastClick.attach(document.body);
}, false);
# 异步加载组件(以YDUI为例)
打包构建应用时,javascript 包会变得非常大,影响页面加载。为了提高效率,可以把不同路由对应的组件分割成不同的代码块,当路由被访问的时候才加载对应组件。
可以通过 Vue 的 异步组件 和 Webpack 的 code splitting feature 实现:
import Vue from ‘vue‘;
import VueRouter from ‘vue-router‘;
Vue.use(VueRouter);
const router = new VueRouter({
routes: [
{
path: ‘/XXX1‘,
component: resolve => require([‘./routers/XXX1.vue‘], resolve) /* <== 主要代码是这 */
},
{
path: ‘/XXX2‘,
component: resolve => require([‘./routers/XXX2.vue‘], resolve) /* <== 主要代码是这 */
}
]
});
import App from ‘./app.vue‘;
const app = new Vue({
router,
render: v => v(App)
}).$mount(‘#app‘);
# 页面切换加载中提示
当用户网络较慢时,异步加载组件需要一定时间,此时显示加载中动画相对比较友好。 可以通过 vue-router 和 vuex 轻松实现:
首先通过 vuex 定义一个状态(isLoading):
import Vue from ‘vue‘;
import Vuex from ‘vuex‘;
const store = new Vuex.Store({
state: {
isLoading: false
},
mutations: {
updateLoadingStatus(state, isLoading) {
state.isLoading = isLoading;
}
}
});
const app = new Vue({
store,
router,
render: v => v(App)
}).$mount(‘#app‘);
其次通过 vue-router 的 beforeEach 和 afterEach 更改 isLoading 状态:
router.beforeEach((route, redirect, next) => {
/* 显示加载中动画 */
store.commit(‘updateLoadingStatus‘, true);
next();
});
router.afterEach(route => {
/* 隐藏加载中动画 */
store.commit(‘updateLoadingStatus‘, false);
});
最后在 App.vue 里通过 isLoading 显示/隐藏加载中动画即可:
<template>
<div style="height: 100%;"><!-- 特别注意:若页面结构使用 yd-layout 组件时,这里需加上 height: 100%; -->
<div v-show="isLoading">加载中</div>
<router-view v-show="!isLoading"></router-view>
</div>
</template>
<script type="text/babel">
export default {
computed: {
isLoading() {
return this.$store.state.isLoading
}
}
}
</script>
以上是关于vue移动端开发全家桶的主要内容,如果未能解决你的问题,请参考以下文章
Vue全家桶开发Android和IOS移动端应用常见问题解决
Vue全家桶开发Android和IOS移动端应用常见问题解决