如何在vue.js中有条件地禁用输入


277

我有一个输入:

<input type="text" id="name" class="form-control" name="name"  v-model="form.name" :disabled="validated ? '' : disabled">

在我的Vue.js组件中,我有:

..
..
ready() {
        this.form.name = this.store.name;
        this.form.validated = this.store.validated;
    },
..

validated作为一个boolean,可以是01,但是无论数据库中存储了什么值,我的输入始终被禁用。

如果需要,我需要禁用输入false,否则应将其启用并进行编辑。

更新:

这样做总是启用输入(无论数据库中有0还是1):

<input type="text" id="name" class="form-control" name="name"  v-model="form.name" :disabled="validated ? '' : disabled">

这样做总是禁用输入(无论我的数据库中有0还是1):

<input type="text" id="name" class="form-control" name="name"  v-model="form.name" :disabled="validated ? disabled : ''">

Answers:


484

要删除禁用的道具,您应该将其值设置为false。这需要是布尔值false,而不是字符串'false'

因此,如果for的值为validated1或0,则disabled根据该值有条件地设置prop。例如:

<input type="text" :disabled="validated == 1">

这是一个例子。

var app = new Vue({
  el: '#app',

  data: {
    disabled: 0,
  },
}); 
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <button @click="disabled = (disabled + 1) % 2">Toggle Enable</button>
  <input type="text" :disabled="disabled == 1">
    
  <pre>{{ $data }}</pre>
</div>


在我的数据库中,我存储了0和1来
判断是非

我需要编辑我的数据库结构以使其完全正确和错误吗?
Zaffar Saffee

没有,只是值设置为true还是false取决于项目的在您的分贝值
asemahle

11
只要::disabled =“ validated”只要验证为True / false或0/1,Javascript就会知道。
Despertaweb

1
@gk jsfiddle中的代码现在已在答案中
asemahle19年

63

您可以具有一个计算属性,该属性根据所需的条件返回一个布尔值。

<input type="text" :disabled=isDisabled>

然后将您的逻辑放在计算属性中...

computed: {
  isDisabled() {
    // evaluate whatever you need to determine disabled here...
    return this.form.validated;
  }
}

这对我有用,不需要引号,在我的情况下,可以在中isDisabled()定义的HTML中调用Data
狮子座

我绝对喜欢这种更加整洁的方式
Shady Echo 419

为什么不需要引号?
Ferkze


15

您的Disabled属性需要一个布尔值:

<input :disabled="validated" />

请注意我如何只检查是否validated-应如0 is falsey...

0 is considered to be false in JS (like undefined or null)

1 is in fact considered to be true

要格外小心,请尝试: <input :disabled="!!validated" />

这种双重否定转动falseytruthy价值01falsetrue

不相信我吗?进入控制台并输入!!0!!1:-)

另外,要确保您的数字10绝对作为数字而不是字符串出现,'1''0'在您要检查的值前面加上+例如,<input :disabled="!!+validated"/>这会将数字的字符串转换为数字,例如

+1 = 1 +'1' = 1 就像上面的David Morrow所说的那样,您可以将条件逻辑放入方法中-这样可以使代码更具可读性 -只需从方法中返回要检查的条件即可。


11

您可以:disabledvue.js中操纵属性。

它将接受一个布尔值,如果为true,则输入被禁用,否则它将被启用...

例如,您的情况如下所示:

<input type="text" id="name" class="form-control" name="name" v-model="form.name" :disabled="validated ? false : true">

另请阅读以下内容:

通过JavaScript表达式有条件地禁用输入元素

您可以有条件地禁用与JavaScript表达式内联的输入元素。这种紧凑的方法提供了一种应用简单条件逻辑的快速方法。例如,如果您只需要检查密码的长度,则可以考虑执行以下操作。

<h3>Change Your Password</h3>
<div class="form-group">
  <label for="newPassword">Please choose a new password</label>
  <input type="password" class="form-control" id="newPassword" placeholder="Password" v-model="newPassword">
</div>

<div class="form-group">
  <label for="confirmPassword">Please confirm your new password</label>
  <input type="password" class="form-control" id="confirmPassword" placeholder="Password" v-model="confirmPassword" v-bind:disabled="newPassword.length === 0 ? true : false">
</div>

7

您可以创建一个计算属性,并根据其值启用/禁用任何表单类型。

<template>
    <button class="btn btn-default" :disabled="clickable">Click me</button>
</template>
<script>
     export default{
          computed: {
              clickable() {
                  // if something
                  return true;
              }
          }
     }
</script>

1
我认为,这是最容易阅读并适用于自己的用例的答案。
乔治·坦佩斯塔

1
这是唯一对我有用的东西。将方法移至计算方法而不是方法。谢谢!
jokab

6

试试这个

 <div id="app">
  <p>
    <label for='terms'>
      <input id='terms' type='checkbox' v-model='terms' /> Click me to enable
    </label>
  </p>
  <input :disabled='isDisabled'></input>
</div>

Vue JS

new Vue({
  el: '#app',
  data: {
    terms: false
  },
  computed: {
    isDisabled: function(){
        return !this.terms;
    }
  }
})

4

切换输入的disable属性非常复杂。对我来说,问题是双重的:

(1) 请记住:输入的“ disabled”属性不是布尔属性。
存在该属性就意味着该输入被禁用。

但是,Vue.js的创建者已经准备好了... https://vuejs.org/v2/guide/syntax.html#Attributes

(感谢@connexo。。。如何在vuejs的输入文本中添加禁用的属性?

(2)另外,我还有一个DOM时序重新渲染问题。当我尝试回退时,DOM没有更新。

在某些情况下,“该组件将不会立即重新渲染。它将在下一个'tick'中更新。”

从Vue.js文档中:https ://vuejs.org/v2/guide/reactivity.html

解决方案是使用:

this.$nextTick(()=>{
    this.disableInputBool = true
})

更完整的示例工作流程:

<div @click="allowInputOverwrite">
    <input
        type="text"
        :disabled="disableInputBool">
</div>

<button @click="disallowInputOverwrite">
    press me (do stuff in method, then disable input bool again)
</button>

<script>

export default {
  data() {
    return {
      disableInputBool: true
    }
  },
  methods: {
    allowInputOverwrite(){
      this.disableInputBool = false
    },
    disallowInputOverwrite(){
      // accomplish other stuff here.
      this.$nextTick(()=>{
        this.disableInputBool = true
      })
    }
  }

}
</script>

++(然而,Vue.js创作者编写这... vuejs.org/v2/guide/syntax.html#Attributes
里蒂斯Dereskevicius

2

可以使用此添加条件。

  <el-form-item :label="Amount ($)" style="width:100%"  >
            <template slot-scope="scoped">
            <el-input-number v-model="listQuery.refAmount" :disabled="(rowData.status !== 1 ) === true" ></el-input-number>
            </template>
          </el-form-item>

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.