Чему тут равен this?

Во Vue.js, значение this зависит от контекста, в котором он используется. Это может быть несколько запутано из-за различных способов использования и синтаксиса в различных ситуациях. Давайте рассмотрим несколько вариантов, чтобы более полно ответить на ваш вопрос.

1. Компонент Vue:
Внутри объектов определения компонента Vue, ключевое слово this ссылается на сам экземпляр Vue. Это позволяет получить доступ к свойствам и методам компонента. Например:

Vue.component('my-component', {
  data() {
    return {
      message: 'Hello Vue.js'
    }
  },
  mounted() {
    console.log(this.message) // 'Hello Vue.js'
  }
})

2. События и обработчики:
В обработчиках событий, определенных в шаблоне компонента, this ссылается на сам экземпляр Vue. Например:

new Vue({
  el: '#app',
  data() {
    return {
      message: 'Hello Vue.js'
    }
  },
  methods: {
    handleClick() {
      console.log(this.message) // 'Hello Vue.js'
    }
  }
})
<div id="app">
  <button @click="handleClick">Click me</button>
</div>

3. Коллбэки и анонимные функции:
Внутри коллбэков и анонимных функций значение this может меняться. Оно будет ссылаться на объект, от которого была вызвана функция. В таких ситуациях часто используется локальная переменная, чтобы сохранить доступ к экземпляру Vue. Например:

new Vue({
  el: '#app',
  data() {
    return {
      message: 'Hello Vue.js'
    }
  },
  mounted() {
    setTimeout(function() {
      console.log(this.message) // undefined
    }, 1000)

    setTimeout(() => {
      console.log(this.message) // 'Hello Vue.js'
    }, 1000)
  }
})

В первом случае, внутри обычной анонимной функции, this ссылается на глобальный объект window, поэтому this.message будет undefined. Во втором случае, используется стрелочная функция, которая не создает свой собственный this, а будет наследовать значение из внешнего контекста, то есть, из метода mounted, где this ссылается на экземпляр Vue, поэтому this.message будет 'Hello Vue.js'.

4. Вспомогательные методы:
Во вспомогательных методах, определенных внутри опции methods или стрелочных функций, this ссылается на сам экземпляр Vue. Например:

new Vue({
  el: '#app',
  data() {
    return {
      message: 'Hello Vue.js'
    }
  },
  methods: {
    logMessage() {
      console.log(this.message) // 'Hello Vue.js'
    },
    showAlert: () => {
      console.log(this.message) // undefined
    }
  }
})

5. Компьютерные свойства:
Внутри компьютерных свойств, определенных в опции computed, this ссылается на сам экземпляр Vue. Например:

new Vue({
  el: '#app',
  data() {
    return {
      firstName: 'John',
      lastName: 'Doe'
    }
  },
  computed: {
    fullName() {
      return this.firstName + ' ' + this.lastName
    }
  }
})

6. Хуки жизненного цикла:
Внутри методов хуков жизненного цикла, this ссылается на сам экземпляр Vue. Это позволяет взаимодействовать с данными и методами компонента в разных этапах его жизненного цикла. Например:

Vue.component('my-component', {
  data() {
    return {
      message: 'Hello Vue.js'
    }
  },
  created() {
    console.log(this.message) // 'Hello Vue.js'
  }
})

Как видно, значение this зависит от контекста его использования во Vue.js. Оно может указывать на экземпляр компонента, на объект из которого вызывается метод или функция, или на другой объект в зависимости от того, где и как он используется. Понимание и контроль контекста this является важной частью разработки с использованием Vue.js и может помочь избежать ошибок и неточностей при написании кода.