Vue.js仿饿了么中$nextTick()方法中的this.$els报错undefined问题

在学习Vue.js仿饿了么项目的过程中我遇到了一个关于better-scroll用法的问题,就是$nextTick函数Vue中DOM的异步更新问题,即确保dom树变化之后再发送ajax请求,在得到class的选择器作用步骤上出错了。

资料:

https://blog.csdn.net/qq_20777797/article/details/78233615页面中,我了解到Vue.nextTick()和Vue.$nextTick()的区别

`Vue.nextTick(callback)`,当数据发生变化,更新后执行回调;

`Vue.$nextTick(callback)`,当dom发生变化,更新后执行的回调。

在通过上网查找相关资料,我了解到了$els如下的一些知识点:

$els 为 DOM 元素注册一个索引,方便通过所属实例的 $els 访问这个元素;

因为 HTML 不区分大小写,camelCase 名字比如 v-el:someEl 将转为全小写。可以用 v-el:some-el 设置 this.$els.someEl;

$els类似于document.querySelector('.class')的功能,可以拿到指定的dom元素。(注意v-el在vue2.0中已经删除改为ref="someEl" 驼峰形式的命名)。

在项目中,它的写法如下:

this.$nextTick(() => {
  this.scroll = new BScroll(this.$els.ratings, {
    click: true
  });
});

但是运行后你会发现,页面报错说ratings为undefined,为了发现错误,我在代码中加入测试语句,代码如下:

this.$nextTick(() => {
  this.scroll = new BScroll(this.$els.ratings, {
    click: true
    console.log(this.$els)
  });
});

发现,在页面的控制台打印出来的this.$els为undefined,为了解决这个问题,我折腾了好久,最终没有解决这个问题,但是选择了其他方法来达到这个效果,反正它的写法很多:

方法一:直接把this.$els.ratings代码修改为document.getElementsByClassName('.ratings')[0],用法为:

c6265aae86e2072645055fb8f1cfc80ce3d.jpg

代码如下:

this.$nextTick(() => {
  this.scroll = new BScroll(document.getElementsByClassName('.ratings')[0], {
    click: true
  });
});

方法二:直接在选择器想要的class的div中写入ref="ratings",在把this.$els.ratings代码修改为this.$refs.ratings,在Vue2.0中v-el 和 v-ref 合并为一个 ref 属性了,可以在组件实例中通过 $refs 来调用,代码如下:

c634697e0414ca6431efa05364ba9c0b331.jpg

3123100340278c1c77cebe18c3cf6bc052b.jpg

注意:ref="ratings"和this.$els.ratings中的rating是一模一样的,不一致时,控制台会报Error in nextTick: "TypeError: Cannot read property 'children' of undefined"的错误。

毕竟Vue 1.0的时候一般写法为:v-el: foods-wrapper和this.$els.foodsWrapper,所以要小心。

方法三:直接在选择器想要的class的div中设置id属性即可

以上三种方法都可以达到想要的效果,区别只是写法不同而已。

转载于:https://my.oschina.net/u/3986411/blog/2245722

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值