В прошлых уроках курса VueJS я рассказал и показал, что такое свойства и методы. Во VueJS есть так называемые Computed Properties или Вычисляемые свойства. С вами Сергей Никонов и давайте рассмотрим примеры.
Смотрите видео про Вычисляемые свойства VueJS (Computed Properties )
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>FructCode VueJS</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<div id="app">
<div class="wrapper">
<div class="control-panel">
<p class="profile-hello">
Привет, {{ fullName }}!
<input type="text" v-model="tempName">
<button v-on:click="setName()"> Set </button>
<button v-on:click="rndValue()"> {{rndNum}} </button>
</p>
</div>
<div class="profile-card">
<div class="profile-header">
<img :src="profile_back_img">
</div>
<div class="profile-body">
<div class="user-img">
<img :src="profile_img">
</div>
<div class="name">{{ first_name + ' ' + last_name; }}</div>
<div class="bio">
<p>{{ bio }}</p>
</div>
<div class="social-icon">
<ul>
<li v-for="(item, key) in social_links">
<a :href="item" target="_blank">
<i class="fa" :class="key"></i>
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
tempName: '',
rndNum: 0,
first_name: 'Sergei',
last_name: 'Nikonov',
bio: 'Автор курсов программирования и основатель проекта FructCode',
profile_img: 'https://fructcode.com/uploads/user/photo/5a711ac714ad7.jpg',
profile_back_img: 'https://fructcode.com/uploads/img/blog/13ee471281559f0812396e5153452c52/a768558507_fructcode.jpg',
social_links: {
'fa-facebook-f': 'https://www.facebook.com/fructcodecom/',
'fa-vk': 'https://vk.com/fructcodecom',
'fa-youtube': 'https://www.youtube.com/channel/UCXneQRoicIlzKJe_yKnYt4g',
'fa-instagram': 'https://www.instagram.com/fructcodecom/',
}
},
methods: {
getFullName: function() {
console.log('getFullName Method');
return this.first_name.toUpperCase() + ' ' + this.last_name;
},
rndValue: function() {
this.rndNum = Math.floor((Math.random() * 100) + 1);
},
setName: function() {
this.fullName = this.tempName;
}
},
computed: {
fullName: {
get: function() {
return this.first_name.toUpperCase() + ' ' + this.last_name;
},
set: function(value) {
let names = value.split(' ');
this.first_name = names[0];
this.last_name = names[names.length - 1];
}
}
}
})
</script>
</body>
</html>
<div class="social-icon">
<ul>
<li v-for="(item, key) in social_links">
<a :href="item" target="_blank">
<i class="fa" :class="key"></i>
</a>
</li>
</ul>
</div>
{{ first_name + ' ' + last_name }}
Так делать не очень хорошо, так как вьюшки должны быть понятными и хорошо читаться. Но представим ситуацию, если мы захотим при выводе имени и фамилии добавить какой-то еще алгоритм, например мы захотим, чтобы все наши буквы были в верхнем регистре или еще что-то. Понятно, что конкретно для верхнего регистра мы можем добавить css-стиль:
text-transform: uppercase;
но здесь для примера, мы сделаем все буквы в верхнем регистре с помощью javascript:
{{ first_name.toUpperCase() + ' ' + last_name }}!
<p class="profile-hello">Здравствуйте, {{ first_name.toUpperCase() + ' ' + last_name }}!</p>
methods: {
getFullName: function() {
return this.first_name + ' ' + this.last_name;
}
}
rndNum: 0,
Далее создадим метод, который будет генерировать случайное число от 1 до 100:
rndValue: function() {
this.rndNum = Math.floor((Math.random() * 100) + 1);
},
Сейчас давайте создадим во view кнопку и поместим в нее этот метод:
<button v-on:click="rndValue()">{{ rndNum }}</button>
И давайте добавим в метод getFullName console.log для того, чтобы в консоли разработчика отображался вызов нашего метода:
console.log('getFullName Method');
Использование Computed Properties (вычисляемые свойства)
fullName: function () {
return this.first_name + ' ' + this.last_name;
}
И выводить его в верстке можно как обычное свойство:
<div class="name">{{ fullName }}</div>
computed: {
fullName: {
get: function() {
return this.first_name + ' ' + this.last_name;
},
set: function(value) {
let names = value.split(' ');
this.first_name = names[0];
this.last_name = names[names.length - 1];
}
}
}
tempName: ''
<input v-model="tempName">
И сделаем еще одну кнопку set, которая будет вызывать метод для изменения имени:
<button v-on:click="setName()">set</button>
И добавим еще один метод:
setName: function() {
this.fullName = this.tempName;
},