180 votes

VueJS ajoute conditionnellement un attribut pour un élément

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

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

mais existe-t-il un moyen d'ajouter/supprimer les attributs d'un élément dom, par exemple, pour l'élément suivant, définir conditionnellement 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 ?

8 votes

Bien que ce ne soit 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 alors omis ( vuejs.org/v2/guide/syntaxe.html#Attributs )

0 votes

En fait, la documentation indique que l'attribut ne sera pas ajouté si " a la valeur de null , undefined ou false " ce qui est différent d'un script JS évaluant à 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 cela, vous pouvez essayer v-bind:name="name || false"

0 votes

Si c'est vrai, comment puis-je passer explicitement false au composant enfant via une prop ?

175voto

cymruu Points 1220

Essayez :

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

Mise à jour : Cela a changé dans Vue 3, voir cette réponse https://stackoverflow.com/a/64598898

11 votes

La forme longue est <input v-bind:required="test ? true : false">

13 votes

anythingAtAll : ? true : false (ou if (condition) { return true; } else { return false; } ) dans n'importe quelle langue est ... inconvenant . Il suffit d'utiliser return (condition) ou, dans ce cas, <input :required="test">

6 votes

Si vous êtes sûr que la variable test est boolean vous pouvez simplement utiliser :required="test"

77voto

Syed Points 392

La forme la plus simple :

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

3 votes

Veuillez noter que cela dépend du composant ! Il est possible que si votre propriété accepte String qu'en lui donnant la valeur false vous obtiendrez type check erreur. Il faut donc le régler sur undefined au lieu de faux. docs

0 votes

@Syed your answer using double exclamation points !! Je n'avais jamais vu cette syntaxe avant hier et pendant une revue 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 un :required valeur ? Merci.

2 votes

@Chris22 Il n'y a aucune différence entre !test et !!test, puisque !!test est juste ! !(!test) et que !test est un booléen, ! !(!test) est juste sa double négation, donc la même chose. Vérifiez ceci : stackoverflow.com/a/25318045/1292050

26voto

Jouni Kantola Points 153

Le rendu conditionnel des attributs a été modifié dans Vue 3. Pour omettre un attribut, utilisez null o undefined .

Vue 2 :

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

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

Vue 3 :

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

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

0 votes

Merci, c'est la réponse que je cherchais.

0 votes

Undefined fonctionne bien avec certains des paquets Vue que j'utilise.

0 votes

Bonne réponse, complète et concise, merci.

20voto

Stephen P Points 5521

<input :required="condition">

Vous n'avez pas besoin <input :required="test ? true : false"> car si test est véridique vous aurez déjà le required et si test est falsy vous n'obtiendrez pas l'attribut. Le site true : false La partie est redondante, un peu comme ceci...

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

La façon la plus simple de réaliser cette liaison est donc la suivante <input :required="condition">

Seulement si le test (ou condition ) peut être mal interprété si vous avez besoin de faire autre chose ; dans ce cas, l'utilisation par Syed de l'option !! fait l'affaire.
  <input :required="!!condition">

18voto

Satyam Pathak Points 696

Vous pouvez passer boolean en le contraignant, en mettant !! 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 isRequired a défini le type comme étant string puis en passant boolean faites en sorte que la vérification du type échoue et vous obtiendrez un avertissement de Vue. Pour corriger cela, vous pouvez éviter de passer cette prop, donc mettez simplement undefined et la proposition ne sera pas envoyée à component

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

Explication

J'ai rencontré le même problème et j'ai essayé les solutions ci-dessus ! Oui, je ne vois pas le prop mais cela ne répond pas à ce qui est demandé 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 n'est pas d'avoir my-prop sont transmises au composant enfant - <any-conponent/> Je ne vois pas le prop sur DOM mais dans mon <any-component/> une erreur apparaît à la suite de l'échec de la vérification du type de prop. Comme dans le composant enfant, je m'attends à ce que my-prop pour être un String mais c'est boolean .

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

Ce qui signifie que le composant enfant a reçu la prop même s'il est false . L'astuce ici est de laisser le composant enfant prendre le contrôle de l'application. default-value et aussi sauter le contrôle. Réussi undefined fonctionne cependant !

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

Cela fonctionne et ma prop enfant a la valeur par défaut.

0 votes

Voici ce qui a fonctionné pour moi lorsque j'ai travaillé avec des options de sélection (et l'attribut sélectionné)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X