vue查看变量类型_vue的进阶之路
当我们使⽤ Vue 在愉快的开发项⽬的时候,突然报了⼀个错误:
this is undefined
别担⼼,不只有你⼀个⼈,我也经常遇到这个问题很多次,接下我们⼀起来看看如何解决这个问题。
⼀个可能的原因是混淆了常规函数和箭头函数的⽤法,如果你遇到这个问题,我猜你⽤的是箭头函数。如果⽤常规函数替换箭头函数,它可能会为你修复这个问题。
我们再深⼊⼀点,试着理解为什么会这样。
毕竟,知识就是⼒量,如果知道造成问题的原因,那么我们将来可以避免很多挫败感和时间浪费。
还有⼀些其它原因可能也会出现此类错误。
使⽤ fetch 或 axios 获取数据
使⽤像 lodash 或 underscore 这类的库
理解两种主要的函数类型
在 JS 中,我们有两种不同的函数。它们以⼏乎相同的⽅式运作,除了它们处理变量的⽅式不同。
这给新旧Javascript开发⼈员带来了很多困惑,但是当我们弄懂这个问题时,就很好会有这个困惑。
常规函数
常规函数可以⽤⼏种不同的⽅式定义。
花香扑鼻第⼀种⽅法在 Vue 组件中较不常见,因为写出来要更长⼀些:
第⼆种⽅法是简写⽅式,我们也经常使⽤:
在像这样的常规函数中,this将引⽤函数的“所有者”。因为我们是在Vue组件上定义它的,所以this指的是Vue组件。
在⼤多数情况下,我们应该在 Vue 中使⽤常规函数,特别是在创建时
methods
computed props
watched props
虽然常规函数通常是我们所需要的,但是箭头函数也⾮常⽅便。
箭头函数
箭头函数可以更短,更快的编写,因此最近获得了⼴泛的欢迎。但是,它们在对象上定义⽅法时并没有太⼤的不同,就像我们在编写Vue组件时所做的那样。
这是他们在Vue组件上的样⼦:
在处理 this 问题时,真正的差异开始发挥作⽤。
箭头函数采⽤词法作⽤域,意味着箭头函数从它的上下⽂中获取this。
如果试图从Vue组件上的箭头函数内部访问 this,将得到⼀个错误,因为 this 不存在
简⽽⾔之,尽量避免在Vue组件上使⽤箭头函数。这将会省去许多头痛和困惑的问题。
有时使⽤箭头函数是很好的,但这只在不引⽤this的情况下才有效。
茉莉花苞茶的功效现在我们知道两种主要的函数类型,如何正确使⽤它们?
匿名函数
当我们只需要创建⼀个函数⽽不需要从其他任何地⽅调⽤它时,匿名函数⾮常有⽤。
下⾯是使⽤匿名函数的⼀些场景
使⽤ axios 或 fetch 访存数据
filter、map和reduce等函数⽅法
春风袭来在 Vue ⽅法中的任何地⽅
来个例⼦看⼀下:
从⽰例中可以看到,⼤多数情况下,当我们创建匿名函数时,使⽤箭头函数。我们通常使⽤箭头函数有⼏个原因更短、更简洁的语法
改善可读性
this 取⾃⽗类
在Vue⽅法中,箭头函数也可以作为匿名函数使⽤。
等等,我们不是刚发现当我们试图访问 this 时,箭头函数不起作⽤吗?
这就是区别所在。
当我们在常规函数或简写函数中使⽤箭头函数时,常规函数将this设置为我们的Vue组件,⽽箭头函数则不⼀样。
来个例⼦:
filter⽅法可以访问this.match,因为箭头函数使⽤的⽅法与filteredMessages⽅法使⽤的上下⽂相同。由于此⽅法是常规函数(⽽不是箭头函数),因此将其⾃⾝的上下⽂设置为Vue实例。
共青团入团志愿让我们进⼀步讨论如何使⽤axios或fetch来获取数据。
在获取数据时使⽤正确的函数
如果正在使⽤fetch或axios获取异步数据,最好使⽤ Promi。Promi喜欢匿名箭头函数,它们也使处理this问题变得容易得多。
歌唱比赛主题如果你正在获取⼀些数据并想在你的组件上设置它,这是你应该做的正确的⽅式:
请注意,我们如何在 Vue 组件上使⽤常规函数作为⽅法,然后在 Promi 内部使⽤匿名箭头函数
女史箴
在fetchData()作⽤域内,我们将this设置为Vue组件,因为它是⼀个常规函数。由于箭头函数使⽤外部作⽤域作为它们⾃⼰的作⽤域,因此箭头函数也将this设置为我们的Vue组件。
这允许我们通过this访问 Vue 组件并更新dataFromServer。
初一计算题但是,如果需要将函数传递帮助库,⽐如lodash或underscore,该怎么办呢
与 Lodash 或 Underscore ⼀起使⽤
假设我们的Vue组件上有⼀个要使⽤Lodash或Underscore⽅法。如何防⽌this is undefine的错误。
如果你⽤过 React ,你可能见过类似的东西。
这是我们⽤Vue做的。
就是这样!
我们要做的就是获取函数,将其包装在debounce函数中,然后返回⼀个内建了debounce的新函数。现在,当我们在Vue组件上调⽤hodToDebounce()时,我们将调⽤debounced版本。
什么是词法作⽤域
如前所述,常规函数和箭头函数之间存在差异的主要原因与词法作⽤域有关。来分析⼀下它的含义。
⾸先,作⽤域是程序中存在变量的任何区域。在Javascript中,window 变量具有全局作⽤域,它在任何地⽅都可⽤。尽管⼤多数变量被限制在定义它们的函数、它们所属的类或模块中。
其次,单词“词法”仅仅意味着作⽤域由你如何编写代码决定。某些编程语⾔只在程序运⾏时才确定作⽤域内的内容。这可能会让⼈很困惑,所以⼤多数语⾔都只使⽤词法作⽤域。
箭头函数使⽤词法作⽤域,⽽常规函数和简写函数不使⽤。
这⾥最棘⼿的部分是词法作⽤域如何在函数中影响 this。对于箭头函数,this与外部作⽤域的this绑定在⼀起。常规函数的this绑定⽅式有些奇怪,这就是引⼊箭头函数的原因,也是为什么⼤多数⼈尽可能多地使⽤箭头函数的原因。
作⽤域如何在函数中⼯作
下⾯是⼀些⽰例,它们演⽰了作⽤域如何在这两种函数类型之间以不同的⽅式⼯作
将作⽤域绑定到函数上
我们可以使⽤ bind ⽅法来改变 this 的绑定
const boundFunction = unboundFunction.bind(this);
亲情图片这使我们在编写Vue组件时具有更⼤的灵活性,更轻松地重⽤⽅法。当然,可读性相对差点,应该尽量避免太频繁地使⽤它。