本贴记录项目实践中,各种功能的实现与技术要点,均有待改进。

路由切换的时候,显示loading动画

目前方案是: 在每个页面都手动装载一个loading组件
组件的显示依赖vuex里面的一个值 , 在router的beforeEach事件里面控制loading的状态

<template>
<div>
<div v-show="isLoading" class="myloading"><van-loading type="spinner" color="white"/></div>
</div>
</template> <script>
export default {
data(){
return {}
},
computed:{
isLoading(){
return this.$store.state.isLoading
}
}
}
</script> <style>
.myloading{
background-color: #666;padding:20px;border-radius:5px;display:inline-block;
position:fixed;z-index:999999;top:50%; left:50%;transform:translate(-50%,-50%);
}
</style>

main.js的router.beforeEach事件:

    //显示loading
store.commit('setLoading',true)
//延迟一会加载页面,让loading效果显示一会。。。
setTimeout(()=>{
next()
},300);

在vuex里面使用axios

vue脚手架3中,vuex是以单文件存在,即store.js,里面要使用axios

需在头部import axios,然后直接调用axios.get...

不知是否最佳姿势的“用户登录-保存状态”的方案

登录页调用vuex里面的action,获取goken,并写入localstorage

    actions: {
login(state){
return new Promise((resolve,reject)=>{
axios.get('/gettoken',{parmas:{}})
.then(function(response){
resolve(response)
localStorage.setItem("userToken",response.data.data)
})
.catch(function(e){
reject(e)
})
})
},
getUserInfo(store,token){
axios.get('/api/userinfo.json',{parmas:{token}})
.then(function(response){
console.log("拉取用户信息成功:",response.data.data)
store.commit('setLoginInfo',response.data.data)
})
.catch(function(e){
console.log(e)
})
}
},

在路由守卫里面,判断是否有token, 则获取用户信息

    let AUTO_LOGIN_TOKEN = localStorage.getItem("userToken")

    // 如果有保存token 就自动登录
if(AUTO_LOGIN_TOKEN != null && AUTO_LOGIN_TOKEN != undefined && AUTO_LOGIN_TOKEN != 'undefined'){
console.log('token正常:',AUTO_LOGIN_TOKEN)
if(store.getters.isLogin==0){
console.log('准备自动登录,拉取用户信息。。。')
store.dispatch('getUserInfo',AUTO_LOGIN_TOKEN)
}
}

关于生命周期和dom操作的一点事儿

项目中需要做一个仿app启动页,可以滚动的广告,并且有倒计时显示

    mounted(){
//倒计时跳过
let timehandler = setInterval(()=>{
this.countdown --
if(this.countdown<=0){
this.$router.push('home')
clearInterval(timehandler)
}
},1000)
},
updated(){
//要放在updated里面,因为这里才完成dom渲染
if(!this.Myswiper){
console.log('初始化swiper');
this.Myswiper = new Swiper('.swiper-container', {
pagination: {
el: '.swiper-pagination',
clickable:true
},
autoplay:{
delay:10000
},
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
loop: false,
spaceBetween:0
});
} },

总结:

1、因为倒计时的时候,页面上也会显示剩余时间,每次都会触发updated事件,倒计时操作如果放在updated里面会出乱子

2、初始化swiper必须等dom都准备好,因为dom异步数据获取 之后刷新的,所以也要放在updated里面(用nextTick事件应该也可以解决)
 但是有一点,上面定时器每次刷新时间都会触发updated,只要把swiper对象,挂到vue实例中,判断一下即可

计算属性的坑点

这里有2种方式,使用哪一种看情况而定,如果是第一种,不能在forEach的回调里面return

回调也是一个函数,里面return 和 外面的函数return是两码事

第二种直接在for里面return,作用域是在curScrollIndex中,所以生效

    computed:{
curScrollIndex(){
//方式 1
let returnValue = 0
this.foodsLiHeight.forEach((val,index)=>{
if(this.curScrollposY >= this.foodsLiHeight[index] && this.curScrollposY < this.foodsLiHeight[index+1]){
console.log('计算属性:',index)
returnValue = index
} })
return returnValue
// 方式 2
for(let i=0;i<this.foodsLiHeight.length;i++){
if(this.curScrollposY >= this.foodsLiHeight[i] && this.curScrollposY < this.foodsLiHeight[i+1]){
console.log('计算属性:',i)
return i
}
}
}
},

关于使用全局Less

less很方便,设置好变量,方法,打算在main.js引入less文件,在各子组件中直接使用

但是无实现,经查阅,应该是webpack机制还无法实现

参考:https://segmentfault.com/q/1010000010811479

单页路由切换后,滚动高度不变的"BUG"

切换了路由,滚动高度会继续上一个路由页面的数值
在router实例中加入官方文档说的scrollBehavior,不知为何无效,也不想去折腾它

那只能用最原始的办法,在路由的beforeEach中做手脚:

router.beforeEach((to, from, next) => {
console.log('beforeeach事件:',document.body.scrollTop)
document.documentElement.scrollTop = 0;
next()
});

