箭頭函數(shù)是ECMAScript 6中新增的語法,在Vue的method中也常常使用到。使用箭頭函數(shù)可以簡化代碼的書寫,同時也避免了this綁定的問題。
在Vue的method中,我們通常需要使用this關(guān)鍵字來操作組件實例中的數(shù)據(jù)或者執(zhí)行其它方法。但是由于JavaScript函數(shù)中的this關(guān)鍵字在不同的上下文環(huán)境下指向的對象不同,這就會造成this丟失的問題。這時候,就可以使用箭頭函數(shù)來解決這個問題。
// 使用函數(shù)聲明方式 methods: { handleClick: function () { console.log(this.foo); } } // 使用箭頭函數(shù) methods: { handleClick: () =>{ console.log(this.foo); } }
可以看到,箭頭函數(shù)沒有自己的this,它的this與它定義時所處的上下文環(huán)境的this保持一致。在Vue的method中,通常情況下箭頭函數(shù)會綁定到Vue實例中,在箭頭函數(shù)中使用this時,指的是Vue實例本身。
// Vue實例中的數(shù)據(jù) data() { return { foo: 'bar' } } // 使用箭頭函數(shù) methods: { handleClick: () =>{ console.log(this.foo); // 輸出bar } }
另外,在Vue實例中使用箭頭函數(shù)時需要注意作用域的問題。箭頭函數(shù)的作用域是函數(shù)定義時所處的作用域,而不是執(zhí)行時所處的作用域。也就是說,在Vue實例中使用箭頭函數(shù)時,箭頭函數(shù)中的變量將會取其定義時所處的作用域的值。
// Vue實例中的數(shù)據(jù) data() { return { foo: 'bar' } } // 作用域問題 methods: { handleClick: () =>{ let foo = 'baz'; console.log(this.foo); // 輸出bar,而不是baz } }
最后需要注意的是,在Vue method中,如果需要訪問Vue實例中的this,我們通常使用Vue實例的$refs屬性:
// 在Vue Template中定義一個refdiv content// 在method中獲取Vue實例中的this methods: { handleClick: () =>{ console.log(this.$refs.myDiv); } }
使用箭頭函數(shù)不僅可以簡化Vue method中的代碼,還可以解決this丟失的問題。但需要注意的是,箭頭函數(shù)在作用域和this綁定方面與普通函數(shù)有所不同,需要我們謹(jǐn)慎使用。