# Стандартные директивы в Vue.js

poster
В этом видео мы с вами разберем стандартные директивы во vue. Если вы работали с Angular 1, то для вас практически не будет ничего нового, так как синтаксис отличается совсем немного и идея такая же.
Понравилось? Поделитесь с друзьями!
Понравилось?
Поделитесь с друзьями!
Комментарии
Текст видео

В этом видео мы с вами разберем стандартные директивы во vue. Если вы работали с Angular 1, то для вас практически не будет ничего нового, так как синтаксис отличается совсем немного и идея такая же.

Итак, что такое директива? Это кусок javascript кода, который применяется на любой DOM элемент и может его менять.

Сразу скажу, что мне вообще не нравится, что в vue скопировали директивы, как сущность с Angular 1 и компоненты с React. Потому что вы можете описать компонент и реализовать внутри любую бизнес логику какую хотите и переиспользовать этот компонент везде. И это намного более правильный подход, который используется и в других фреймворках, чем написание директив. И на мой взгляд, это запутывает начинающих, ведь можно написать компоненту, а можно директиву.

Итак, давайте разберем самые часто используемые директивы.

Самая часто использующая директива, это v-model. Она создает двухсторонний байндинг на переменную.

<div class='root'>
  {{message}}
  <input type='text' v-model='message'/>
</div>
new Vue({
  el: '.root',
  data: {
    message: 'someMessage'
  }
})

Это значит, что у нас при изменении message на странице меняется переменная. Вы можете вешать ее на input, select и textarea.

Дальше идет директивая v-on, которая позволяет вешать слушателей на DOM элементы. И, конечно, v-on:click - это самая часто используемая. И в v-on у нас есть алиас в виде собачки, чтобы писать меньше кода.

Давайте добавим кнопку с click, которая будет менять переменную в data.

<button @click='onSubmit'>Submit</button>
methods: {
  onSubmit () {
    console.log('onSubmit')
    this.isShown = !this.isShown
  }
}

Как мы видим в браузере, все работает.

Дальше идет v-show, которая позволяет скрывать елемент на странице, применяя к нему display:none.

<div v-show='isShown'>
  {{message}}
</div>

Если мы посмотрим на страницу, то элемент рендерится, но к нему применяется display: none.

Также у нас есть директива v-if, которая работает также, как и v-show, но удаляет элемент со страницы полностью.

<div v-if='isShown'>
  {{message}}
</div>

Вместе с v-if идет директива v-else. Ее можно повесить только на следующий элемент после директивы v-if. Тогда он будет отображаться, когда v-if не выполняется.

<div v-if='isShown'>
  {{message}}
</div>
<div v-else>
  else
</div>

Я бы не советовал использовать v-else, потому что, как только вы перенесете элемент, либо добавите еще один между ними, то ничего работать не будет. Лучше вместо v-else писать v-if с отрицанием.

Для вывода списков используется директива v-for. Давайте добавим массив юзеров в данные, чтобы вывести их на экран.

data: {
  message: 'someMessage',
  isShown: false,
  users: [
    {name: 'Alex'},
    {name: 'Jack'},
    {name: 'John'}
  ]
}
<ul>
  <li v-for="user in users">
    {{user.name}}
  </li>
</ul>

Если мы посмотрим в браузер, то у нас вывелся список юзеров.

В этом видео мы с вами разобрали самые часто используемые директивы в vue.

Если у вас возникли какие-то вопросы или комментарии, пишите их прямо под этим видео.

