那些年遇到的bug合集

382 阅读2分钟

一.操作dom错误

1. UncaughtTypeError:document.getElementsByClassName(...).addEventListener is not a function

原因:

选择器没有正确选择元素对象

document.getElementsByClassName(…)捕捉到的是该类名元素的数组

解决方法

document.getElementsByClassName(…)[0].addEventListener…

通过 [0] 选定需要的元素对象

与之相似的还有document.querySelectorAll('选择器'),返回的也是个伪数组,注意用下标取值后才能进行操作

2.Uncaught TypeError: Cannot set properties of undefined (setting 'innerHTML')

报错信息,在说undefined没有 innerHtml 这个属性

原因:操作dom时 , 没有获取到dom对象, 得到的是undefined 解决方法: 找到innerHTML前面的dom元素, 查看自己是否真的获取到

注意:

document.querySelectorAll('选择器')选择器基本与css保持一致 在获取类名选择器及id选择器时不要忘了前面的 . 和 #,否则获取不到,返回undefined,会出现以上报错

二.发起接口错误

1.Failed to load resource: the server responded with a status of 404 (Not Found)

image.png 原因:报404,客户端出现问题,一般情况都是因为接口地址没有调正确

最常见错误,多打个字母,多个空格等 如: image.png 解决方案: 检查接口路径是否正确,尽量直接复制黏贴接口文档中的路径

三.不了解语法特性所引起的bug(非报错bug)

1.数组.push()语法了解不透彻

const fs =require('fs')
const path = require('path')
let url = path.join(__dirname, 'db','data.json')
let arr = JSON.parse(fs.readFileSync(url, 'utf8'))
console.log(arr);
newArr = arr.push({ name:"小张" })
console.log(newArr);
fs.writeFileSync(url,JSON.stringify(newArr)) 

原因: 数组.push()方法返回的添加后新数组的长度,而不是新数组,理解错了,就会导致后面一系列问题如上: newArr打印出来是数组长度,那变量接收到的是长度,不是新数组,导致写入的文件为一个数字

解决方案: 数组.push()后原数组已经发生变化,直接用就可以

const fs =require('fs')
const path = require('path')
let url = path.join(__dirname, 'db','data.json')
let arr = JSON.parse(fs.readFileSync(url, 'utf8'))
console.log(arr);
arr.push({ name:"小张" })
fs.writeFileSync(url,JSON.stringify(arr)) 

2.对象字符串拼接后,数据会改变

自己用express写的接口,用jsonp方式,给前端传一个fn()函数,里面传要给前端的数据: image.png 前端报错信息:

image.png 原因:对象经过字符串拼接后,会发生变化,测试demo:

image.png 模板字符串也一样的原理,相当于进行了拼接,前端拿不到我们想传的数据

解决方案: 把我们的数据,转为json字符串

image.png

四.vue相关

1.父子通信时,vue规定子组件不能直接改父组件传过来的值

image.png 原因:子组件直接改了父组件传来的值,就会出现上述报错

解决方案:不建议直接改值,可通过$emit()进行子向父的通信,让父亲来改

补充:父组件传给子组件的是一个对象,子组件修改对象的属性,是不会报错的,对象是引用类型, 互相更新;但不能改变引用地址

2.计算属性改值时,需要用完整写法 image.png 原因:计算属性,如果只通过逻辑计算获取值时,可简写,当需要改计算属性的值时,需用它的完整写法

简写形式:

computed: {
    "计算属性名" () {
        return "值"
    }
}

解决方案:用他的完整写法,改值时,走set这个回调,并接收值,获取值时走get这个回调

computed: {
    "属性名": {
        set(){
            
        },
        get() {
            return "值"
        }
    }
}

3.重复导航引起错误

image.png

原因: 当前url上"hash值和?参数"与你要跳转到的"hash值和?参数"一致, 爆出冗余导航的问题, 不会跳转路由,会报错

当前url的hash值 image.png 要跳转的hash地址

this.$router.push({
        path:'/move',
        query:{
          id:100,
          name:'阿洋'
        }
      })

解决方案:

方案一: 用catch语法,捕获错误

this.$router.push({
        path:'/move',
        query:{
          id:100,
          name:'阿洋'
        }
      }).catch(err=>err)
      

方案二: 添加时间戳,每次hash都不会重复

this.$router.push({
        path:'/move',
        query:{
          id:100,
          name:'阿洋',
          t:Date.now()
        }
      })

缺点就是传参,会带上时间 image.png