Vue仿今日头条实例详解


Posted in Javascript onFebruary 06, 2018

前言

vue也弄了一段时间了, 前段时间一直想用vue写个移动端,加之年底也不是很忙,于是前几天便着手开始弄了,到今天为止也算是勉强能看了

因为也是纯粹的写写前端页面,所以数据方面用的是mock.js,为了真实的模拟请求,可以直接在 Easy Mock 自己生成API
也可直接登陆我这项目的Easy Mock账号密码:

账号: vue-toutiao
密码: 123456

如果你想修改接口,请copy一份在修改

如果你想后台接口也自己开发的话。可以阅读我这篇博客 Vue + Node + Mongodb 开发一个完整博客流程

技术栈:

vue + webpack + vuex + axios

结构:

  • build: webpack配置
  • config: 项目配置参数
  • src
  • assets: 静态资源文件,存放图片啥的
  • components: 常用组件。例如 弹窗 等等。。。
  • directive: 常用指令封装
  • router: 路由表
  • store: 状态管理 vuex
  • styles: 样式文件
  • utils: 常用工具类封装
  • views: 视图页面
  • static: 静态文件: 存放 favicon.ico 等等
  • 此项目用到了 DllPlugin 进行打包处理,所有启动该项目时记得,先执行一次该脚本命令生成配置

效果演示:

Vue仿今日头条实例详解

Vue仿今日头条实例详解

Vue仿今日头条实例详解

Vue仿今日头条实例详解

Vue仿今日头条实例详解

几个常用的知识点

1. 路由懒加载

{
  path: '/development',
  name: 'development',
  component: (resolve) => {
    require(['../views/development.vue'], resolve)
  }
}

const _import_ = file => () => import('views/' + file + '.vue')

{
  path: '/development',
  name: 'development',
  component: _import_('development')
}

2. 登陆拦截

通过路由的 beforeEach 钩子函数来判断是否需要登陆

// 如:系统设置需要登陆
{ 
  path: '/system', 
  name: '系统设置', 
  meta: { 
    login: true
  },
  component: _import_('System/index')
}

router.beforeEach((to, from, next) => {
  if (to.meta.login) { //判断前往的界面是否需要登陆
    if (store.state.user.user.name) { // 是否已经登陆
      next()
    }else{
      Vue.prototype.$alert('请先登录!')
        .then( () => {
          store.state.user.isLogin = true
        })
    }
  }else{
    if (to.meta.page) store.state.app.pageLoading = true
    next() 
  }
  
})

3. 动画切换

通过检测设置在 Router上的animate属性 来判断它做什么样的切换动画

Router.prototype.animate = 0

// 获取每个路由meta上面的slide 来判断它做什么动画
{ 
  path: '/system', 
  name: '系统设置', 
  meta: { 
    slide: 1 
  },
  component: _import_('System/index')
}


watch: {
  $route (to, from) {
    /*
    0: 不做动画
    1: 左切换
    2: 右切换
    3: 上切换
    4: 下切换
    ...
     */
    let animate = this.$router.animate || to.meta.slide
    if (!animate) {
      this.animate = '' 
    }else{
      this.animate = animate === 1 ? 'slide-left' :
        animate === 2 ? 'slide-right' :
        animate === 3 ? 'slide-top' :
        animate === 4 ? 'slide-bottom' : ''
    }
    this.$router.animate = 0
  }
}

4. 视频播放

因为在IOS上 无法隐藏video的controls ,所以我们可以隐藏video,通过绘制canvas来达到播放视频的效果

5. icon采用的是 阿里巴巴矢量图

6. mock.js

7. Easy Mock

代码实例:https://github.com/cd-dongzi/vue-project/tree/master/vue-toutiao

Javascript 相关文章推荐
javascript 获取图片颜色
Apr 05 Javascript
分享一个我自己写的ToolTip提示插件(附源码)
Jan 20 Javascript
javascript中的原型链深入理解
Feb 24 Javascript
JS交换变量的方法
Jan 21 Javascript
JavaScript检测原始值、引用值、属性
Jun 20 Javascript
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
Oct 28 Javascript
深入理解JS继承和原型链的问题
Dec 17 Javascript
JavaScript中localStorage对象存储方式实例分析
Jan 12 Javascript
JS实现简单短信验证码界面
Aug 07 Javascript
详解redux异步操作实践
Aug 15 Javascript
详解webpack打包后如何调试的方法步骤
Nov 07 Javascript
Vue实现兄弟组件间的联动效果
Jan 21 Javascript
electron demo项目npm install安装失败的解决方法
Feb 06 #Javascript
详解React开发必不可少的eslint配置
Feb 05 #Javascript
详解js的作用域、预解析机制
Feb 05 #Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
Feb 05 #Javascript
jQuery实现动态显示select下拉列表数据的方法
Feb 05 #jQuery
详解vue静态资源打包中的坑与解决方案
Feb 05 #Javascript
理解Koa2中的async&await的用法
Feb 05 #Javascript
You might like
正则表达式语法
2006/10/09 Javascript
PHP+javascript模拟Matrix画面
2006/10/09 PHP
为你总结一些php信息函数
2015/10/21 PHP
JQUERY复选框CHECKBOX全选,取消全选
2008/08/30 Javascript
JQuery 图片的展开和伸缩实例讲解
2013/04/18 Javascript
javascript实现json页面分页实例代码
2014/02/20 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
深入浅析JavaScript中prototype和proto的关系
2015/11/15 Javascript
BootStrap表单验证实例代码
2017/01/13 Javascript
AngularJS Select(选择框)使用详解
2017/01/18 Javascript
Bootstrap Multiselect 常用组件实现代码
2017/07/09 Javascript
jQuery实现手势解锁密码特效
2017/08/14 jQuery
JavaScript使用atan2来绘制箭头和曲线的实例
2017/09/14 Javascript
分析JS中this引发的bug
2017/12/12 Javascript
Javascript Promise用法详解
2018/05/10 Javascript
vue监听键盘事件的快捷方法【推荐】
2018/07/11 Javascript
JavaScript设计模式之命令模式实例分析
2019/01/16 Javascript
谈谈为什么你的 JavaScript 代码如此冗长
2019/01/30 Javascript
Vue响应式原理Observer、Dep、Watcher理解
2019/06/06 Javascript
微信小程序动态添加和删除组件的现实
2020/02/28 Javascript
[01:05:00]2018国际邀请赛 表演赛 Pain vs OpenAI
2018/08/24 DOTA
python实现基于两张图片生成圆角图标效果的方法
2015/03/26 Python
python下调用pytesseract识别某网站验证码的实现方法
2016/06/06 Python
Python编程实现线性回归和批量梯度下降法代码实例
2018/01/04 Python
python+opencv+caffe+摄像头做目标检测的实例代码
2018/08/03 Python
一个可以套路别人的python小程序实例代码
2019/04/09 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
css3 transform及原生js实现鼠标拖动3D立方体旋转
2016/06/20 HTML / CSS
伦敦哈德森鞋:Hudson Shoes
2018/02/06 全球购物
美国在线咖啡、茶和餐厅供应商:LollicupStore
2018/05/04 全球购物
linux面试相关问题
2012/08/11 面试题
轻金属冶金专业毕业生自荐信
2013/11/02 职场文书
国际会议邀请函范文
2014/01/16 职场文书
军训个人总结
2015/03/03 职场文书
学校食堂管理制度
2015/08/04 职场文书
雄兵连:第三季先行图公开,天使恶魔联合,银河之力的新力量
2021/06/11 国漫