Только зарегистрированные пользователи могут оставлять комментарии.  Войдите, пожалуйста.
Moe Green
8 лет назад
v-if='value' + v-else против v-if='value' + v-if='!value' - ок у ангуляр такой подход (v-if='value' + v-else) сделан через ссылку (#), если не ошибаюсь?
Иван Древаль
9 лет назад
Так что мешает засунуть разметку в сам компонент и не будет проблем его переиспользовать?
monsterlessons
9 лет назад
Ничего не мешает. Я об этом и сказал. Я за то, чтобы использовать только компоненты с разметкой и логикой внутри. Я считаю, что кастомные директивы это плохо.
Valerii Kuzivanov
9 лет назад
А еще можно v-model повесить на кастомный компонент, тогда нужно в этом компоненте принять в props - value. И заэмитить(this.$emit('input'), this.newValue), когда вам нужно обновить v-model родителя. Очень удобно! Компонент получается изолированным от внешнего кода, на выход что-то принял, отработал и вернул.
monsterlessons
9 лет назад
Как вариант. Но я предпочитаю пользоваться более явным подходом передавая функцию коллбек. <test :on-submit='onSubmit' /> Тогда props можно даже валидировать.
Valerii Kuzivanov
9 лет назад
Пропсы в любом случае валидировать можно и нужно, хотя бы типы проставлять.
monsterlessons
9 лет назад
Ну много людей угорает по flow, typescript вместо propTypes.
Valerii Kuzivanov
9 лет назад
Да я бы тоже не против заюзать типизацию во вью(часто её очень не хватает), но будут проблеммы с подсветкой в IDE. Ну точнее над этим подзапариться нужно будет. Или придется реорганизовывать все компоненты в стиле ангулара2+, где шаблон, css и логика компонента лежит в разных файлах, либо возможно(пол года назад когда я думал над этим, таких не было) уже есть какие либо плагины для твоей IDE которые показывают ошибки flow и поддерживают код линтинг в том виде что предлагает vue-loader. По поводу тайпскрипта ничего не могу сказать, по мне он как-то более заточен под ангулар, где используются декораторы и вся экосистема на TS завязана. Лично моё сложившиеся мнение, если хочешь писать быстро и с удовольствием, где шанс на баг допустим и руководство не будет отрезать за это палец - берешь vue. Если нужно что-то супер универсальное, где миллион плагинов, туториалов, хелперов и плюшечек чтобы самому изобретать минимум, а максимум получить уже готовых решений - бери react. Если проект требует минимальное колл-во багов, тестирование, типизацию и чтобы всё было долго, дорого и солидно - берем ангулар последний.
monsterlessons
9 лет назад
Как я уже говорил, любой фреймворк на вкус и цвет. Мне вот нравится React и не нравится Vue и Angular. У каждого фреймворка свои минусы. Я видел и большие проекты на Vue, которые уже хорошо написаны и лапшекод на Angular. Тут решает исключительно команда и архитектура приложения, а не фреймворк. Насчет flow в интернете уже много хаков, как заставить flow работать с Vue шаблонами. Обычно как то так: https://alligator.io/vuejs/components-flow/ Я не использовал Typescript с Vue, но с React он работает вполне отлично и на большом проекте он успешно применялся, хотя React и не заточен под ts как Angular.
Valerii Kuzivanov
9 лет назад
О, круто. Сейчас попробую настроить =)
Valerii Kuzivanov
9 лет назад
Прошел час. Работает но не совсем, через консоль ошибки выплевывает нормально. С VSCode настроить удалось через плагин 0 всё ок, через WebStrom на котором я обычно работаю - нет. Не получается у вебшторма локальный сервер флоу запустить, пока хз почему. Думаю проблема с путями где-то.
Valerii Kuzivanov
9 лет назад
Вообщем такой вывод: На VSCode flow работает, на WS нет. У всех подобные проблемы, решения так саппорт так и не предложил. Переходить на VS ради этого я не хочу, тк там vue в целом хуже саппортится, нету переходов по файлам, нету путёвого revert участка кода/файла/файлов. Придется чез консоль всё делать. Нету шорткодов из коробки, придется там какой-то костыль делать который работает криво. В целом считаю VS хорошим опенсорсом, но пока до WS не дорос.
monsterlessons
9 лет назад
Жизнь боль)) А жизнь программиста еще больнее. А все потому, что Vue еще не насколько зрелый как другие фреймворки. React с ts или flow в phpstorm нормально работает.