vuejs¶
Mustache
<-- отображаем данные в элементе -->
<div id='todos' data-title='{{title}}'></div>
<-- отображаем элементы из списка -->
<ul>
<li v-repeat='tasks'>{{title}}</li>
<-- внутри цикла достцпны перменные $index, $key, $value -->
</ul>
<ul>
<li v-repeat='task: tasks'>{{title}}</li>
<-- внутри цикла достцпны перменные $index, $key, $value -->
<span v-show='task != editTask' v-on='dblclick: editTask = task' v-class='text-primary : task.done'>{{ task.title }}</span>
<input v-show='task == editTask' type='text' v-model='editTask.title' v-on='keyup: editTask = null | key "enter"'>
</ul>
<-- обработка формы -->
<form v-on='submit: addTask'>
<input lazy v-model='newTask'>
<-- lazy - данные попадут в модель после события change -->
<span v-on='click: removeTask($index)'>
</form>
<-- фильтр, выводим значение переменной в json формате -->
<pre>
{{ $data | json }}
</pre>
var Todos = Vue.extend({
name: 'todos'
});
var vm = new Todos({
el: '#todos', // элемент внутри которого работаем
data: {
title: 'todos'
},
ready: function(){
console.log('viewmodel ready!');
}
});
var vm2 = new Todos({
// элемент внутри которого работаем, селектор или сам элемент
el: '#todos',
// данные вьюхи
data: {
tasks: [
{
title: '1',
done: true
}, {
title: '2',
done: false
}
],
newTask: '',
editTask: ''
},
// фильтры
filters: {
openTasks: function(){
return this.tasks.filter(function(item){
return item.done;
});
}
},
// методы
methods: {
addTask: function(event){
// обработчик сабмита формы
e.preventDefault();
console.log('Task added');
this.tasks.push({title: this.newTask, done: false})
this.newTask = '
},
removeTask: function(index){
this.tasks.$remove(index);
}
}
ready: function(){
console.log('viewmodel ready!');
}
});
// познеесвязывание представления с вьюмоделью
vm.$mount('todos');
// изменение данных в ВМ
vm.$data.title = '123'
// добавление данных в ВМ
vm.$data.$add('title', 'NewTitle);
Директивы¶
v-text - текстовое содержимое элемента, textContent
<span v-text='variable'></span>
v-html - innerHTML
<span v-html='html'></span>
v-attr - attributes
<img v-attr="width: '100px', height: '100px'"/>
v-class - добавляет классы
<span v-class="red: true"></span>
v-style - css-style
<span v-style="css.string, css.object">
v-show, v-if - display
<span v-show="true"> <span v-if="false">
v-on - добавляет обработчик событий
<span v-on="click: callback, blur: red = !red"> <form v-on="submit: callback($event)"> <textarea v-on="keyup: callback($event) | key 13"> // enter <textarea v-on="keyup: callback($event) | key 'enter'"> // enter
v-el - задает идентификатор элементу
<textarea v-el="comment" v-on="submit: callback($event)"> <script> callback: function(event){ this.$$.comment.value; } </script>
v-pre - элемент не используется для дата биндинга
v-repeat - цикл, track-by - ключ, идентификатор, для того чтобы не перерисовывать объект
v-model- lazy, debounce - таймер для синхронизации, number - преобразовать к числу если возможно
<script>
Vue.directive('test', {
bind: function(){
// привязываем элемент к директиве
},
unbind: function(){
// удаляем директиву из элемента
},
update: function(newValue, oldValue){
// значение будет изменено
}
})
Vue.directive('test', function(){
// удаляем директиву из элемента
}
})
</script>
<span v-test=''/>
<script>
Vue.elementDirective('like', {
bind: function(){
},
});
</script>
<like/>
Фильтры¶
Vue.filter('filter-name', {
read: function(value){
},
write: function(newValue, oldValue){
}
})
Vue.filter('filter-name', function(value, ends){
},
})
json
capitalize
uppercase
lowercase
currence ‘RUB’
pluralize ‘item’
pluralize ‘ый’ ‘ой’
filterBy ‘t’ - поиск во всех свойствах
filterBy ‘t’ in ‘title’ - поиск в указанных свойствах
orderBy ‘id’ true
Вычисляемые поля¶
var vm = new Vue({
el: '#container',
data: {},
computed: {
full_name: {
get: function(){},
set: function(value){},
},
initials: function(){
// сеттер нам не нужен
},
}
});