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

IT技术 javascript vue.js vuejs2
2021-03-13 13:08:14

在 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>

有任何想法吗?

6个回答

尝试:

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

更新:它在 Vue 3 中发生了变化,请参阅此答案https://stackoverflow.com/a/64598898

anythingAtAll : ? true : false(或if (condition) { return true; } else { return false; })在任何语言中都是……不体面的只需使用,return (condition)或者在这种情况下,<input :required="test">
2021-04-30 13:08:14
长格式是 <input v-bind:required="test ? true : false">
2021-05-09 13:08:14
请注意,这取决于组件!如果您的属性接受String值,则将其设置为false您可能会type check出错。所以将它设置为undefined而不是 false。文档
2021-05-17 13:08:14
使用:required="required"where requiredis a Boolean 组件属性会导致 <el required="required"> 对我来说
2021-05-17 13:08:14
如果您确定该变量testboolean,则可以使用:required="test"
2021-05-21 13:08:14

最简单的形式:

<input :required="test">   // if true
<input :required="!test">  // if false
<input :required="!!test"> // test ? true : false
@Syed 谢谢。按照你的链接,我也找到了这个,我同意:^)
2021-05-01 13:08:14
请注意,这取决于组件!如果您的属性接受String值,则将其设置为false您可能会type check出错。所以将它设置为undefined而不是 false。文档
2021-05-02 13:08:14
@Chris22 !test 和 !!!test 之间没有区别,因为 !!!test 只是 !!(!test) 并且因为 !test 是一个布尔值,!!(!test) 只是它的双重否定,因此相同的。检查这个:stackoverflow.com/a/25318045/1292050
2021-05-04 13:08:14
@Syed 使用双感叹号回答您的答案!! 我昨天之前从未见过这种语法,在代码审查期间我遇到了这个:--<input :required="!!!recipe.checked" v-model="recipe.pieType"><select :required="!!!recipe.checked" v-model="recipe.ingredients" :options="ingredients"></select> 你知道!!!(3) 对一个:required意味着什么吗?谢谢。
2021-05-09 13:08:14
@Syed 所说的并非不真实
2021-05-18 13:08:14

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

视图 2:

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

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

视图 3:

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

<div :attr="null">
Result: <div>
正确,完整和简洁的答案,谢谢。
2021-04-24 13:08:14
谢谢,这就是我要找的答案。
2021-04-26 13:08:14
undefined 适用于我正在使用的少数 Vue 包
2021-05-10 13:08:14

<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">

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

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

但我想请您注意以下接收组件已type为 props定义的情况。在这种情况下,如果isRequired已经定义了类型,string则通过boolean使其类型检查失败,您将收到 Vue 警告。要解决此问题,您可能希望避免传递该props,因此只需放置undefined回退,props就不会发送到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/>我没有看到propinDOM但在我的<any-component/>组件中,由于 prop 类型检查失败而弹出错误。就像在子组件中一样,我希望my-prop是 aString但它是boolean.

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

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

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

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

在使用选择选项(和选择的属性)时,这对我有用
2021-04-30 13:08:14