Vue içinde hesaplanan yöntem vs


178

Vue.js'de bir yöntem ve hesaplanan değer arasındaki temel fark nedir?

Aynı ve değiştirilebilir görünüyorlar.


Belki sizin için yararlı olabilir: vuejs.org/v2/guide/computed.html#Computed-Properties
DunDev

1
@xDreamCoding Bağlandığınız yanıt bu soruyu gerçekten ele alıyor, ancak hiçbir şekilde bu soru yinelenmiyor. Ayrıca daha ünlü.
Romain Vincent

Hesaplanmış özelliklerin vs yöntemleri başlığı altında bu konuya ışık tutan belgelere başvurun: vuejs.org/v2/guide/computed.html
Kshitij Dhyani

Yanıtlar:


243

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.


1
bir kullanıcıdan, c'den f'ye bir sıcaklık dönüşümü gibi iki giriş varsa ve her iki girişin birbirlerinin değerini belirleyebileceği tersi. Bakınız albireo.ch/temperatureconverter ve iki girişin dönüştürme düğmesine basmadan otomatik olarak tepki vermesi . hangisi bilgisayarlı veya metodlar için en uygunudur?
Bootstrap4

2
Bunun üzerine belirli UI nerede girdiler arasındaki dairesel ilişkiyle, ben yöntemlerle gider. codepen.io/Kradek/pen/gROQeB?editors=1010
Bert

2
@ Bootstrap4 Yine de, burada da bilgisayarlı bir tane var, ama daha karmaşık. codepen.io/Kradek/pen/gROQeB?editors=1010
Bert

3
> Bir yöntem ... yalnızca açıkça çağırdığınızda değerlendirilir. Bu videoya göre değil: youtube.com/watch?v=O14qJr5sKXo
Cameron Hudson

2
@CameronHudson Videodaki örnekte, şablonda açıkça belirtildiği için yöntemler değerlendirilir . İşte farkı gösteren bir örnek . Yöntemleri yalnızca veri değiştiğinde dendiğini Not eğer onlar açıkça şablonunda başvurulur.
Bert

60

@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:

app.js

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 addToAmethodve addToBmethodhesaplanan özellikler addToAcomputedve addToBcomputedhepsi ageya + ' aya +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 veyaaddToAcomputedaddToBcomputed , 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.

Yöntem vaka demosu

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çıklanan sonuç

"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.

yöntem düğme yöntemi

Hesaplanan mal varlığı demosu

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çıklanan sonuç

"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 .

hesaplanmış düğme hesaplandı


3
1 düğmesine basıldığında neden tüm yöntemler uygulanır? Nedeni / mantığı nedir?
Bsienn

1
@Bsienn bu iyi bir soru: Nedeni, temelde Vue'nun neyin güncellenmiş olduğuna bağlı olarak hangi yöntemlerden birinin çalışması gerektiğini bilmemesi. Ve bu, hesaplanmış özelliklerin yaptığı işlemlerdir, hesaplanması veya yeniden hesaplanması gereken değişkenleri izlerler ve yalnızca gerektiğinde çalışırlar.
Giulio Bambini

2
Yöntemleri kullanmanın nedenleri nelerdir? Bilgisayarlı özellikler sadece daha iyi gibi görünüyor ('get' yöntemleri hakkında konuştuğunu varsayarak) ...
user3529607

5
@ user3529607 ancak hesaplanan özellikler bağımsız değişken almıyor.
Rodion Golovushkin

3
@ user3529607 Anlayabildiğim kadarıyla, yöntemler vue örneğini bağlarken veya oluştururken yararlı olabilir. Hesaplanan özelliklerle aynı şey yapılamaz. Ayrıca, hesaplanan özelliklerin değerini de döndürmeliyiz.
Dhaval Chheda

13

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.


1
Merhaba, pratik kullanım farkını göstermek için yararlı bir örnek yazabilir misiniz?
Davide De Maestri

@gleenk Yöntemler ve hesaplanan özellikler arasındaki bu önbellek / bağımlılık farkını göstermek için pratik bir örnek ekleyeceğim. Umarım takdir edersiniz.
Giulio Bambini

@GiulioBambini
Davide De Maestri

7

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


6

İşte bu sorunun bir dökümü.

Yöntemler ne zaman kullanılır?

  • DOM'da gerçekleşen bir olaya tepki vermek için
  • Bileşeninizde bir şey olduğunda bir işlevi çağırmak için.
  • Hesaplanan özelliklerden veya izleyicilerden bir yöntem çağırabilirsiniz.

Hesaplanan özellikler ne zaman kullanılır?

  • Mevcut veri kaynaklarından yeni veri oluşturmanız gerekir
  • Şablonunuzda kullandığınız bir veya daha fazla veri özelliğinden oluşan bir değişkeniniz var
  • Karmaşık, yuvalanmış bir özellik adını daha okunabilir ve kullanımı kolay bir adla azaltmak istiyorsunuz (ancak orijinal özellik değiştiğinde güncelleyin)
  • Şablondan bir değere başvurmanız gerekir. Bu durumda, hesaplanan bir özellik oluşturmak en iyi şeydir, çünkü önbelleğe alınır.
  • Birden fazla veri mülkündeki değişiklikleri dinlemeniz gerekir

2

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.


0

Aynı soru üzerine tökezledi. Bana göre bu daha açık:

  1. Vue.js v-on directivebunu 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 */
  1. Bir yöntem olmadanv-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.*/
  1. Hesaplanan özellik, yalnızca işlev tanımındaki thissö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, computedbir yöntemin çağrılmaması durumunda özellikleri kullanmak için en iyi uygulamadır v-on directive.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.