Vue.js'de bir yöntem ve hesaplanan değer arasındaki temel fark nedir?
Aynı ve değiştirilebilir görünüyorlar.
Vue.js'de bir yöntem ve hesaplanan değer arasındaki temel fark nedir?
Aynı ve değiştirilebilir görünüyorlar.
Yanıtlar:
Hesaplanan değerler ve yöntemler Vue'da çok farklıdır ve çoğu durumda kesinlikle değiştirilemez.
Hesaplanmış Mülk
Hesaplanan bir değer için daha uygun bir ad, hesaplanan bir özelliktir . Aslında, Vue somutlaştırıldığında, hesaplanan özellikler bir alıcı ve bazen bir ayarlayıcı ile Vue'nun bir özelliğine dönüştürülür. Temel olarak, hesaplanan bir değeri, hesaplamak için kullanılan temel değerlerden biri güncellendiğinde otomatik olarak güncellenecek türetilmiş bir değer olarak düşünebilirsiniz. Sen yok diyoruz bir bilgisayarlı ve herhangi parametreleri kabul etmez. Hesaplanmış bir özelliğe, tıpkı bir data özelliğinde olduğu gibi başvurursunuz. Belgelerden klasik örnek :
computed: {
// a computed getter
reversedMessage: function () {
// `this` points to the vm instance
return this.message.split('').reverse().join('')
}
}
DOM'da şu şekilde referans verilir:
<p>Computed reversed message: "{{ reversedMessage }}"</p>
Hesaplanan değerler, Vue'nuzda bulunan verileri işlemek için çok değerlidir. Verilerinizi filtrelemek veya dönüştürmek istediğinizde, genellikle bu amaçla hesaplanan bir değer kullanırsınız.
data:{
names: ["Bob", "Billy", "Mary", "Jane"]
},
computed:{
startsWithB(){
return this.names.filter(n => n.startsWith("B"))
}
}
<p v-for="name in startsWithB">{{name}}</p>
Hesaplanan değerler, değişmediğinde yeniden hesaplanması gerekmeyen bir değerin tekrar tekrar hesaplanmasını önlemek için de önbelleğe alınır (örneğin, bir döngüde olmayabilir).
Yöntem
Yöntem sadece Vue örneğine bağlı bir işlevdir. Yalnızca açıkça çağırdığınızda değerlendirilir. Tüm javascript işlevleri gibi parametreleri kabul eder ve her çağrıldığında yeniden değerlendirilir. Yöntemler aynı durumlarda yararlıdır, herhangi bir işlev yararlıdır.
data:{
names: ["Bob", "Billy", "Mary", "Jane"]
},
computed:{
startsWithB(){
return this.startsWithChar("B")
},
startsWithM(){
return this.startsWithChar("M")
}
},
methods:{
startsWithChar(whichChar){
return this.names.filter(n => n.startsWith(whichCharacter))
}
}
Vue'nun belgeleri gerçekten iyi ve kolayca erişilebilir. Bunu öneririm.
@Gleenk, yöntemler ve hesaplanan özellikler arasındaki önbellek ve bağımlılık farklarını belirginleştirmek için pratik bir örnek istediğinden, basit bir senaryo göstereceğim:
new Vue({
el: '#vue-app',
data: {
a: 0,
b: 0,
age: 20
},
methods: {
addToAmethod: function(){
console.log('addToAmethod');
return this.a + this.age;
},
addToBmethod: function(){
console.log('addToBmethod');
return this.b + this.age;
}
},
computed: {
addToAcomputed: function(){
console.log('addToAcomputed');
return this.a + this.age;
},
addToBcomputed: function(){
console.log('addToBcomputed');
return this.b + this.age;
}
}
});
Burada aynı görevi gerçekleştiren 2 yöntem ve 2 hesaplanmış özelliğimiz var. Yöntemler addToAmethod
ve addToBmethod
hesaplanan özellikler addToAcomputed
ve addToBcomputed
hepsi age
ya + ' a
ya +20 (yani değer) ekler b
. Yöntemlerle ilgili olarak, her ikisi de , belirli bir yöntemin bağımlılıkları değişmemiş olsa bile, listelenen özelliklerin herhangi biri üzerinde her eylem gerçekleştirildiğinde çağrılır . Hesaplanan özellikler için, kod yalnızca bir bağımlılık değiştiğinde yürütülür; örneğin, A veya B'yi ifade eden belirli özellik değerlerinden biri tetiklenir veyaaddToAcomputed
addToBcomputed
, sırasıyla .
Yöntem ve hesaplanmış açıklamalar oldukça benzer görünüyor, ancak @Abdullah Khan zaten belirttiği gibi, aynı şey değiller ! Şimdi, her şeyi birlikte yürütmek ve farkın nerede olduğunu görmek için bazı html eklemeye çalışalım.
new Vue({
el: '#vue-app',
data: {
a: 0,
b: 0,
age: 20
},
methods: {
addToAmethod: function(){
console.log('addToAmethod');
return this.a + this.age;
},
addToBmethod: function(){
console.log('addToBmethod');
return this.b + this.age;
}
}
});
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>VueJS Methods - stackoverflow</title>
<link href="style.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.11/vue.min.js"></script>
</head>
<body>
<div id="vue-app">
<h1>Methods</h1>
<button v-on:click="a++">Add to A</button>
<button v-on:click="b++">Add to B</button>
<p>Age + A = {{ addToAmethod() }}</p>
<p>Age + B = {{ addToBmethod() }}</p>
</div>
</body>
<script src="app.js"></script>
</html>
"A'ya ekle" düğmesine tıkladığımda , tüm yöntemler çağrılır (yukarıdaki konsol günlüğü ekranı sonucuna bakın), addToBmethod()
yürütülür ancak "B'ye Ekle" düğmesine basmadım; B'yi ifade eden özellik değeri değişmedi. Aynı davranış, "B'ye Ekle" düğmesini tıklamaya karar verirsek de gelir , çünkü yine her iki yöntem de bağımlılık değişikliklerinden bağımsız olarak çağrılır. Bu senaryoya göre bu kötü bir uygulamadır çünkü yöntemleri bağımlılıklar değişmemiş olsa bile her seferinde uyguluyoruz. Değişmeyen özellik değerleri için bir önbellek olmadığından bu gerçekten kaynak tüketir.
new Vue({
el: '#vue-app',
data: {
a: 0,
b: 0,
age: 20
},
computed: {
addToAcomputed: function(){
console.log('addToAcomputed');
return this.a + this.age;
},
addToBcomputed: function(){
console.log('addToBcomputed');
return this.b + this.age;
}
}
});
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>VueJS Computed properties - stackoverflow</title>
<link href="style.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.11/vue.min.js"></script>
</head>
<body>
<div id="vue-app">
<h1>Computed Properties</h1>
<button v-on:click="a++">Add to A</button>
<button v-on:click="b++">Add to B</button>
<p>Age + A = {{ addToAcomputed }}</p>
<p>Age + B = {{ addToBcomputed }}</p>
</div>
</body>
<script src="app.js"></script>
</html>
"A'ya Ekle" düğmesine tıkladığımda addToAcomputed
, daha önce de belirttiğimiz gibi, hesaplanan özellikler yalnızca bir bağımlılık değiştiğinde yürütüldüğünden yalnızca hesaplanan özellik çağrılır. "B'ye ekle" düğmesine basmadığım ve B için yaş özelliği değeri değişmediği için, hesaplanan özelliği çağırmak ve yürütmek için bir neden yoktur addToBcomputed
. Bu nedenle, belirli bir anlamda, hesaplanan özellik, B özelliği için bir tür önbellek gibi "aynı değişmemiş" değeri korur. Ve bu durumda bu iyi bir uygulama olarak kabul edilir .
Gönderen docs
.. hesaplanan özellikler bağımlılıklarına göre önbelleğe alınır. Hesaplanan bir özellik yalnızca bazı bağımlılıkları değiştiğinde yeniden değerlendirilir.
Verilerin önbelleğe alınmasını istiyorsanız Öte yandan, verilerin önbelleğe alınmasını istemiyorsanız Computed özelliklerini kullanın.
Hesaplanan ve yöntem arasındaki farklardan biri. Sayaç değerini döndürecek bir fonksiyonumuz olduğunu varsayın (sayaç sadece değişkendir). Bakalım fonksiyon her ikisinde de nasıl davranıyor bilgisayarlı ve yöntem
Hesaplanmış
İlk yürütme sırasında, işlevin içindeki kod yürütülür ve vuejs sayaç değerini önbellekte depolar (daha hızlı erişim için). Fakat biz fonksiyonu tekrar çağırdığımızda vuejs tekrar bu fonksiyonun içinde yazılı olan kodu yürütmeyecektir. Önce sayaçta yapılan değişiklikleri kontrol eder. Herhangi bir değişiklik yapılmışsa, sadece o fonksiyonun içindeki kodu tekrar çalıştıracaktır. Sayaçta herhangi bir değişiklik yapılmazsa vuejs işlevi tekrar yürütmez. Önbellekten önceki sonucu döndürür.
Yöntem
Bu, javascript'teki normal bir yöntem gibidir. Yöntemi her çağırdığımızda, sayaçta yapılan değişikliklerden bağımsız olarak her zaman fonksiyonun içindeki kodu çalıştırır.
Yöntem, koddaki değişikliklerden bağımsız olarak kodu her zaman yeniden uygular. burada hesaplandığı gibi kodu ancak bağımlılık değerlerinden biri değiştiğinde yeniden uygular. Aksi takdirde bize yeniden yürütmeden önbellekten önceki sonucu verir
İşte bu sorunun bir dökümü.
Yöntemler ne zaman kullanılır?
Hesaplanan özellikler ne zaman kullanılır?
Hesaplanan Özellikler
Hesaplanan özelliklere de hesaplanmış değer denir. Bu, güncellenir ve her zaman değiştirilebilir anlamına gelir. Ayrıca, değişene kadar verileri önbelleğe alır. Vue somutlaştırıldığında, hesaplanan özellikler bir özelliğe dönüştürülür.
Paylaşmak istediğim bir şey daha, hesaplanan özelliklerde herhangi bir parametre iletemezsiniz, bu nedenle herhangi bir bilgisayar özelliğini çağırırken parantez gerekmez.
Yöntemler
Yöntemler işlev ile aynıdır ve aynı şekilde çalışır. Ayrıca, bir yöntem siz çağırmadıkça hiçbir şey yapmaz. Ayrıca, tüm javascript işlevleri gibi, parametreleri kabul eder ve her çağrıldığında yeniden değerlendirilir. Bundan sonra değerleri önbelleğe alamazlar
Parantez çağıran yöntemde orada ve buna bir veya daha fazla parametre gönderebilirsiniz.
Aynı soru üzerine tökezledi. Bana göre bu daha açık:
v-on directive
bunu bir yöntem izlediğinde, tam olarak hangi yöntemi arayacağını ve ne zaman çağrılacağını bilir .<button v-on:click="clearMessage">Clear message</button> // @click
// method clearMessage is only called on a click on this button
<input v-model="message" @keyup.esc="clearMessage" @keyup.enter="alertMessage" />
/* The method clearMessage is only called on pressing the escape key
and the alertMessage method on pressing the enter key */
v-on directive
çağrıldığında , DOM'u güncelleyen sayfada bir etkinlik her tetiklendiğinde çağrılır (veya yalnızca sayfanın bir bölümünü yeniden oluşturması gerekir). Bu yöntemin tetiklenen olayla ilgisi olmasa bile.<p>Uppercase message: {{ messageUppercase() }}</p>
methods: {
messageUppercase() {
console.log("messageUpercase");
return this.message.toUpperCase();
}
}
/* The method `messageUppercase()` is called on every button click, mouse hover
or other event that is defined on the page with the `v-on directive`. So every
time the page re-renders.*/
this
sözcük tarafından başvurulan bir özellik değeri değiştirildiğinde çağrılır .<p>Uppercase message: {{ messageUppercase }}</p>
data() {
return {
message: "I love Vue.js"
}
},
computed: {
messageUppercase() {
console.log("messageUpercase");
return this.message.toUpperCase();
}
}
/* The computed property messageUppercase is only called when the propery message is
changed. Not on other events (clicks, mouse hovers,..) unless of course a specific
event changes the value of message. */
Buraya götürmek, computed
bir yöntemin çağrılmaması durumunda özellikleri kullanmak için en iyi uygulamadır v-on directive
.