VueJS умовно додає атрибут для елемента


119

У VueJS ми можемо додати або видалити елемент DOM за допомогою v-if:

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

але чи є спосіб додати / видалити атрибути елемента dom, наприклад для наступного умовно встановленого необхідного атрибута:

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

чимось схожим на:

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

Якісь ідеї?


4
Хоча це не так очевидно (звідси плутанина), документація насправді говорить, що якщо значення атрибута оцінюється як хибне, то атрибут опущений ( vuejs.org/v2/guide/syntax.html#Attributes )
AlexanderB

На насправді, йдеться в документації атрибут не буде доданий , якщо «... має значення null, undefinedчи false» , який відрізняється від сценарію JS оцінюючи значення БРЕХНЯ. Це означає, що порожній рядок є хибним у JavaScript, але все ж додасть атрибут у DOM. Щоб запобігти цьому, ви можете спробуватиv-bind:name="name || false"
Denilson Sá Maia

@AlexanderB Якщо це правда, як я можу передати явний falseдочірній компонент через опору?
Брюс Нд

@BruceSun, Якщо атрибут у контексті "ненавмисно" зникає, коли ви надаєте йому помилкове значення - спробуйте передати його як рядок 'false'. В інших випадках, коли вам потрібно контролювати наявність не булевого атрибута html на елементі, ви можете використовувати умовне візуалізацію, v-ifяк запропоновано тут: github.com/vuejs/vue/isissue/7552#issuecomment-361395234
AlexanderB

@AlexanderB Я думаю, що я повинен виправити себе - я повинен сказати, attributeале НЕ prop. Ми можемо безпечно передавати явне falseчерез властивість компонента, але атрибут NOT (який не визнається властивістю). Я прав?
Брюс Нд

Відповіді:


127

Спробуйте:

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

9
Довга форма<input v-bind:required="test ? true : false">
Натаніелоброн

8
anythingAtAll : ? true : false(або if (condition) { return true; } else { return false; }) будь-якою мовою є ... недобре . Просто використовуйте return (condition)або, у цьому випадку,<input :required="test">
Стівен Р

5
якщо ви впевнені, що ця змінна testє boolean, ви можете просто скористатися:required="test"
strz

2
Зверніть увагу, що це залежить від компонента! Цілком можливо, якщо ваш ресурс прийме Stringзначення, встановивши його, falseви отримаєте type checkпомилку. Тому встановіть його undefinedзамість false. docs
Traxo

використання, :required="required"де requiredє властивість булевого компонента, приводить для мене <el потрібно = "обов'язково">
Ендрю Кастеллано,

65

Найпростіша форма:

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

1
Зверніть увагу, що це залежить від компонента! Цілком можливо, якщо ваш ресурс прийме Stringзначення, встановивши його, falseви отримаєте type checkпомилку. Тому встановіть його undefinedзамість false. docs
Traxo

@Свідчив вашу відповідь, використовуючи подвійні знаки оклику. !! Я ніколи не бачив цього синтаксису раніше, ніж під час перегляду коду, я натрапив на це: - <input :required="!!!recipe.checked" v-model="recipe.pieType"><select :required="!!!recipe.checked" v-model="recipe.ingredients" :options="ingredients"></select> Чи знаєте ви, що !!!означає (3) :requiredзначення? Дякую.
Chris22

2
@ Chris22 Немає різниці між! Test і !!! test, оскільки !!! тест просто !! (! Тест) і тому, що! Test є булевим, !! (! Test) - це лише його подвійне заперечення, тому те саме. Перевірте це: stackoverflow.com/a/25318045/1292050
Сайед

@Syed спасибо Перейшовши за вашим посиланням, я знайшов і цей, і я згоден . : ^)
Chris22

Що @Syed сказане не відповідає дійсності
Гудсон

16

<input :required="condition">

Вам це не потрібно, <input :required="test ? true : false">тому що якщо тест є надійним, ви вже отримаєте requiredатрибут, а якщо тест - хибний, ви не отримаєте атрибут. true : falseЧастина є зайвою, оскільки ж, як це ...

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

Тоді найпростіший спосіб зробити це зв’язування <input :required="condition">

Тільки якщо тест (або умова ) можна неправильно трактувати, вам потрібно буде зробити щось інше; у такому випадку використання Syed !!виконує трюк.
  <input :required="!!condition">


11

Ви можете пройти boolean, примусивши його, поставити !!перед змінною.

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

Але я хотів би звернути вашу увагу на наступний випадок, коли приймаючий компонент визначив typeдля реквізиту. У такому випадку, якщо isRequiredвизначений тип, який потрібно stringпередати, booleanзробіть його перевірку на помилку, і ви отримаєте попередження Vue. Щоб виправити те, що ви можете уникнути передачі реквізиту, просто поставте undefinedрезервний запас, і реквізит не буде надісланийcomponent

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

Пояснення

Я пережив ту ж проблему і спробував вище рішення !! Так, я не бачу, propале це насправді не відповідає тому, що тут потрібно.

Моя проблема -

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

У вищенаведеному випадку я очікував, що не my-propперейде до дочірнього компонента - <any-conponent/>я не бачу propв, DOMале в моєму <any-component/>компоненті виникла помилка перевірки типу перевірки. Як і в дочірній складовій, я очікую my-propбути такою, Stringале вона є boolean.

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

Що означає, що дочірній компонент отримав опору, навіть якщо вона є false. Налаштуйте тут, щоб дозволити дочірньому компоненту взяти default-valueі також пропустити чек. undefinedХоча роботи пройшли !

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

Це працює, і моє дочірнє опора має значення за замовчуванням.


2

У використанні html

<input :required="condition" />

І визначити у властивості даних, як

data () {
   return {
      condition: false
   }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.