VueJS aggiunge in modo condizionale un attributo per un elemento


119

In VueJS possiamo aggiungere o rimuovere un elemento DOM usando v-if:

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

ma c'è un modo per aggiungere / rimuovere attributi di un elemento dom, ad esempio per quanto segue imposta in modo condizionale l'attributo richiesto:

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

da qualcosa di simile a:

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

Qualche idea?


4
Sebbene non sia così ovvio (da qui la confusione), la documentazione in realtà dice che se il valore dell'attributo restituisce false, l'attributo viene omesso ( vuejs.org/v2/guide/syntax.html#Attributes )
AlexanderB

In realtà, la documentazione dice che l'attributo non verrà aggiunto se “... ha il valore di null, undefinedo false , che è diverso da uno script JS valutazione su false. Ciò significa che una stringa vuota è falsa in JavaScript, ma aggiungerebbe comunque l'attributo a DOM. Per impedirlo potresti provarev-bind:name="name || false"
Denilson Sá Maia

@AlexanderB Se questo è vero, come posso passare esplicito falseal componente figlio tramite un puntello?
Bruce Sun

@BruceSun, se l'attributo nel contesto "involontariamente" scompare quando gli dai un valore falso, prova a passarlo come stringa 'false'. In altri casi, quando è necessario controllare la presenza di un attributo html non booleano sull'elemento, è possibile utilizzare il rendering condizionale con v-ifcome suggerito qui: github.com/vuejs/vue/issues/7552#issuecomment-361395234
AlexanderB

@AlexanderB Penso di dover correggere me stesso - dovrei dire attributema NON prop. Possiamo tranquillamente passare esplicitamente falsetramite una proprietà del componente ma NON un attributo (che non è riconosciuto come proprietà). Ho ragione?
Bruce Sun,

Risposte:


127

Provare:

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

9
La forma lunga è<input v-bind:required="test ? true : false">
nathanielobrown

8
anythingAtAll : ? true : false(o if (condition) { return true; } else { return false; }) in qualsiasi lingua è ... sconveniente . Usa return (condition)o, in questo caso,<input :required="test">
Stephen P

5
se sei sicuro che la variabile testsia boolean, puoi semplicemente usare:required="test"
strz

2
Si prega di notare che questo dipende dal componente! È possibile che se la tua proprietà accetta il Stringvalore impostandolo su falseotterrai un type checkerrore. Quindi impostalo su undefinedinvece di falso. docs
Traxo

l'utilizzo di :required="required"dove requiredè una proprietà del componente booleano si traduce in <el required = "required"> per me
Andrew Castellano,

65

La forma più semplice:

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

1
Si prega di notare che questo dipende dal componente! È possibile che se la tua proprietà accetta il Stringvalore impostandolo su falseotterrai un type checkerrore. Quindi impostalo su undefinedinvece di falso. docs
Traxo

@Syed la tua risposta usando doppi punti esclamativi !! Non ho mai visto quella sintassi prima di ieri e durante una revisione del codice mi sono imbattuto in questo: - <input :required="!!!recipe.checked" v-model="recipe.pieType"><select :required="!!!recipe.checked" v-model="recipe.ingredients" :options="ingredients"></select> Sapresti cosa !!!significa (3) per un :requiredvalore? Grazie.
Chris22

2
@ Chris22 Non c'è differenza tra! Test e !!! test, poiché !!! test è solo !! (! Test) e poiché! Test è un booleano, !! (! Test) è solo la sua doppia negazione, quindi il stesso. Controlla questo: stackoverflow.com/a/25318045/1292050
Syed

@Syed grazie. Seguendo il tuo link, ho trovato anche questo e sono d'accordo . : ^)
Chris22

Quello che ha detto @Syed non è falso
goodson

16

<input :required="condition">

Non è necessario <input :required="test ? true : false">perché se test è vero otterrai già l' requiredattributo, e se test è falso non otterrai l'attributo. La true : falseparte è ridondante, proprio come questa ...

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

Il modo più semplice per eseguire questa associazione, quindi, è <input :required="condition">

Solo se il test (o la condizione ) può essere interpretato male, dovresti fare qualcos'altro; in quel caso l'uso di Syed !!fa il trucco.
  <input :required="!!condition">


11

Puoi passare booleanforzandolo, anteponendo !!la variabile.

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

Ma vorrei attirare la vostra attenzione per il seguente caso in cui il componente ricevente ha definito typeper gli oggetti di scena. In tal caso, se isRequiredha definito il tipo da stringpassare boolean, il controllo del tipo fallisce e riceverai un avviso di Vue. Per risolvere il problema potresti voler evitare di passare quell'elica, quindi metti il undefinedfallback e l'elica non verrà inviata acomponent

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

Spiegazione

Ho riscontrato lo stesso problema e ho provato le soluzioni precedenti !! Sì, non vedo il propma in realtà non soddisfa quanto richiesto qui.

Il mio problema -

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

Nel caso precedente, quello che mi aspettavo non sarebbe stato my-proppassato al componente figlio <any-conponent/>: non vedo l' propinput DOMma nel mio <any-component/>componente, viene visualizzato un errore per il fallimento del controllo del tipo di prop. Come nel componente figlio, mi aspetto my-propdi essere a Stringma lo è boolean.

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

Il che significa che il componente figlio ha ricevuto il sostegno anche se lo è false. Il tweak qui è lasciare che il componente figlio prenda il controllo default-valuee salti anche il controllo. undefinedLavori passati però!

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

Funziona e il mio bambino prop sta avendo il valore predefinito.


2

In html utilizzare

<input :required="condition" />

E definire nella proprietà dei dati come

data () {
   return {
      condition: false
   }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.