这里要注意,使用了DTD文档头,要使用document.documentEelement.scrollTop

Vue项目实践中的功能实现与要点的更多相关文章

  1. Vue项目之实现登录功能的表单验证!

    Vue项目之实现登录功能的表单验证! 步骤: 配置 Form表单验证; 1.必须给el-from组件绑定model 为表单数据对象 2 给需要验证的表单项 el-form-item 绑定 prop 属 ...

  2. webpack搭建vue项目,实现脚手架功能

    本文基于node.js开发环境,安装完node之后新建项目,通过webpack配置,实现vue-cli脚手架功能 对于刚刚接触编程的人来说,最难的可能并不是学习一种新语法或者框架,而是编程思维,这种思 ...

  3. webpack 创建vue项目过程中遇到的问题和解决方法

    目录 1 webpack简介 2 webpack实现多个输入输出多个html 3  webpack 中的module下rules 下的use和loader选项 4 webpack 文件更新,如何使页面 ...

  4. prerender-spa-plugin预处理vue项目实践

    由于公司想要把商城做由之前的php和前端混合开发改版为前后端分离,所以拿现在手上的vue项目来实践一下 https://github.com/chrisvfritz/prerender-spa-plu ...

  5. 项目实践中--Git服务器的搭建与使用指南(转)

    一.前言 Git是一款免费.开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.在平时的项目开发中,我们会使用到Git来进行版本控制. Git的功能特性: 从一般开发者的角度来 ...

  6. vue项目webpack中Npm传递参数配置不同域名接口

    项目开发中,前端在配置后端api域名时很困扰,常常出现:本地开发环境: api-dev.demo.com测试环境: api-test.demo.com线上生产环境: api.demo.com, 这次是 ...

  7. 项目实践中--Git服务器的搭建与使用指南

    一.前言 Git是一款免费.开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.在平时的项目开发中,我们会使用到Git来进行版本控制. Git的功能特性: 从一般开发者的角度来 ...

  8. [PHP] 项目实践中使用的IOC容器思想

    1.容器的意思就是一个全局变量,里面存了很多对象,如果要用到某个对象就从里面取,前提就是要先把对象放进去2.控制反转就是把自己的控制权交给别人3.这两个结合就是,把自己的控制权交给别人并且创建的对象放 ...

  9. vue项目开发中遇到的问题总结--内部分享

     1.路由变化页面数据不刷新问题 这种情况一般出现在vue-router的history模式下,初次进入会执行钩子函数,再次进入时则不会. 解决方案: 监听路由变化 watch : { "$ ...

随机推荐

  1. 学习记录特别篇之sql,类的继承

    思路: 应用场景: 1.将父类当做一个基础类 大家都去继承该方法,以便少些代码 2.继承父类的方法 同时可以重写该方法时候调用父类原先的方法 实现一石二鸟的效果 即 既增加原先的功能 又新增新的功能 ...

  2. Dictionary字典

    泛型,键值对 Dictionary<int,string> dic=new Dictionary<int,string>(); dic.Add(,"张三") ...

  3. BZOJ2069 POI2004ZAW(最短路)

    显然这样的路径一定是选择了与1相邻的不同的两点分别作为起点和终点(除1本身).如果能将每一组起点终点都计算到就可以得出最优解了.暴力显然不行.注意到我们每次求出的是单源最短路径,考虑如何充分利用信息. ...

  4. json_decode()相关报错

    错误描述 PHP Warning:  json_decode() expects parameter 1 to be string, array given in xxx.php on line 29 ...

  5. Linux LVM逻辑卷配置过程详解(创建,增加,减少,删除,卸载)

    Linux LVM逻辑卷配置过程详解 许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统分区不够用时可能不得不备份.删除相关数据, ...

  6. 【BZOJ3811】玛里苟斯(线性基)

    [BZOJ3811]玛里苟斯(线性基) 题面 BZOJ 题解 \(K=1\)很容易吧,拆位考虑贡献,所有存在的位出现的概率都是\(0.5\),所以答案就是所有数或起来的结果除二. \(K=2\)的情况 ...

  7. 洛谷 P2672 推销员 解题报告

    P2672 推销员 题目描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有N家住户,第i家住户到入口的距离为 ...

  8. luogu3645 [Apio2015]雅加达的摩天大楼 (分块+dijkstra)

    我们是想跑最短路的 我们有两种建图方式: 1.对于每个doge i,连向B[j]==B[i]+P[i]*k ,k=..,-2,-1,0,1,2,... ,边权=|k|,这样连的复杂度是$O(N\sum ...

  9. luogu4268 Directory Traversal (dfs)

    题意:给一个树状的文件结构,让你求从某个文件夹出发访问到所有文件,访问路径字符串长度之和的最小值,其中,访问父节点用..表示,两级之间用/分割 做两次dfs,第一次算DownN[x]和DownS[x] ...

  10. 收藏:c语言的多线程同步

    1.<秒杀多线程第一篇 多线程笔试面试题汇总> 2.<秒杀多线程第二篇 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别> 3.<秒杀 ...