VueJS fügt bedingt ein Attribut für ein Element hinzu

Lesezeit: 7 Minuten

Benutzer-Avatar
Don Smythe

In VueJS können wir ein DOM-Element mit v-if hinzufügen oder entfernen:

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

aber gibt es eine Möglichkeit, Attribute eines Dom-Elements hinzuzufügen / zu entfernen, z. B. für das folgende bedingte Setzen des erforderlichen Attributs:

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

durch etwas Ähnliches wie:

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

Irgendwelche Ideen?

  • Obwohl es nicht so offensichtlich ist (daher die Verwirrung), sagt die Dokumentation tatsächlich, dass, wenn der Attributwert als falsch ausgewertet wird, das Attribut weggelassen wird (vuejs.org/v2/guide/syntax.html#Attributes)

    – AlexanderB

    24. Januar 2018 um 19:00 Uhr

  • Tatsächlich sagt die Dokumentation, dass das Attribut nicht hinzugefügt wird, wenn „… hat den Wert von null, undefinedoder false, was sich von einem JS-Skript unterscheidet, das mit „false“ ausgewertet wird. Dies bedeutet, dass ein leerer String in JavaScript falsch ist, aber das Attribut trotzdem zu DOM hinzufügen würde. Um das zu verhindern, könnten Sie versuchen v-bind:name="name || false"

    – Denilson Sá Maia

    6. September 2019 um 14:08 Uhr

  • @AlexanderB Wenn das stimmt, wie kann ich explizit weitergeben? false zu einer untergeordneten Komponente über eine Stütze?

    – Bruce Sonne

    15. April 2020 um 9:47 Uhr

  • @BruceSun , Wenn das Attribut im Kontext “unbeabsichtigt” verschwindet, wenn Sie ihm einen falschen Wert geben, versuchen Sie, es als Zeichenfolge zu übergeben 'false'. In anderen Fällen, wenn Sie das Vorhandensein eines nicht-booleschen HTML-Attributs für das Element steuern müssen, können Sie bedingtes Rendering verwenden v-if wie hier vorgeschlagen: github.com/vuejs/vue/issues/7552#issuecomment-361395234

    – AlexanderB

    16. April 2020 um 10:59 Uhr

  • @AlexanderB Ich glaube, ich muss mich korrigieren – sollte ich sagen attribute aber nicht prop. Wir können getrost explizit weitergeben false über eine Komponenteneigenschaft, aber NICHT über ein Attribut (das nicht als Eigenschaft erkannt wird). Hab ich recht?

    – Bruce Sonne

    20. April 2020 um 8:41 Uhr

Benutzer-Avatar
cymruu

Versuchen:

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

Update: Es hat sich in Vue 3 geändert, siehe diese Antwort https://stackoverflow.com/a/64598898

  • Langform ist <input v-bind:required="test ? true : false">

    – nathanielobrown

    9. Mai 2017 um 14:13 Uhr

  • anythingAtAll : ? true : false (oder if (condition) { return true; } else { return false; }) in jeder Sprache ist … unziemlich. Benutz einfach return (condition) oder in diesem Fall <input :required="test">

    – Stefan P

    21. Mai 2018 um 17:15 Uhr


  • wenn Sie sicher sind, dass Variable test ist booleankönnen Sie einfach verwenden :required="test"

    – tstr

    6. Juli 2018 um 9:14 Uhr


  • verwenden :required="required" wo required ist eine boolesche Komponenteneigenschaft, die für mich zu führt

    – Andreas Castellano

    5. Februar 2019 um 16:02 Uhr

  • Beachten Sie, dass sich dies mit Vue 3 geändert hat, siehe eine der Antworten weiter unten

    – Connor Shea

    29. Mai 2021 um 18:48 Uhr

Benutzer-Avatar
Syd

Einfachste Form:

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

  • Bitte beachten Sie, dass dies bauteilabhängig ist! Es ist möglich, dass Ihre Unterkunft dies akzeptiert String Wert, indem Sie es auf setzen false Sie erhalten type check Error. Also auf stellen undefined statt falsch. Dokumente

    – Traxo

    18. Juli 2018 um 10:06 Uhr


  • @Syed Ihre Antwort mit doppelten Ausrufezeichen !! Ich habe diese Syntax vor gestern noch nie gesehen und bin bei einer Codeüberprüfung auf Folgendes gestoßen: — <input :required="!!!recipe.checked" v-model="recipe.pieType"><select :required="!!!recipe.checked" v-model="recipe.ingredients" :options="ingredients"></select> Weißt du was !!! (3) bedeuten für a :required Wert? Vielen Dank.

    – Chris22

    10. August 2018 um 15:52 Uhr


  • @Chris22 Es gibt keinen Unterschied zwischen !test und !!!test, da !!!test nur !!(!test) ist und da !test ein boolescher Wert ist, ist !!(!test) nur seine doppelte Negation, also die gleich. Überprüfen Sie dies: stackoverflow.com/a/25318045/1292050

    – Syd

    10. August 2018 um 20:08 Uhr

  • @Syed danke. Nach Ihrem Link habe ich auch diesen gefunden und stimme zu. :^)

    – Chris22

    13. August 2018 um 16:36 Uhr


  • Was @Syed gesagt hat, ist nicht falsch

    – guter Sohn

    4. März 2019 um 21:02 Uhr

