VueJS ajoute conditionnellement un attribut pour un élément

119

Dans VueJS, nous pouvons ajouter ou supprimer un élément DOM en utilisant v-if:

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

mais y a-t-il un moyen d'ajouter / supprimer des attributs d'un élément dom, par exemple pour les éléments suivants, définissez sous condition l'attribut requis:

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

par quelque chose de similaire à:

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

Des idées?

Don Smythe
la source
4
Bien que n'étant pas si évident (d'où la confusion), la documentation dit en fait que si la valeur de l'attribut est évaluée à false, l'attribut est omis ( vuejs.org/v2/guide/syntax.html#Attributes )
AlexanderB
En fait, la documentation indique l'attribut ne sera pas ajouté si « ... a la valeur null, undefinedou false» qui est différent d'un script JS évaluation à false. Cela signifie qu'une chaîne vide est fausse en JavaScript, mais qu'elle ajouterait quand même l'attribut au DOM. Pour éviter que vous puissiez essayerv-bind:name="name || false"
Denilson Sá Maia
@AlexanderB Si c'est vrai, comment puis-je passer explicitement falseun composant enfant via un accessoire?
Bruce Sun
@BruceSun, Si l'attribut dans le contexte disparaît "involontairement" lorsque vous lui donnez une valeur fausse - essayez de le passer sous forme de chaîne 'false'. Dans d'autres cas, lorsque vous devez contrôler la présence d'un attribut html non booléen sur l'élément, vous pouvez utiliser le rendu conditionnel avec v-ifcomme suggéré ici: github.com/vuejs/vue/issues/7552#issuecomment-361395234
AlexanderB
@AlexanderB Je pense que je dois me corriger - je devrais dire attributemais PAS prop. Nous pouvons en toute sécurité passer explicitement falsevia une propriété de composant mais PAS un attribut (qui n'est pas reconnu comme une propriété). Ai-je raison?
Bruce Sun

Réponses:

127

Essayer:

<input :required="test ? true : false">
cymruu
la source
9
La forme longue est<input v-bind:required="test ? true : false">
nathanielobrown
8
anythingAtAll : ? true : false(ou if (condition) { return true; } else { return false; }) dans n'importe quelle langue est ... inconvenant . Utilisez simplement return (condition)ou, dans ce cas,<input :required="test">
Stephen P
5
si vous êtes sûr que cette variable testest boolean, vous pouvez simplement utiliser:required="test"
strz
2
Veuillez noter que cela dépend du composant! Il est possible que si votre propriété accepte une Stringvaleur, falsevous obtiendrez une type checkerreur en la définissant . Alors réglez-le sur au undefinedlieu de false. docs
Traxo
l'utilisation de :required="required"where requiredest une propriété de composant booléen entraîne <el required = "required"> pour moi
Andrew Castellano
65

Forme la plus simple:

<input :required="test">   // if true
<input :required="!test">  // if false
<input :required="!!test"> // test ? true : false
Syed
la source
1
Veuillez noter que cela dépend du composant! Il est possible que si votre propriété accepte une Stringvaleur, falsevous obtiendrez une type checkerreur en la définissant . Alors réglez-le sur au undefinedlieu de false. docs
Traxo
@Syed votre réponse en utilisant des points d'exclamation doubles !! Je n'ai jamais vu cette syntaxe avant hier et lors d'une révision de code, je suis tombé sur ceci: - <input :required="!!!recipe.checked" v-model="recipe.pieType"><select :required="!!!recipe.checked" v-model="recipe.ingredients" :options="ingredients"></select> Savez-vous ce que !!!(3) signifie pour une :requiredvaleur? Merci.
Chris22
2
@ Chris22 Il n'y a pas de différence entre! Test et !!! test, puisque !!! test est juste !! (! Test) et parce que! Test est un booléen, !! (! Test) est juste sa double négation, donc le même. Vérifiez ceci: stackoverflow.com/a/25318045/1292050
Syed
@Syed merci. Suite à votre lien, j'ai trouvé celui-ci aussi et je suis d'accord . : ^)
Chris22
Ce que @Syed a dit n'est pas faux
Goodson
16

<input :required="condition">

Vous n'en avez pas besoin <input :required="test ? true : false">car si test est véridique, vous obtiendrez déjà l' requiredattribut, et si test est faux, vous n'obtiendrez pas l'attribut. La true : falsepartie est redondante, un peu comme ça ...

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

Le moyen le plus simple de faire cette liaison est donc <input :required="condition">

Ce n'est que si le test (ou la condition ) peut être mal interprété que vous devrez faire autre chose; dans ce cas, l'utilisation de Syed !!fait l'affaire.
  <input :required="!!condition">

Stephen P
la source
11

Vous pouvez passer booleanen le contraignant, mettre !!avant la variable.

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

Mais je voudrais attirer votre attention sur le cas suivant où le composant récepteur a défini type pour les accessoires. Dans ce cas, si isRequireda défini le type à stringpasser, la booleanvérification du type échoue et vous obtiendrez un avertissement Vue. Pour résoudre ce problème, vous voudrez peut-être éviter de passer cet accessoire, alors mettez simplement un undefinedrepli et l'accessoire ne sera pas envoyé àcomponent

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

Explication

J'ai traversé le même problème et j'ai essayé les solutions ci-dessus !! Oui, je ne vois pas leprop mais cela ne remplit pas réellement ce qui est requis ici.

Mon problème -

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

Dans le cas ci-dessus, ce à quoi je m'attendais, c'est de ne pas avoir my-propété transmis au composant enfant - <any-conponent/>je ne vois pas le propin DOMmais dans mon <any-component/>composant, une erreur apparaît lors de l'échec de la vérification de type prop. Comme dans le composant enfant, je m'attends my-propà être unString mais c'est le cas boolean.

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

Ce qui signifie que le composant enfant a reçu l'accessoire même s'il l'est false. Tweak ici est de laisser le composant enfant prendre le default-valueet également sauter le contrôle. PasséundefinedTravaux cependant!

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

Cela fonctionne et mon accessoire enfant a la valeur par défaut.

Satyam Pathak
la source
2

En utilisation html

<input :required="condition" />

Et définissez dans la propriété de données comme

data () {
   return {
      condition: false
   }
}
Nipun Jain
la source