Open NickBerilov opened 7 years ago
Vue.js - UI-фреймворк для JavaScript. В отличие от фреймворков-монолитов, Vue создан пригодным для постепенного внедрения. Его ядро в первую очередь решает задачи уровня представления (view), что упрощает интеграцию с другими библиотеками и существующими проектами. Хоть и не такой популярный, как его основные конкуренты - Angular и React - этот фреймворк набирает популярность благодаря его простоте и интегрируемости. Vue - прогрессивный фреймворк. Вкратце это означает, что у Vue есть:
Почему Vue?
Хотя он и не жестко связан с паттерном MVVM, дизайн Vue’s был частично им вдохновлен. По конвенции, переменная vm
используется, чтобы ссылаться на экземпляр Vue:
var data = { name: 'Nick' }
var vm = new Vue({
el: '#example',
data: data
})
Теперь нужно только добавить элемент, к которому можно привязать этот экземпляр:
<div id="example">
Hello, {{ name }}
</div>
и вуаля! У вас есть Vue-приложение! Но постойте, это еще не все.
Использую префикс $
, можно обращаться к полям экземпляра:
vm.$data === data // true
vm.$el === document.getElementById('example') // true
, а также его методам, таким как $watch()
:
vm.$watch('name', function (newVal, oldVal) {
// this callback will be called when `vm.name` changes
})
Каждый экземпляр Vue проходит через ряд шагов при инициализации, у каждого из этих шагов есть хук жизненного цикла, ассоциированный с ним, к примеру created
, mounted
, updated
и destroyed
:
var vm = new Vue({
data: {
name: 'Nick'
},
created: function () {
// `this` points to the vm instance
console.log('name is: ' + this.name)
}
})
// -> "name is: Nick"
Vue-шаблоны также используют стандартный синтаксис "Mustache" (как и Angular). У Vue имеется ряд удобных директив (тоже как в Angular), которые используют префикс v-
:
<span v-once>This will never change: {{ msg }}</span>
<ul id="example">
<li v-for="item in items"> <!-- v-for directive renders the element once for each item in the items array -->
{{ item.message }}
</li>
</ul>
Этот, например, не позволит отображению элемента измениться, даже когда меняется msg
.
"Mustaches" не могут быть использованы в HTML-атрибутах, поэтому нужно использовать директиву v-bind
:
<div v-bind:id="dynamicId"></div>
Некоторые директивы, такие как v-bind
or v-on
, принимают аргумент, который идет после двоеточия после имени директивы. У некоторых директив есть модификаторы, который позволяют производить некоторые изящные трюки, как, например, с .prevent
:
<form v-on:submit.prevent="onSubmit"></form>
который, кроме действия, назначенного в v-on:submit
, также вызывает event.preventDefault()
.
Vue также позволяет определять filters, которые могут быть использованы для форматирования текста:
new Vue({
// ...
filters: {
capitalize: function (value) {
if (!value) return ''
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
}
}
})
Фильтры добавляются в конце JS-выражения, обозначенные символом вертикальной черты.
У некоторых из наиболее широко используемых директив - v-bind
и v-on
- имеются сокращения, которые хоть и необязательны, но могут сэкономить вам немого времени:
<!-- full syntax -->
<a v-bind:href="url"></a>
<!-- shorthand -->
<a :href="url"></a>
<!-- full syntax -->
<a v-on:click="doSomething"></a>
<!-- shorthand -->
<a @click="doSomething"></a>
Внутришаблонные выражения очень удобны, но они предназначены только для очень простых операций. Помещение в шаблон слишком большого количества логики делает их раздутыми и тяжело поддерживаемыми. Тут в игру вступают вычисляемые выражения:
<div id="example">
<p>Original message: "{{ message }}"</p>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
var vm = new Vue({
el: '#example',
data: {
message: 'Hello'
},
computed: {
// a computed getter
reversedMessage: function () {
// `this` points to the vm instance
return this.message.split('').reverse().join('')
}
}
})
Вы спросите: "В чем разница между вычисляемыми выражениями и методами?".
// in component
methods: {
reverseMessage: function () {
return this.message.split('').reverse().join('')
}
}
Дело в том, что вычисляемые выражения кэшируются исходя из своих зависимостей. Вычисляемое выражение будет перерасчитываться только когда изменилась его зависимость, в отличие от методов, которые запускают свою функцию при каждом переотображении.
Компоненты позволяют расширять базовые HTML-елементы, инкапсулируя повторяющийся код. На высшем уровне, компоненты - пользовательские элементы, к которым компилятор Vue прикрепляет поведение. Используйте Vue.component()
чтобы зарегистрировать глобальный компонент:
<div id="example">
<my-component></my-component>
</div>
// register
Vue.component('my-component', {
template: '<div>A custom component!</div>'
})
// create a root instance
new Vue({
el: '#example'
})
Что отобразит:
<div id="example">
<div>A custom component!</div>
</div>
Компонент также можно регистрировать локально:
new Vue({
// ...
components: {
// <my-component> will only be available in parent's template
'my-component': {
template: '<div>A custom component!</div>'
}
}
})
Для того, чтобы начать работать с Vue, нужно лишь его установить. Это можно сделать, либо используя CDN-дистрибутив (Vue - очень легковесная библиотека, так что это нормальный способ), или установить его с помощью npm install vue
или bower install vue
. Vue также предоставляет официальный CLI, который позволяет быстро настроить и управлять будущим проектом
Написал несколько комментариев к русской версии.
Также в коде есть коммент
Всё нормально теперь
Overview
Vue.js is a JavaScript UI framework. Unlike other monolithic frameworks, Vue is designed from the ground up to be incrementally adoptable. The core library is focused on the view layer only, and is easy to pick up and integrate with other libraries or existing projects. Although not as popular as its main competitors - Angular and React - the framework has been gaining popularity due to its simplicity and adoptability. Vue is a progressive framework. In short, that means Vue has:
Why Vue?
Concepts
Although not strictly associated with the MVVM pattern, Vue’s design was partly inspired by it. As a convention, the
vm
variable is often used to refer to the Vue instance:Now you just need an element to bind that instance to:
and voilà! You've got yourself a Vue app! But wait, there's more to it than that. By using the
$
prefix you can address the instance's fields:as well as use the instance methods, such as
$watch()
:Each Vue instance also goes through a series of steps during it's initialization, each of these steps has a lifecycle hook associated with it, such as
created
,mounted
,updated
anddestroyed
:Vue templates use the standard "Mustache" syntax (same as Angular). Vue has a number of convenient directives (also same as Angular), which use the
v-
prefix :This one, for example, will not allow the view inside this element to update, even once the
msg
changes. "Mustaches" cannot be used inside HTML attributes, so thev-bind
directive should be used:Some directives, such as
v-bind
orv-on
accept an argument, which comes after a colon right after the directive's name. Some directives can have modifiers that allow you to do some nifty things, such as.prevent
:that, aside from the action assigned to
v-on:submit
, also calls theevent.preventDefault()
. Vue also allows you to define filters, that can be used for text formatting:Filters are appended to the end of the JavaScript expression, denoted by the “pipe” symbol. Several most used directives -
v-bind
andv-on
- have shorthands, which are entirely optional, but can save you a bit of time:In-template expressions are very convenient, but they cater for non-complicated operations exsclusively. Putting too much logic into your templates can make them bloated and hard to maintain. That's where computed expressions come into play:
"What's the difference between computed expressions and methods?" you might ask.
The thing is, computed properties are cached based on their dependencies. A computed property re-evaluates only in case when some of its dependencies are changed, opposed to methods, which always run the function whenever the re-render occurs. Components allow you to extend basic HTML elements to encapsulate reusable code.At a high level, components are custom elements that Vue’s compiler attaches behavior to. Use
Vue.component()
to register a global component:Which will render
You can also register a component locally:
Requirements
In order to start working with Vue all you need is to install Vue. You can either use the CDN distributive (Vue is a very lightweight library so it's absolutely fine), or install it via
npm install vue
orbower install vue
. Vue provides an official CLI that allows you to quickly set up and easily manage your future project.