Vue.js — v-model ve v-bind arasındaki fark


208

Vue'yu çevrimiçi bir kursla öğreniyorum ve eğitmen bana varsayılan değeri olan bir giriş metni yapma alıştırması verdi. Bunu v-model kullanarak tamamladım, ancak eğitmen v-bind: value'i seçti ve nedenini anlamıyorum.

Birisi bana bu ikisi arasındaki farkı ve her birini daha iyi kullandığında basit bir açıklama yapabilir mi?


8
v-modelesas olarak girdi ve form teklifi için kullanılır, bu nedenle çeşitli girdi türleriyle uğraşırken kullanın. v-bindyönergesi, çoğu durumda veri modelindeki verilere bağlı olan bazı JS ifadeleri yazarak bazı dinamik değerler üretmenize izin verir - bu nedenle v-bind'i, bazı dinamik şeylerle uğraşmak istediğinizde kullanmanız gereken yönerge olarak düşünün.
Belmin Bedak

5
Bazı durumlarda her birini kullanabilirsiniz. Bazen değil, örneğin: <div v-bind:class="{ active: isActive }"></div>- model kullanarak html özniteliğini bağlayamazsınız, v-bindyönerge kullanmalısınız . Form öğeleri için v-modelyönerge kullanmak isteyeceksiniz - "giriş türüne göre öğeyi otomatik olarak güncellemek için doğru yolu seçer."
Alexander

1
@Alexander "bind HTML niteliği" ifadesi bunu daha iyi düşünmeme yardımcı oldu. Bu iki yapıda gerçekte neler olduğuna dair daha eksiksiz bir cevapla bunun üzerinde ağırlaştığınızı görmek güzel olurdu.
Tom Russell

@Alexander Esp bileşen datave bağlamında props...
Tom Russell

Yanıtlar:


429

Gönderen burada - Hatırla:

<input v-model="something">

aslında aynıdır:

<input
   v-bind:value="something"
   v-on:input="something = $event.target.value"
>

veya (stenografi sözdizimi):

<input
   :value="something"
   @input="something = $event.target.value"
>

Yani v-modelbir olan formu girişleri için bağlayıcı iki yönlü . O birleştirir v-bindhangi bir js değerini getirir biçimlendirme içine ve v-on:inputkarşı js değerini güncellemek .

Yapabildiğiniz v-modelzaman kullanın . Kullanın v-bind/ v-ongerektiğinde :-) Umarım cevabınız kabul edilir.

v-model tüm temel HTML giriş türleriyle (metin, metin alanı, sayı, radyo, onay kutusu, seçme) çalışır. Sen kullanabilirsiniz v-modelile input type=dateeğer ISO dizeleri (yyyy-aa-gg) olarak modeliniz saklar tarihleri. Modelinizde tarih nesnelerini kullanmak istiyorsanız (bunları değiştirir veya biçimlendirir değiştirmez iyi bir fikir), bunu yapın .

v-modelfarkında olmak iyi bazı akıllılar var. IME (çok sayıda mobil klavye veya Çince / Japonca / Korece) kullanıyorsanız, v-modeli bir sözcük tamamlanana kadar (bir boşluk girilen veya kullanıcı alandan ayrılana kadar) güncellenmez. v-inputçok daha sık ateş edecek.

v-modelAyrıca değiştiriciler vardır .lazy, .trim, .number, kaplı doc .


33
'Mümkünse v-modelini kullanın. Gerektiğinde v-bind / v-on kullanın '. Harika özet! Çok teşekkür ederim!
尤川豪

Arasındaki fark nedir v-modelve v-bind:xxx.sync?
El Mac

2
@ElMac v-modeli, bir Vue bileşeni ve bir javascript modeli arasında iki yönlü bir bağlantıdır. Kaynak (bağlamanın model tarafı) Vue bileşeninin verilerinde bildirilir. Bunun gibi, Vue durumu bileşenlerinizden çıkarmanıza, ardından bu durumu doğrudan bileşenden değiştirmenize izin verir. Bu, Vue'nun (Angular ve React'ta zor / gizli / imkansız / cesareti kırılmış) belirleyici olan devlet yönetimi için basit bir modeldir. v-bind: xxx.sync, bir Vue bileşeni ile üst öğesi arasında iki yönlü bir bağlantıdır]. Devlet kapsüllenmiş olarak kalır. Ebeveyne 'aittir'. Bu mutlaka daha iyi değil!
bbsimonbb

