Почему свойство data должно быть в функции

Ответ

Свойство data в компонентах Vue должно быть функцией, чтобы каждый экземпляр компонента имел свою собственную копию данных. Если бы data был объектом, все экземпляры компонента ссылались бы на один и тот же объект, что привело бы к неожиданному поведению при изменении данных в одном компоненте.

Пример:

// Неправильно: все экземпляры будут использовать один объект
data: {
  count: 0
}

// Правильно: каждый экземпляр получит свою копию данных
data() {
  return {
    count: 0
  }
}

Функция data вызывается при создании каждого нового экземпляра компонента, возвращая свежий объект данных для этого экземпляра. Это особенно важно для повторно используемых компонентов.

Ответ 18+ 🔞

Да ты посмотри, что эти Vue-разработчики вытворяют! Ну внатуре, сидишь такой, пишешь компонент, а тут — бац! — все твои данные начинают синхронно ебашить как сумасшедшие, потому что ты, мудак, забыл про одну маленькую, но охуенно важную деталь.

Слушай сюда, вот смотри. У тебя есть свойство data. Так вот, эта штука обязана быть функцией, а не простым объектом. А знаешь, нахуя? А затем, чтобы каждый новый экземпляр твоего компонента получал свою собственную, уникальную копию данных. Свою личную песочницу, блядь!

А если ты сделаешь data просто объектом, вот так:

// Неправильно, пидрила! Все экземпляры будут тыкать в один объект!
data: {
  count: 0
}

То получится пиздец. Все твои компоненты, как мартышлюшки дурацкие, начнут тянуть один и тот же банан! Изменяешь count в одном — он автоматом меняется во всех остальных. Удивление пиздец! А ты потом сиди и чеши репу: "И чё это у меня все кнопки синхронно нажимаются?!"

А вот правильный способ, красава:

// Правильно! Каждый экземпляр получит свой свеженький объект.
data() {
  return {
    count: 0
  }
}

Видишь? Функция! Она вызывается каждый раз, когда создаётся новый экземпляр компонента, и возвращает ему новый объект. Чистый, девственный, никому не принадлежащий. Особенно это важно для компонентов, которые ты используешь много раз на одной странице — для списков, таблиц, этих вот всех повторюшек.

Короче, запомни раз и навсегда: data — функция, возвращающая объект. Не функция — получишь ебаный клубок из никому не нужных багов. Всё, вопрос закрыт, иди работай.