Не варто припиняти вчити щось нове, правда? І писати – надійніший метод запам’ятати ніж просто читати, тому спробую повернути блог до життя.
CDN
Найпростіший спосіб яким ви можете почати використовувати Vue – це завантажити його на свою сторінку з CDN: https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.10/vue.min.js
Hello world!
Якщо у нас є такий HTML шаблон:
<div id="app"> {{title}} </div>
То мінімальний JavaScript який дозволяє його заповнити виглядає так:
var data = { // Модель - це просто будь-який об'єкт title: "Hello world!" }; new Vue({ el: "#app", // вибрати елемент за id data: data // приєднати модель });
Тепер, якщо в консолі браузера написати:
data.title = 'It works!'
То текст на сторінці зміниться автоматично. (І не треба ніякої мороки з дайджест-циклом через angular.element(e).scope().$apply()
(Ангуляр-страждання, забийте)).
От так в’ю оновлюється коли змінюється модель. Як користувач може змінити модель?
Двостороннє з’єднання даних
Не змінюючи JavaScript додамо в наш HTML поле для вводу тексту (зверніть увагу на атрибут v-model
):
<div id="app"> <h2>{{title}}</h2> <input type="text" v-model="title" /> </div>
Все, тепер при зміні тексту в полі редагування, зміниться і заголовок.
Відображення масивів
Змінимо дані аби вони містили якийсь масив, наприклад з іменами атрибутів об’єкта Vue:
var data = { title: "Vue contains:", list: Object.keys(Vue) };
Тепер, аби повторити якийсь елемент HTML для кожного елемента масиву, використовуємо атрибут v-for
:
<div id="app"> <h2>{{title}}</h2> <ul> <li v-for="key in list">{{key}}</li> </ul> </div>
Оновивши сторінку в браузері побачимо щось таке:
Vue contains:
- util
- set
- delete
- nextTick
- …
І знову ж таки, при зміні того списку, вміст сторінки оновлюється.
Класи і стилі
Добре, вміст елементів можна описати шаблоном в фігурних дужках, а як змінювати оформлення? Нехай ми хочемо показувати заголовок чи поле для його редагування залежно від того чи поставлена десь галочка. Нам потрібний заголовок, його редактор і перемикач:
<div id="app"> <h2>{{title}}</h2> <input type="text" v-model="title"> <label><input type="checkbox" v-model="edit">Edit</label> </div>
Модель проста:
var data = { title: "Change me", edit: false };
Залишилось приховати редактор коли edit == false
і приховати заголовок коли він true
.
Використовуємо атрибут v-bind:style
, який приймає вираз що повертає об’єкт з властивостями CSS:
<h2 v-bind:style="{display: edit ? 'none': 'block'}">{{title}}</h2> <input type="text" v-model="title" v-bind:style="{display: edit ? 'inline': 'none'}" />
Якщо ж у нас є клас для якого описаний стиль:
.hidden { display: none; }
То можна використати v-bind:class
який задає вираз що повертає об’єкт, ключами якого є назви класів, а булевими значеннями задається чи клас буде застосований до об’єкта. Також можна повернути масив з класами.
<h2 v-bind:class="{hidden: edit}">{{title}}</h2> <input type="text" v-model="title" v-bind:class="{hidden: !edit}" />
Кнопки та інші події
Добре, а що якщо я хочу аби щось робилось при натисненні на кнопку? Наприклад те ж перемикання режиму редагування.
Спочатку треба оновити код створення нашого об’єкта Vue, передавши в його конфігурацію також поле methods
. Це об’єкт який містить методи доступні з HTML. Методи мають доступ до моделі через змінну this
. Код перемикача режиму редагування тривіальний:
new Vue({ el: '#app', data: data, methods: { toggleEdit: function() { this.edit = !this.edit; } } });
Тепер, щоб запускати цей метод, додамо справа від заголовка кнопку. Дія яка відбувається по кліку на елементі задається в атрибуті v-on:click
:
<h2 v-bind:class="{hidden: edit}"> {{title}} <button v-on:click="toggleEdit">Edit</button> </h2>
Залишається лише проблема того що при перемиканні в режим редагування кнопка пропадає разом із заголовком, бо вона в ньому. Але це й логічно, бо ми вже в режимі редагування, кнопка “Edit” нам не потрібна. Давайте вимкнемо редагування коли користувач натисне “Enter”. Знаєте як це зробити? v-on:keyup.enter
<input type="text" v-model="title" v-bind:class="{hidden: !edit}" v-on:keyup.enter="toggleEdit" />
Ооо, дас іст фантастіш! Хіба ні? Але ще краще, це така частовживана директива, що замість v-on:
можна писати @
, і v-on:click="toggleEdit"
, можна написати @click="toggleEdit"
.
P.S. Нестандартні для HTML атрибути елементів як і в Angular називаються директивами, і я їх надалі так називатиму. У Vue-js починаються з префікса v-
.
Обчислювані властивості
Давайте напишемо форму для вводу паролю з валідацією.
<div id="app"> <input type="password" v-model="password" placeholder="Choose password" /> <br /> <input type="password" v-model="rePassword" placeholder="Repeat your password" /> <p>{{formError}}</p> </div>
В formError
будемо класти повідомлення про те що паролі закороткі або не співпадають. Але як? Є ще одне поле куди можна складати функції, називається computed
. Ці функції автоматично переобчислюватимуться коли змінюється модель, а в HTML виглядають як звичайні змінні. Тому валідація може виглядати так:
var data = { password: '', rePassword: '', }; new Vue({ el: '#app', data: data, computed: { formError: function() { if(this.password.length < 8) { return 'Password should have more than 8 characters'; } if(this.password != this.rePassword) return 'Passwords did not match'; return 'Ok'; } } });
Питання для самоконтролю
Чув що складати списки питань – ефективніший спосіб вчитися ніж просто читати.
- Які параметри приймає
Vue
і які їх функції? - Що таке
v-model
і для чого воно? - Що таке
v-for
і як воно використовується? - Що таке
v-bind:style
? - Що таке
v-bind:class
? - Що таке
v-bind:class
? - Який атрибут задає дію при клацанні по елементу?
- Де можна описувати методи які викликаються при різних подіях?
- Як викликати метод submitForm при натисненні в елементі клавіші Enter?
- Що позначає символ “@”?
- Що описують в полі
computed</code?
Література
Конспект покриває сторінки 15 по 46 книжки (але тут приклади коду мої, текст теж)
- Filipova, Olga (2016). Learning Vue.js 2: learn how to build amazing and complex reactive web applications easily with Vue.js. ISBN 978-1-78646-113-1.
Підтримати автора книжки можна тут: https://www.packtpub.com/web-development/learning-vuejs-2
Filed under: Кодерство, Павутина Tagged: JavaScript