45

Basit bir deyişle v-model, iki yönlü ciltleme anlamına gelir: giriş değerini değiştirirseniz, bağlı veriler değiştirilir veya tersi de geçerlidir .

ancak tek yönlü ciltlemev-bind:value olarak adlandırılır, bunun anlamı şudur: ilişkili verileri değiştirerek giriş değerini değiştirebilirsiniz, ancak öğe aracılığıyla giriş değerini değiştirerek ilişkili verileri değiştiremezsiniz .

şu basit örneği inceleyin: https://jsfiddle.net/gs0kphvc/


'giriş değerini değiştirirseniz, bağlı veriler değiştirilir veya tam tersi olur. '- keman örneğinden bile' tam tersi 'kısmını anlayamıyorum. bunu açıklayabilir misin ?
Istiaque Ahmed

öğe aracılığıyla giriş değerini değiştirirseniz, bağlı veriler değiştirilir ve ayrıca örneğin Vue API'leri üzerinden bağlı verileri değiştirirseniz, giriş öğesi değeriniz değişir.
Madmadi

Vue API ile bağlı veri nasıl değiştirilir?
Istiaque Ahmed

Keman örneğinde, data_source'u böyle değiştiren bir yöntemimiz olduğunu varsayalımthis.data_source = 'Some new value'
Madmadi

tarafından data_source, içinden DOM enjekte HTML demek inputdoğru?
Istiaque Ahmed

3

v-model
iki yönlü veri bağlamasıdır, giriş değerini değiştirdiğinizde html giriş elemanını bağlamak için kullanılır, daha sonra sınırlı veriler değişecektir.

v-modeli yalnızca HTML giriş öğeleri için kullanılır

ex: <input type="text" v-model="name" > 

v-bind
tek yönlü veri bağlamasıdır, verileri giriş elemanına sadece bağlayabileceğiniz, ancak sınırlı veri değiştiren giriş elemanını değiştiremeyeceğiniz anlamına gelir. v-bind, html özniteliğini
ex:
<input type="text" v-bind:class="abc" v-bind:value="">

<a v-bind:href="home/abc" > click me </a>

'v-modeli iki yönlü veri bağlamadır': bu 2 yöntem özellikle nedir?
Istiaque Ahmed

2
v-model is for two way bindings means: if you change input value, the bound data will be changed and vice versa. but v-bind:value is called one way binding that means: you can change input value by changing bound data but you can't change bound data by changing input value through the element.

v-model is intended to be used with form elements. It allows you to tie the form 
 element (e.g. a text input) with the data object in your Vue instance.

Example: https://jsfiddle.net/jamesbrndwgn/j2yb9zt1/1/ 

v-bind is intended to be used with components to create custom props. This allows you to pass data to a component. As the prop is reactive, if the data that’s passed to the component changes then the component will reflect this change

 Example: https://jsfiddle.net/jamesbrndwgn/ws5kad1c/3/

Umarım bu temel anlayışa yardımcı olur


1

Kullanmak istemediğiniz durumlar var v-model. İki girişiniz varsa ve her biri birbirine bağlıysa, döngüsel başvuru sorunlarınız olabilir. Genel kullanım durumları, bir muhasebe hesap makinesi oluşturuyorsanız.

Bu gibi durumlarda, izleyici veya hesaplanmış mülk kullanmak iyi bir fikir değildir.

Bunun yerine, v-modelcevabınızı alın ve yukarıdaki yanıtın belirttiği gibi bölün

<input
   :value="something"
   @input="something = $event.target.value"
>

Pratikte, mantığınızı bu şekilde ayırıyorsanız, muhtemelen bir yöntem çağırırsınız.

Gerçek dünya senaryosunda böyle görünecektir:

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <input :value="extendedCost" @input="_onInputExtendedCost" />
  <p> {{ extendedCost }}
</div>

<script>
  var app = new Vue({
    el: "#app",
    data: function(){
      return {
        extendedCost: 0,
      }
    },
    methods: {
      _onInputExtendedCost: function($event) {
        this.extendedCost = parseInt($event.target.value);
        // Go update other inputs here
    }
  }
  });
</script>

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.