VueJS koşullu olarak bir öğe için bir öznitelik ekler


119

VueJS'de v-if kullanarak bir DOM öğesi ekleyebilir veya kaldırabiliriz:

<button v-if="isRequired">Important Button</button>

ancak bir dom öğesinin niteliklerini eklemenin / kaldırmanın bir yolu var mı, örneğin aşağıdaki için gerekli özniteliği koşullu olarak ayarlamak için:

Username: <input type="text" name="username" required>

şuna benzer bir şeyle:

Username: <input type="text" name="username" v-if="name.required" required>

Herhangi bir fikir?


4
Çok açık olmamakla birlikte (dolayısıyla kafa karışıklığı) dokümantasyon aslında öznitelik değeri yanlış olarak değerlendirilirse özniteliğin atlandığını söylüyor ( vuejs.org/v2/guide/syntax.html#Attributes )
AlexanderB

Aslında, dokümantasyon, özellik eklenmez diyor “... bir değeri vardır null, undefinedya false yanlış değerlendirmek bir JS komut farklıdır. Bu, boş bir dizenin JavaScript'te yanlış olduğu, ancak yine de özelliği DOM'a ekleyeceği anlamına gelir. Bunu önlemek için deneyebilirsinizv-bind:name="name || false"
Denilson Sá Maia

@AlexanderB Bu doğruysa, falsebir prop aracılığıyla alt bileşene nasıl açık bir şekilde aktarabilirim ?
Bruce Güneş

@BruceSun, Bağlamdaki öznitelik yanlış değer verdiğinizde "istemeden" kaybolursa - onu bir dizge olarak geçirmeyi deneyin 'false'. Öğede boole olmayan html özniteliğinin varlığını kontrol etmeniz gereken diğer durumlarda, v-ifburada önerilen şekilde koşullu oluşturmayı kullanabilirsiniz : github.com/vuejs/vue/issues/7552#issuecomment-361395234
AlexanderB

@AlexanderB Kendimi düzeltmem gerektiğini düşünüyorum - söylemeliyim attributeama DEĞİL prop. Açıkça falsebir bileşen özelliği yoluyla güvenli bir şekilde iletebiliriz ancak özniteliği DEĞİL (bir özellik olarak tanınmaz). Doğrumuyum?
Bruce Sun

Yanıtlar:


128

Deneyin:

<input :required="test ? true : false">

9
Uzun form<input v-bind:required="test ? true : false">
nathanielobrown

8
anythingAtAll : ? true : false(veya if (condition) { return true; } else { return false; }) herhangi bir dilde ... yakışıksız . Sadece return (condition)veya kullanın , bu durumda,<input :required="test">
Stephen P

5
değişkenin testolduğundan booleaneminseniz, sadece:required="test"
strz

2
Lütfen bunun bileşene bağlı olduğunu unutmayın! Mülkünüz Stringdeğeri kabul ederse , onu falsesize ayarladığınızda type checkhata almanız mümkündür . Öyleyse undefinedyanlış yerine ayarlayın . docs
Traxo

Boole bileşen özelliği :required="required"nerede kullanılırsa requiredbenim için <el required = "required">
Andrew Castellano

65

En basit hal:

<input :required="test">   // if true
<input :required="!test">  // if false
<input :required="!!test"> // test ? true : false

1
Lütfen bunun bileşene bağlı olduğunu unutmayın! Mülkünüz Stringdeğeri kabul ederse , onu falsesize ayarladığınızda type checkhata almanız mümkündür . Öyleyse undefinedyanlış yerine ayarlayın . docs
Traxo

@ Cevabınızı çift ünlem işaretlerini kullanarak değiştirdim, !! dünden önce bu sözdizimini hiç görmedim ve bir kod incelemesi sırasında şuna rastladım: - (3) bir değer için <input :required="!!!recipe.checked" v-model="recipe.pieType"><select :required="!!!recipe.checked" v-model="recipe.ingredients" :options="ingredients"></select> ne !!!anlama geldiğini biliyor musunuz :required? Teşekkürler.
Chris22

2
@ Chris22! Test ve !!! test arasında hiçbir fark yoktur, çünkü !!! test sadece !! (! Test) ve! Test bir boolean olduğu için !! (! Test) sadece çift olumsuzlamadır, bu nedenle aynı.
Syed

@Syed teşekkürler. Bağlantınızı takiben bunu da buldum ve kabul ediyorum . : ^)
Chris22

Ne @Syed söyledi yanlış değildir
Goodson

16

<input :required="condition">

Buna gerek yok <input :required="test ? true : false">çünkü eğer testi olduğunu truthy zaten alırsınız requiredniteliği ve eğer deney olduğunu falsy sen niteliğini almazsınız. true : falseKısmı çok bu gibi gereksiz olduğunu ...

if (condition) {
    return true;
} else {
    return false;
}
// or this...
return condition ? true : false;
// can *always* be replaced by...
return (condition); // parentheses generally not needed

Bu bağlamayı yapmanın en basit yolu, o halde, <input :required="condition">

Yalnızca test (veya koşul ) yanlış yorumlanabilirse başka bir şey yapmanız gerekir; bu durumda Syed'in kullanımı işe yarar !!.
  <input :required="!!condition">


11

Değişkenin önüne booleankoyarak onu zorlayarak geçebilirsiniz !!.

let isRequired = '' || null || undefined
<input :required="!!isRequired"> // it will coerce value to respective boolean 

Ancak, alıcı bileşenin typesahne donanımı için tanımladığı aşağıdaki durum için dikkatinizi çekmek isterim . Bu durumda, eğer isRequiredtanımlanmış tip varsa , stringo zaman geçmek booleaniçin tip kontrolü başarısız olur ve Vue uyarısı alırsınız. Bu pervaneyi geçmekten kaçınmak isteyebileceğinizi düzeltmek için, sadece undefinedgeri dönüşü koyun ve pervane gönderilmeyecektir.component

let isValue = false
<any-component
  :my-prop="isValue ? 'Hey I am when the value exist' : undefined"
/>

açıklama

Aynı sorunu yaşadım ve yukarıdaki çözümleri denedim !! Evet, görmüyorum propama bu aslında burada gerekeni yerine getirmiyor.

Benim sorunum -

let isValid = false
<any-component
  :my-prop="isValue ? 'Hey I am when the value exist': false"
/>

Yukarıdaki durumda, beklediğim şey my-propalt bileşene geçmemiş olmaktır - girişi <any-conponent/>görmüyorum ama bileşenimde, prop tipi kontrol arızasından bir hata çıkıyor. Çocuk bileşeninde olduğu gibi, bir olmayı bekliyorum ama öyle .propDOM<any-component/>my-propStringboolean

myProp : {
 type: String,
 required: false,
 default: ''
}

Bu, alt bileşenin, öyle olsa bile pervaneyi aldığı anlamına gelir false. Buradaki ince ayar, alt bileşenin default-valuekontrolü almasına ve ayrıca kontrolü atlamasına izin vermektir . undefinedYine de geçti !

<any-component
  :my-prop="isValue ? 'Hey I am when the value exist' : undefined"
/>
 

Bu işe yarıyor ve benim alt öğem varsayılan değere sahip.


2

Html kullanımında

<input :required="condition" />

Ve veri özelliğinde şöyle tanımlayın:

data () {
   return {
      condition: false
   }
}
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.