vue 问题合集

1. vue-router配置路由,当前路径与跳转路径一致时,会报错。


NavigationDuplicated: Avoided redundant navigation to current location: 

所以在router的js里修改,添加

import Router from 'vue-router'

//修改router的跳转事件,取消报错提示。 const originalReplace = Router.prototype.replace
const originalPush = Router.prototype.push
Router.prototype.replace = function replace(location) {
  return originalReplace.call(this, location).catch(err => err)
}
Router.prototype.push = function push(location) {
  return originalPush.call(this, location).catch(err => err)
} 




2. 上传文件接口接受不到参数


在 axios 的 headers 加上 'Content-Type': 'multipart/form-data',

传值使用 FormData 函数

const formData = new FormData()
fileList.forEach((file) => {
  formData.append('file', file)
}

axios.post(url,formData,{
  headers:{
    'Content-Type': 'multipart/form-data',
  }
}) 




3. 给input赋值时,值不能重组两次


let obj=[{a:1,b:2}]

//错误
obj=[{a:1,b:3}]

//正确
obj[0].a=1;
obj[0].b=3




4. 监听数据或对象时,获取的新值和旧值一致时


data(){
  obj:[{a:1}]
},
watch:{
  newObj:{
    handler(new,old){},
    deep:true
  }
},
computed:{
  newObj(){
    return JSON.parse(JSON.stringify(this.obj))
  }
} 




5. 使用keep-alive 和 vue-router 做页面缓存。


使用场景:A列表页➡B详情页,缓存A列表页的视图,使A不会被销毁。

当B➡A时,能够看到跳转前的数据。

当A➡B➡C➡A时,A不缓存,并且重新渲染。

当A➡C时,A同上。

此时需要配置的路由信息

//vue router "A": {
  "meta": {
    "keepAlive": true
  } 

模板页(只要使用router-view的地方即可)


  
    
  


  

列表页

beforeRouteEnter(to, from, next) {
  if (from.path == 'B') {
    to.meta.keepAlive = true
  }
  next()
},
beforeRouteLeave(to, from, next) {
  from.meta.keepAlive = false
  next()
} 

Tip:在router-view使用v-if 前一两次切换页面时是正常显示,到后面就不对了。

估计是 router-view 不能正常支持 v-if。

因为在 router-view 使用 v-show 是正常显示的,但是使用 v-show 会渲染数据两遍,所以我使用一个标签包裹 router-view,然后使用v-if,标签不一定使用transition,用div也可。




6. 当列表页使用 keepalive 缓存 和 vue-infinite-scroll 插件bug。


场景:

未使用 keepalive 前

访问页面默认触发 vue-infinite-scroll 的 v-infinite-scroll(滚动到底部时,触发函数)

使用 keepalive 后

由于页面缓存,列表页没有被销毁,详情页返回到列表页没问题。但问题出在,当从其他页面(C)跳转到列表页时,应当触发的 v-infinite-scroll 没有执行。


只有 C 页面滚动条下滑到一定位置,再跳转列表页,才会触发滚动函数。

或者一开始就在 C ,不需要滚动条下滑,直接跳转到列表页,也可以触发滚动函数。


第一种的原因:

跳转页面时,尽管列表页还未显示,但是html已经在了,并且滚动条不在顶部,所以会触发 v-infinite-scroll 。


第二种的原因:

页面未加载过,所以会触发 v-infinite-scroll 。
但是按这么说的话,离开列表页跳转到 C 时,列表页就应该被销毁了。
应该会触发 v-infinite-scroll ,但是就是没有触发。


以上的 bug 发生情况与 keepalive 没有直接联系,所以排查问题和解决问题时,完全找不到解决方法。但问题是在使用 keepalive 后发生的,所以也不能说没有关系......

个人认为 vue-infinite-scroll 可能存在 bug。但问题出现了,还是需要快速解决的。

所以很无奈的使用

//实例被挂载后触发 
mounted() {
  document.getElementsByClassName('ant-layout')[1].scrollTop = 21
}, 

让滚动条向下滑一下,触发 v-infinite-scroll 事件。

由于我 UI 框架使用的 ant ,所以 dom 对象是 ant-layout 。滚动条不一定在 body,在解决时,查看滚动条是哪个dom对象。


持续更新ing

你可能感兴趣的:(前端vue.js)