使用vue2.0 vue-router vuex 模拟ios7操作
其实你也可以,甚至做得更好...
首先看一下效果:用vue2.0实现SPA:模拟ios7操作 与 通讯录实现
github地址是:https://github.com/QRL909109/ios7 如果您觉得可以,麻烦给一个star,支持我一下。
之前接触过Angular1.0,React,都只是学点入门,但对于Vue却觉得很容易上手,不止入门简单,插件也是很丰富的,脚手架也是便利的很...
项目分析:
1.首屏滑动解锁,并能移动小圆点
2.主屏幕 长按图标抖动,删除图标,点击小圆点的主屏幕 抖动停止
3.点击电话图标,进入电话模块
4.进入个人中心:点击编辑,移入删除图标,滑动出现删除;点击完成,删除图标消失
5.进入通讯录:右侧固定栏滑动 列表滑动到相应位置(使用better-scroll 插件)
6.进入拨号:拨号与删除
插件介绍:
vue-router: vue路由插件 vue-router 2.0 中文文档
vuex: vue状态管理 vuex 1.0 中文文档 方便组件共用状态
better-scroll: 优化滑动性能的插件
lib-flexible: 手淘移动端H5 终端适配
moment: 时间格式化插件
项目布局:
采用手淘的flexible 这里有学习资源 使用Flexible实现手淘H5页面的终端适配
要点:
1.根据手机dpr设置不同的scale,font-size (注意ios的dpr会适应变化,而Android的dpr一直为1)
2.整个屏幕宽度默认为10rem,采用750设计稿上下兼容,1rem = 75px
3.文字用px写,分别写出兼容
div{font-size:12px; }[data-dpr="2"]{font-size:24px; }[data-dpr="3"]{font-size:36px; }
4.采用flex弹性布局(注意兼容高低版本)
开始:(挑有用重点讲)
1、修改webpack.base.conf.js
利用webpack alias定义别名,方便输入路径,根据完整绝对地址
例如:
resolve: {extensions: ['', '.js', '.vue'],fallback: [path.join(__dirname, '../node_modules')], alias: {'vue$': 'vue/dist/vue','src': path.resolve(__dirname, '../src'),'assets': path.resolve(__dirname, '../src/assets'),'components': path.resolve(__dirname, '../src/components'),'store':path.resolve(__dirname,'../src/vuex/store'),'getters':path.resolve(__dirname,'../src/vuex/getters'),'actions':path.resolve(__dirname,'../src/vuex/actions'),'mock':path.resolve(__dirname,'../src/mock')}},
这样只要在任意位置使用 import ... from actions
webpack将会自动匹配actions的位置,不用再去计算文件位置,写出'../../../actions'。
2、配置路由:在src目录下新建 route-config.js
const routes=[{path: '/main',name: 'main',meta: {title: '主页面'},component: resolve => {require(['./views/main.vue'], resolve)},children: [{path: '',name: 'personal',meta: {title: '个人收藏'},component: resolve => {require(['./views/phone/personal.vue'], resolve)},children:[phone_detail]}]},{.... },{path: '*',redirect: {name: 'main'}} ]; export default routes
这里采用异步组件,按需加载,使用webpack的代码分割功能。
路由机制是采用匹配规则,根据path匹配URL的路径,从而加载对应的组件。
这里稍微提一下vue-router 1.0 和 vue-router 2.0 写法的区别
vue-router1.0
传递vue-router实例,通过map进行定义路由映射
vue-router2.0
使用router 构造配置 routes
tips: 设置标题栏的title
通过vue-router实例后的afterEach,to能获取每个路由的状态,这时候便能使用document.title = to.meta.title (前提是router-config 里面有设置meta对象)
3、APP.vue结构
考虑到小圆点是所有页面都存在的,所以结构为router-view加载路由匹配页面,另外加载小圆点组件。
<template><div class="_full"><!-- app router --><transition name="bounce"><keep-alive><router-view></router-view></keep-alive></transition><!--小圆点--><topPoint></topPoint></div> </template>
或许你有疑惑 keep-alive 加在这有什么用?
keep-alive 会缓存不活动的组件实例,而不是销毁它们。主要用于保留组件状态或避免重新渲染
在做“个人收藏”模块遇到很诡异的bug (没加 keep-alive)
刚开始能删除数据,但跳转到其他页面重新回来后,就不能执行删除了。
后面一分析才知道,在从其他页面跳转回来后,组件重新渲染,再次请求了列表数据,而页面的数据却缓存着,导致数据不一致。加入keep-alive就能保留组件状态
4、v-touch不兼容vue2.0解决方案
本以为应该会有插件支持的,结果没法找到,只能自己写简单指令识别下。(只支持长按 press,向上 swipeup,向下 swipedown,向左swipeleft,向右 swiperight)
使用 v-touch:swiperight="methodFunc"
vue指令 touch 使用bind,
- binding.arg 获得传入模式
- el 监听绑定的事件
- binding.value 获得传入的事件
通过对touchstart touchmove touchend 的判断,执行对应的事件。
5、引入better-scroll插件
功能:优化滚动,能模仿像原生弹性的效果
使用:需要在外部包含固定高度的容器
<div ref="scrollWrapper"><ul><li v-for="item in List" class="commit-hook"></li>
</ul> </div><script>import BScroll from 'better-scroll' export default{created(){this.$nextTick(() => { //这里需要异步this._initScroll();})},methods: {_initScroll(){this.containerScroll = new BScroll(this.$refs.scrollWrapper,{click:true //可点击 });}} } </script>
这样将会添加translate,使用贝塞尔曲线,达到原生效果。
如果需要实时知道滚动的区域,可以这么配置:
created(){this.$nextTick(() => {this._initScroll();this._calculateHeight()}) }, methods:{_initScroll(){this.containerScroll = new BScroll(this.$refs.scrollWrapper, {probeType: 3});this.containerScroll.on('scroll', (pos)=> {this.scrollY = Math.abs(Math.round(pos.y)); //实时获取Y轴的数值 })}_calculateHeight(){let commitList = this.$refs.commitBox.getElementsByClassName('commit-hook'); //获取对应的DOM元素let height = 0;this.listHeight.push(height)for (let i = 0; i < commitList.length; i++) {let item = commitList[i]height += item.clientHeight;this.listHeight.push(height)}} } computed: {currentIndex(){ //实时获得当前的区域for (let i = 0; i < this.listHeight.length; i++) {let height1 = this.listHeight[i];let height2 = this.listHeight[i + 1];if (!height2 || (this.scrollY >= height1 && this.scrollY < height2)) {return i;}}return 0;} }
通过对比 v-for的 index 与 currentIndex 就能实时知道位置了。
6、组件间的通信
可以看看我的另一篇文章 vue2.0--组件通信(非vuex法)
主要用到父子 子父 通信方法,但为了方便项目使用 vuex状态管理。
以上的项目很基础,练习一遍,便能比我做的更好... 如有缺漏,做不好的地方,欢迎大家指正讨论。
如果您觉得有帮助,请star一下,给予我更好的支持。
github地址是:https://github.com/QRL909109/ios7
如需转载,请注明出处。
转载于:https://www.cnblogs.com/QRL909109/p/6143394.html
使用vue2.0 vue-router vuex 模拟ios7操作相关推荐
- Vue 2.0 + Vue Router + Vuex 后台管理系统的骨架
https://github.com/helloyoucan/ba 用 Vue.js 2.x 与相配套的 Vue Router.Vuex 搭建了一个最基本的后台管理系统的骨架. 当然先要安装 node ...
- 【Vue2.0学习】—Vuex工作原理图(二十五)
[Vue2.0学习]-Vuex工作原理图(二十五) 一. Vuex 是什么? 概念: 专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对Vue应用中多个组件的共享状态进行集中式的管理(读/写 ...
- Vue+Vue Router+Vuex页面演示
Vue+Vue Router+Vuex简单页面演示 1.目录结构(使用vue-cli创建) 2.编写代码 src/router/index.js import Vue from "vue&q ...
- Vue2.x - Vue Router
目录 Vue与SPA 什么是SPA 简单了解SPA 什么是MPA SPA相较于MPA的优点 实现SPA的几个关键点 理解SPA单页面架构 什么是前端路由 锚链接与URL中的hash值 通过hashch ...
- Vue2.0 Vue路由_路由的几个注意点
1.一般组件和路由组件 一般用import引入组件.components注册组件.<组件名 />或<组件名></组件名>这样的写法被我们称为一般组件 而我们没像上面 ...
- Vue2.0 Vue组件 单文件组件
聊到单文件就要写道xxx.vue,但是.vue文件浏览器是不认识的得处理和加工成.js怎么处理和加工 渠道一: webpack 渠道二: 借助Vue官方提供的脚手架(官方给你搭建的整个webpack编 ...
- Vue2.0 Vue脚手架 scopde样式
学习scoped样式 问题 School.vue <template><div class="demo"> <h2>学校名称:{{name}}& ...
- vue 专题 vue2.0各大前端移动端ui框架组件展示
Vue 专题 一个数据驱动的组件,为现代化的 Web 界面而生.具有可扩展的数据绑定机制,原生对象即模型,简洁明了的 API 组件化 UI 构建 多个轻量库搭配使用 请访问链接: https://ww ...
- 【Vue】双向数据绑定原理 vue2.0 与 vue3.0
目录 一.什么是双向数据绑定? 二.双向数据绑定原理 vue2.0 三.Vue 3.0使用ES6的新特性porxy 四.思考 一.什么是双向数据绑定? vue是一个mvvm框架,即数据双向绑定,即当数 ...
最新文章
- python 日志输出模块--两种方法
- 手把手教你刷新BACKUP Bios
- 实际开发什么场景用到线程池_线程池的具体业务场景分析
- python错误怎么处理_python报的错误怎么处理
- 店招模块终于可以进行后台换图片了
- Linux 进程后台运行
- SpringBoot集成Cache缓存(Ehcache缓存框架,注解方式)
- Linux用户和用户组和文件权限介绍
- 服务器文件重命名称,在服务器重命名文件与Python
- xxx.lib(xxx.obj)fatal error LNK1103: debugging information corrupt; recompile module 的解决方案
- LINUX下载编译uuid
- 编辑器Sublime Text安装配置
- 三角形边长求高的c语言函数公式,三角形边长计算公式
- 百度地图图层开发java_Android百度地图应用之图层展示
- 分享一个超大文件编辑器(WINDOWS 文本编辑器)
- 平均年薪60.8万,Linux开发拿下这个证书有多吃香?
- Vue报错:implicitly has an ‘any‘ type解决方法
- protonmail邮箱注册
- 为什么UUID是唯一的
- 信修修:安全省心!U盘安装纯净原版Win10系统教程!
热门文章
- android常见错误与问题
- 【备忘1】防止表格/层 被撑破的CSS控制代码
- CV05-ResNet笔记
- 计算机设备管理器不显示com,台式机设备管理器打开是空白怎么办_win10设备管理无法显示解决方法...
- 我使用Python和Django在自己的网站上建立了一个会员专区。 这是我学到的东西。
- 渐进式web应用程序_渐进式Web应用程序简介
- web应用的绝对路径和相对路径
- 呼伦湖国家级自然保护区管理局投放草料保野生黄羊过冬
- 组策略 从入门到精通(二) 如何区别跨越WAN网的计算机对组策略的套用
- javascript promise编程