VueJSは要素の属性を条件付きで追加します


119

VueJSでは、v-ifを使用してDOM要素を追加または削除できます。

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

しかし、dom要素の属性を追加/削除する方法はあります。たとえば、次の場合、必要な属性を条件付きで設定します。

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

次のようなもので:

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

何か案は?


4
ドキュメントが実際に行う(それゆえの混乱)それほど明白ではないということは、偽その後、属性が省略されることに属性値評価された場合(と言いながらvuejs.org/v2/guide/syntax.html#Attributes
AlexanderB

実際には、ドキュメントがあれば、属性が追加されることはありませんと言う...「の値がありnullundefinedまたはfalse falseに評価するJSスクリプトとは異なり、。つまり、JavaScriptでは空の文字列は偽物ですが、属性はDOMに追加されます。それを防ぐにはv-bind:name="name || false"
デニルソンサマイア

@AlexanderBそれが本当なら、どうすればfalseプロップを介して子コンポーネントに明示的に渡すことができますか?
Bruce Sun

@BruceSun、コンテキストの属性が誤って値を指定したときに「意図せずに」消えた場合は、文字列として渡してみてください'false'。要素の非ブールhtml属性の存在を制御する必要がある他のケースでは、条件付きレンダリングを次のv-ifように使用して使用できます: github.com/vuejs/vue/issues/7552#issuecomment-361395234
AlexanderB

@AlexanderB私は自分自身を修正する必要があると思います-言うべきではありattributeませんがpropfalseコンポーネントプロパティを介して明示的に渡すことはできますが、属性(プロパティとして認識されません)を渡すことはできません。私は正しいですか?
Bruce Sun

回答:


127

試してください:

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

9
長い形式は<input v-bind:required="test ? true : false">
nathanielobrown 2017年

8
anythingAtAll : ? true : false(またはif (condition) { return true; } else { return false; })どの言語でも... 見苦しい。使用するreturn (condition)か、この場合は<input :required="test">
Stephen P

5
変数testbooleanであることが確実な場合は、次のように使用できます:required="test"
strz

2
これはコンポーネントに依存することに注意してください!プロパティがString値を受け入れる場合、それを設定するとエラーfalsetype check発生する可能性があります。したがってundefined、falseの代わりに設定します。docs
Traxo

:required="required"where requiredis Booleanコンポーネントプロパティを使用すると、<el required = "required">が返されます
Andrew Castellano

65

最も単純な形式:

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

1
これはコンポーネントに依存することに注意してください!プロパティがString値を受け入れる場合、それを設定するとエラーfalsetype check発生する可能性があります。したがってundefined、falseの代わりに設定します。docs
Traxo

二重感嘆符を使用して@Syedあなたの答え!! 私は昨日までにその構文を見たことがないと私はこれを偶然見つけたコードレビュー中に:-(3)値の意味を<input :required="!!!recipe.checked" v-model="recipe.pieType"><select :required="!!!recipe.checked" v-model="recipe.ingredients" :options="ingredients"></select> 知っ!!!てい:requiredますか?ありがとう。
Chris22、2018

2
@ Chris22 !!! testは!!(!test)であり、!testはブール値なので、!!(!test)はその二重否定にすぎないため、!testと!!! testの間に違いはありません。同じ。これを確認してください:stackoverflow.com/a/25318045/1292050
Syed

@サイードありがとうございます。あなたのリンクをたどって、私もこれを見つけて同意します。:^)
Chris22

@サイードが言ったことは真実ではありません
グッドソン

16

<input :required="condition">

あなたは必要がない<input :required="test ? true : false">場合ので、テストがあるtruthyすでに買ってあげるrequired属性を、そして場合テストがあるfalsyあなたは属性を取得することはありません。true : false一部はずっとこのように、重複しています...

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

このバインディングを行う最も簡単な方法は、 <input :required="condition">

テスト(またはcondition)が誤って解釈される可能性がある場合のみ、他のことを行う必要があります。その場合、Syedがを使用すると!!うまくいきます。
  <input :required="!!condition">


11

変数の前booleanに置くことで、強制的に渡すことができ!!ます。

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

ただし、受信コンポーネントがtype小道具に定義されている次のケースには注意を向けたいと思います。その場合、isRequiredタイプが定義されている場合、string通過booleanするmakeのタイプチェックは失敗し、Vue警告が表示されます。それを修正するには、その小道具を渡すことを避けたい場合があるので、undefinedフォールバックを置くだけで、小道具は送信されませんcomponent

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

説明

私は同じ問題を経験し、上記の解決策を試しました!! はい、わかりませんpropが、実際にはここで必要なことを満たしていません。

私の問題 -

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

上記の場合、私が期待my-propしていたのは子コンポーネントに渡されて<any-conponent/>いません-inは表示さpropれませんDOMが、私の<any-component/>コンポーネントでは、エラーがプロップタイプチェックの失敗からポップアップします。子コンポーネントと同様に、であると期待しmy-propていますStringが、ですboolean

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

どの子コンポーネントがある場合でも、小道具を受けなかったことを意味false。ここでの微調整は、子コンポーネントにdefault-value、チェックをスキップすることです。合格undefined作品も!

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

これは機能し、私の子プロップはデフォルト値を持っています。


2

HTMLでの使用

<input :required="condition" />

そして、次のようなデータプロパティで定義します

data () {
   return {
      condition: false
   }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.