VueJS secara kondisional menambahkan atribut untuk sebuah elemen

119

Di VueJS kita dapat menambah atau menghapus elemen DOM menggunakan v-if:

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

tetapi adakah cara untuk menambah / menghapus atribut dari elemen dom misalnya untuk menetapkan atribut yang diperlukan berikut ini secara bersyarat:

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

dengan sesuatu yang mirip dengan:

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

Ada ide?

Don Smythe
sumber
4
Meskipun tidak begitu jelas (sehingga membingungkan), dokumentasi sebenarnya mengatakan bahwa jika nilai atribut bernilai false maka atribut dihilangkan ( vuejs.org/v2/guide/syntax.html#Attributes )
AlexanderB
Sebenarnya, dokumentasi mengatakan atribut tidak akan ditambahkan jika “... memiliki nilai null, undefinedatau false , yang berbeda dari script JS mengevaluasi ke false. Ini berarti string kosong salah dalam JavaScript, tetapi masih akan menambahkan atribut ke DOM. Untuk mencegahnya, Anda dapat mencobav-bind:name="name || false"
Denilson Sá Maia
@AlexanderB Jika itu benar, bagaimana cara mengirimkan eksplisit falseke komponen anak melalui prop?
Bruce Sun
@BruceSun, Jika atribut dalam konteks "tidak disengaja" menghilang saat Anda memberikan nilai palsu - coba berikan sebagai string 'false'. Dalam kasus lain ketika Anda perlu mengontrol keberadaan atribut html non-boolean pada elemen, Anda dapat menggunakan rendering bersyarat dengan v-ifseperti yang disarankan di sini: github.com/vuejs/vue/issues/7552#issuecomment-361395234
AlexanderB
@AlexanderB Saya rasa saya harus mengoreksi diri saya sendiri - Saya harus mengatakan attributetetapi TIDAK prop. Kita dapat dengan aman mengirimkan eksplisit falsemelalui properti komponen tetapi TIDAK (yang tidak dikenali sebagai properti). Apakah saya benar?
Bruce Sun

Jawaban:

127

Mencoba:

<input :required="test ? true : false">
cymruu
sumber
9
Bentuk panjang adalah<input v-bind:required="test ? true : false">
nathanielobrown
8
anythingAtAll : ? true : false(atau if (condition) { return true; } else { return false; }) dalam bahasa apa pun ... tidak pantas . Cukup gunakan return (condition)atau, dalam hal ini,<input :required="test">
Stephen P
5
jika Anda yakin bahwa variabel testadalah boolean, Anda hanya dapat menggunakan:required="test"
Strz
2
Harap dicatat bahwa ini tergantung pada komponennya! Mungkin saja jika properti Anda menerima Stringnilai dengan menyetelnya ke falseAnda akan mendapatkan type checkkesalahan. Jadi setel ke undefinedsebagai ganti false. docs
Traxo
menggunakan di :required="required"mana requiredproperti komponen Boolean menghasilkan <el required = "required"> untuk saya
Andrew Castellano
65

Bentuk paling sederhana:

<input :required="test">   // if true
<input :required="!test">  // if false
<input :required="!!test"> // test ? true : false
Syed
sumber
1
Harap dicatat bahwa ini tergantung pada komponennya! Mungkin saja jika properti Anda menerima Stringnilai dengan menyetelnya ke falseAnda akan mendapatkan type checkkesalahan. Jadi setel ke undefinedsebagai ganti false. docs
Traxo
@Syed jawaban Anda menggunakan tanda seru ganda !! Saya belum pernah melihat sintaks itu sebelum kemarin dan selama peninjauan kode saya menemukan ini: - <input :required="!!!recipe.checked" v-model="recipe.pieType"><select :required="!!!recipe.checked" v-model="recipe.ingredients" :options="ingredients"></select> Apakah Anda tahu apa arti !!!(3) untuk suatu :requirednilai? Terima kasih.
Chris22
2
@ Chris22 Tidak ada perbedaan antara! Test dan !!! test, karena !!! test hanya !! (! Test) dan karena! Test adalah boolean, !! (! Test) hanya negasi ganda, oleh karena itu sama. Periksa ini: stackoverflow.com/a/25318045/1292050
Syed
@Yedahhhh. Mengikuti tautan Anda, saya menemukan yang ini juga dan saya setuju . : ^)
Chris22
Apa yang dikatakan @Syed tidak tidak benar
selamat pagi
16

<input :required="condition">

Anda tidak perlu <input :required="test ? true : false">karena jika tes adalah truthy Anda sudah mendapatkan requiredatribut, dan jika tes adalah falsy Anda tidak akan mendapatkan atribut. The true : falseBagian berlebihan, seperti ini ...

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

Maka, cara paling sederhana untuk melakukan pengikatan ini adalah <input :required="condition">

Hanya jika tes (atau kondisi ) dapat disalahartikan, Anda perlu melakukan sesuatu yang lain; dalam hal ini, penggunaan Syed akan berhasil !!.
  <input :required="!!condition">

Stephen P.
sumber
11

Anda bisa melewatkannya booleandengan memaksakannya, letakkan di !!depan variabel.

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

Tetapi saya ingin menarik perhatian Anda untuk kasus berikut di mana komponen penerima telah ditentukan typeuntuk props. Dalam hal ini, jika isRequiredtelah ditentukan tipe untuk menjadi stringmaka melewati booleanpemeriksaan tipe membuatnya gagal dan Anda akan mendapatkan peringatan Vue. Untuk memperbaikinya Anda mungkin ingin menghindari melewatkan prop itu, jadi letakkan saja undefinedfallback dan prop tidak akan dikirim kecomponent

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

Penjelasan

Saya telah melalui masalah yang sama, dan mencoba solusi di atas !! Ya, saya tidak melihat proptetapi itu sebenarnya tidak memenuhi apa yang diminta di sini.

Masalahku -

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

Dalam kasus di atas, apa yang saya harapkan adalah tidak my-propditeruskan ke komponen anak - <any-conponent/>Saya tidak melihat bagian propdalam DOMtetapi Dalam <any-component/>komponen saya , kesalahan muncul dari kegagalan pemeriksaan tipe prop. Seperti pada komponen anak, saya mengharapkan my-propmenjadi Stringtetapi sebenarnya boolean.

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

Yang berarti bahwa komponen anak menerima prop meskipun itu false. Tweak di sini adalah membiarkan komponen anak mengambil default-valuedan juga melewati pemeriksaan. Lulus undefinedbekerja!

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

Ini berfungsi dan prop anak saya memiliki nilai default.

Satyam Pathak
sumber
2

Dalam penggunaan html

<input :required="condition" />

Dan tentukan dalam properti data seperti

data () {
   return {
      condition: false
   }
}
Nipun Jain
sumber