Benutzer-Avatar
Jouni Kantola

Bedingte Darstellung von Attributen in Vue 3 geändert. Um eine Attributverwendung wegzulassen null oder undefined.

Ansicht 2:

<div :attr="false">
Result: <div>

<div :attr="null">
Result: <div>

Ansicht 3:

<div :attr="false">
Result: <div attr="false">

<div :attr="null">
Result: <div>

  • Danke, das ist die Antwort, die ich gesucht habe.

    – Abdrhmn

    2. November 2020 um 20:49 Uhr


  • undefined funktioniert gut mit einigen der Vue-Pakete, die ich verwende

    – itsoft3g

    16. Juni 2021 um 13:17 Uhr

  • Richtige, vollständige und prägnante Antwort, danke.

    – Miguel

    4. August 2021 um 10:20 Uhr

<input :required="condition">

Du brauchst nicht <input :required="test ? true : false"> weil wenn Prüfung ist Wahrheit die bekommst du schon required Attribut, und wenn Prüfung ist falsch Sie erhalten das Attribut nicht. Das true : false Teil ist überflüssig, so ähnlich …

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

Der einfachste Weg, diese Bindung durchzuführen, ist dann <input :required="condition">

Nur wenn die Prüfung (oder Bedingung) kann falsch interpretiert werden, müssten Sie etwas anderes tun; in diesem Fall Syeds Verwendung von !! macht den Trick.
<input :required="!!condition">

Benutzer-Avatar
Satyam Pathak

Du kannst passieren boolean durch Zwang, setzen !! vor der Variable.

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

Aber ich möchte Ihre Aufmerksamkeit auf den folgenden Fall lenken, in dem die empfangende Komponente definiert hat type für Requisiten. In diesem Fall, wenn isRequired hat den zu seinden Typ definiert string dann vorbei boolean make it type check schlägt fehl und Sie erhalten eine Vue-Warnung. Um dies zu beheben, möchten Sie möglicherweise vermeiden, diese Stütze zu passieren, also setzen Sie einfach undefined Fallback und die Stütze wird nicht gesendet component

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

Erläuterung

Ich habe das gleiche Problem durchgemacht und die oben genannten Lösungen ausprobiert !! Ja, ich sehe die nicht prop aber das erfüllt eigentlich nicht das, was hier gefordert wird.

Mein Problem –

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

Im obigen Fall habe ich nicht erwartet, dass ich es habe my-prop an die untergeordnete Komponente übergeben werden – <any-conponent/> Ich sehe die nicht prop in DOM aber in meinem <any-component/> Komponente, erscheint ein Fehler bei einem Fehler bei der Überprüfung des Prop-Typs. Wie in der untergeordneten Komponente erwarte ich my-prop ein … zu sein String aber es ist boolean.

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

Dies bedeutet, dass die untergeordnete Komponente die Requisite erhalten hat, selbst wenn dies der Fall ist false. Optimieren Sie hier, um die untergeordnete Komponente übernehmen zu lassen default-value und überspringen Sie auch die Prüfung. Bestanden undefined funktioniert aber!

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

Dies funktioniert und meine untergeordnete Prop hat den Standardwert.

  • Dies hat bei mir funktioniert, als ich mit ausgewählten Optionen (und dem ausgewählten Attribut) gearbeitet habe.

    – max

    29. März 2021 um 18:08 Uhr


Es ist bemerkenswert zu verstehen, dass Sie, wenn Sie Attribute bedingt hinzufügen möchten, auch eine dynamische Deklaration hinzufügen können:

<input v-bind="attrs" />

wobei attrs als Objekt deklariert ist:

data() {
    return {
        attrs: {
            required: true,
            type: "text"
        }
    }
}

Was dazu führen wird:

<input required type="text"/>

Ideal in Fällen mit mehreren Attributen.

  • Dies hat bei mir funktioniert, als ich mit ausgewählten Optionen (und dem ausgewählten Attribut) gearbeitet habe.

    – max

    29. März 2021 um 18:08 Uhr


Benutzer-Avatar
Zaheer Alvi

Sie können einen Doppelpunkt vor dem Attribut hinzufügen (kann auch Bedingungen verwenden) wie

<div :class="current? 'active': '' " > 
<button :disabled="InvalidForm? true : false " >

Wenn Sie einen dynamischen Wert wie Requisiten festlegen möchten, können Sie auch einen Doppelpunkt vor dem Attributnamen verwenden, z.

<Child :data="userList" />

1298840cookie-checkVueJS fügt bedingt ein Attribut für ein Element hinzu

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy