解决TypeError:Cannot read property ‘offsetWidth‘ of undefined

首先看一下我项目的需求,红框这里有很多种类,可以滑动查看,然后当上一个页面点击哪个进来的时候,这里就高亮显示哪个。

 项目是vue写的,没看到有什么好用的插件,百度看到下面的写法,我高兴的拿过来用了。

start(index, item) {
      /**
       * 1)先让选中的元素滚到可视区域的最左边 scrollLeft
       * 2)接着向右移动容器一半的距离 containWidth / 2
       * 3)最后向左移动item一半的距离 offsetWidth / 2
       */
      this.activeIndex = index;
      let lastSpot = this.$refs.scrollBox.scrollLeft;
      const nextSpace = 7; //每次移动距离
      this.scrollItemTimer = setInterval(() => {
        this.$nextTick(() => {
          let offsetWidth = this.$refs.scrollItem[this.activeIndex].offsetWidth; //item
          let scrollLeft = this.$refs.scrollItem[this.activeIndex].offsetLeft; //选中的元素滚到可视区域的最左边
          const containWidth = this.$refs.scrollBox.offsetWidth; //容器的宽度
          let resultSpot = scrollLeft + offsetWidth / 2 - containWidth / 2; //最终要停留的点
          if (Math.abs(lastSpot - resultSpot) < nextSpace) {
            clearInterval(this.scrollItemTimer);
          }
          if (resultSpot >= lastSpot) {
            lastSpot = lastSpot + nextSpace;
          } else {
            lastSpot = lastSpot - nextSpace;
          }
          this.$refs.scrollBox.scrollTo(lastSpot, 0);
        });
      }, 15);
}

不过在使用还是存在一些不足的,就是当我从上个页面进来 ,然后没等移动完,我立马返回出去就会报下面这个错。

我就很懵,本来就菜,结果还要来这波搞我心态! 

当然,打工人就要迎难而上。我差点想拿vant的轮播图来改造用(也不知道能不能达到效果,我还没动手),然后我突然看到代码中有setInterval定时器,大概率就是这个玩意造成的报错,返回的时候没有销毁定时器,一查资料果然是这个淘气鬼在捣蛋

然后我就在beforeUnmount 中把定时器给移除掉,现在就算还没有滑动到指定位置返回也不回报错了。

因为这个问题,我才知道有beforeUnmount和unMounted这l两个东西的存在。

继续加油~

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TypeError: Cannot read property 'call' of undefined错误是指在调用一个未定义的对象的call方法时发生的错误。根据引用和引用[2]的内容,我们可以了解到这个错误通常发生在使用Vue.js路由时,可能是因为路由配置有误导致调用了未定义的函数或方法。 根据引用中提到的错误详情,TypeError通常是由于变量或参数不是预期类型引起的。在Vue.js中,路由配置常常使用到call方法来调用相应的函数,而当调用的对象是undefined时,就会触发该错误。 举个例子,假设在Vue.js路由配置中有如下代码: ```javascript router.beforeEach((to, from, next) => { // 在此处调用了一个不存在的函数 to.meta.beforeEnter.call(); next(); }); ``` 在这个例子中,to.meta.beforeEnter是一个函数对象,但如果这个函数对象未定义,就会产生TypeError: Cannot read property 'call' of undefined错误。 因此,解决这个错误的方法就是确保在路由配置中所调用的函数或方法都是已定义的。可以检查路由配置文件,确保所有使用到call方法的函数都是存在的。另外,也可以在调用函数之前先进行类型判断,避免调用未定义的函数。 总结起来,TypeError: Cannot read property 'call' of undefined错误通常发生在Vue.js路由配置中,是由于调用了未定义的函数或方法导致的。解决这个错误的方法是确保所有调用的函数都是已定义的,并进行必要的类型判断。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值