Не варто припиняти вчити щось нове, правда? І писати – надійніший метод запам’ятати ніж просто читати, тому спробую повернути блог до життя.
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