VueJS有条件地为元素添加属性


119

在VueJS中,我们可以使用v-if添加或删除DOM元素:

<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

实际上,文件说,该属性将不会添加,如果“......具有的价值nullundefined或者false,这是从一个JS脚本评估,以虚假的不同。这意味着空字符串在JavaScript中是虚假的,但仍会将属性添加到DOM。为防止您可以尝试v-bind:name="name || false"
DenilsonSáMaia

@AlexanderB如果是真的,我如何false通过prop 显式传递给子组件?
布鲁斯·孙

@BruceSun,如果在为属性赋予错误值时上下文中的属性“无意中”消失了,请尝试将其作为字符串传递'false'。在其他情况下,当您需要控制元素上是否存在非布尔html属性时,可以v-if按照以下建议使用条件渲染: github.com/vuejs/vue/issues/7552#issuecomment-361395234
AlexanderB

@AlexanderB我想我必须纠正自己-我应该说,attribute但不是prop。我们可以false通过组件属性安全地传递显式属性,但可以通过NOT属性(不能识别为属性)传递显式属性。我对么?
布鲁斯·孙

Answers:


127

尝试:

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

9
长格式为<input v-bind:required="test ? true : false">
nathanielobrown

8
anythingAtAll : ? true : false(或if (condition) { return true; } else { return false; })用任何语言似乎都不是很合理。只需使用return (condition)或在这种情况下<input :required="test">
Stephen P

5
如果您确定变量testboolean,则可以使用:required="test"
strz

2
请注意,这取决于组件!如果您的媒体资源接受String值,则将其设置为值很false可能会type check出错。因此,将其设置undefined为false。docs
Traxo

使用:required="required"where required是布尔值组件属性对我来说导致<el required =“ required”>
Andrew Castellano

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吗?谢谢。
克里斯22年

2
@ Chris22!test和!!! test之间没有区别,因为!!! test只是!!(!test)并且因为!test是布尔值,!!(!test)只是它的双重否定,因此相同。检查一下:stackoverflow.com/a/25318045/1292050
Syed '18

@谢谢。通过您的链接,我也找到了该链接,我也同意。:^)
克里斯

@Syed所说的并非不正确
21:02交货

16

<input :required="condition">

您不需要,<input :required="test ? true : false">因为如果test真实的,您将已经获得了该required属性,并且 test虚假的,您将不会获得该属性。该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/>我看不到propin,DOM但是在我的<any-component/>组件中,错误从prop类型检查失败中弹出。与子组件一样,我期望my-prop是a,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
   }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.