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

Don*_*the 81 javascript vue.js vuejs2

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

<button v-if="isRequired">Important Button</button>
Run Code Online (Sandbox Code Playgroud)

但有没有办法添加/删除dom元素的属性,例如以下有条件地设置所需的属性:

Username: <input type="text" name="username" required>
Run Code Online (Sandbox Code Playgroud)

通过类似的东西:

Username: <input type="text" name="username" v-if="name.required" required>
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

cym*_*ruu 96

尝试:

<input :required="test ? true : false">
Run Code Online (Sandbox Code Playgroud)

  • long form是`<input v-bind:required ="test?true:false">` (7认同)
  • `anythingAtAll :?true:false`(或`if(condition){返回true;} else {return false;}`)是... _unseemly_。只需使用`return(condition)`,或者在这种情况下使用`&lt;input:required =“ test”&gt;` (5认同)
  • 使用 `:required="required"` 其中 `required` 是一个布尔组件属性导致 &lt;el required="required"&gt; 对我来说 (3认同)
  • 如果你确定变量`test`是`boolean`,你可以使用`:required ="test"` (2认同)
  • 请注意,这取决于组件!如果您的媒体资源接受“字符串”值,则可能将其设置为“假”,这将导致“类型检查”错误。因此,将其设置为`undefined`而不是false。[docs](https://vuejs.org/v2/guide/syntax.html#Attributes) (2认同)
  • 请注意,这在 Vue 3 中发生了变化,请参阅下面的答案之一 (2认同)
  • @ConnorShea谢谢你,我更新了我的答案 (2认同)

Sye*_*yed 51

最简单的形式:

<input :required="test">   // if true
<input :required="!test">  // if false
<input :required="!!test"> // test ? true : false
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这取决于组件!如果您的属性接受 `String` 值,通过将其设置为 `false`,您可能会收到 `type check` 错误。所以将它设置为 `undefined` 而不是 false。[文档](https://vuejs.org/v2/guide/syntax.html#Attributes) (3认同)
  • @ Chris22!test和!!! test之间没有区别,因为!!! test只是!!(!test)因为!test是一个布尔值,!!(!test)只是它的双重否定,因此相同.请检查:/sf/answers/1772263181/ (2认同)

Jou*_*ola 24

Vue 3 中更改了属性的条件渲染。要省略属性,请使用nullundefined

视图 2:

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

<div :attr="null">
Result: <div>
Run Code Online (Sandbox Code Playgroud)

视图 3:

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

<div :attr="null">
Result: <div>
Run Code Online (Sandbox Code Playgroud)


Sat*_*hak 18

您可以通过boolean强制传递它,放在!!变量之前。

let isRequired = '' || null || undefined
<input :required="!!isRequired"> // it will coerce value to respective boolean 
Run Code Online (Sandbox Code Playgroud)

但我想引起您对以下情况的注意,其中接收组件已type为 props定义。在这种情况下,如果isRequired已定义类型,string则通过boolean使其类型检查失败,您将收到 Vue 警告。要解决此问题,您可能希望避免传递该道具,因此只需放置undefined回退,道具就不会发送到component

let isValue = false
<any-component
  :my-prop="isValue ? 'Hey I am when the value exist' : undefined"
/>
Run Code Online (Sandbox Code Playgroud)

解释

我遇到了同样的问题,并尝试了上述解决方案!!是的,我没有看到prop但实际上并没有满足这里的要求。

我的问题 -

let isValid = false
<any-component
  :my-prop="isValue ? 'Hey I am when the value exist': false"
/>
Run Code Online (Sandbox Code Playgroud)

在上述情况下,我所期望的不是my-prop传递给子组件 -<any-conponent/>我没有看到propinDOM但在我的<any-component/>组件中,错误从 prop 类型检查失败中弹出。就像在子组件中一样,我希望my-prop是 aString但它是boolean.

myProp : {
 type: String,
 required: false,
 default: ''
}
Run Code Online (Sandbox Code Playgroud)

这意味着子组件确实收到了 prop,即使它是false. 这里的调整是让子组件接受default-value并跳过检查。undefined虽然通过了作品!

<any-component
  :my-prop="isValue ? 'Hey I am when the value exist' : undefined"
/>
 
Run Code Online (Sandbox Code Playgroud)

这有效并且我的子道具具有默认值。


Ste*_*n P 13

<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
Run Code Online (Sandbox Code Playgroud)

那么,执行此绑定的最简单方法是 <input :required="condition">

只有当测试(或条件)被误解时,你才需要做其他事情; 在那种情况下,赛义德的使用!!就是诀窍.
  <input :required="!!condition">


nik*_*ong 8

值得注意的是,如果您想有条件地添加属性,您还可以添加动态声明:

<input v-bind="attrs" />
Run Code Online (Sandbox Code Playgroud)

其中 attrs 被声明为一个对象:

data() {
    return {
        attrs: {
            required: true,
            type: "text"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将导致:

<input required type="text"/>
Run Code Online (Sandbox Code Playgroud)

适合具有多个属性的情况。


小智 8

您可以在属性前添加冒号(也可以使用条件),例如

<div :class="current? 'active': '' " > 
<button :disabled="InvalidForm? true : false " >
Run Code Online (Sandbox Code Playgroud)

如果要设置像 props 这样的动态值,则还可以在属性名称前使用冒号,例如:

<Child :data="userList" />
Run Code Online (Sandbox Code Playgroud)