vue.js有条件地禁用输入

时间:2016-06-28 19:54:37

标签: javascript html forms vue.js

我有一个输入:

<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;
    },
..

validatedboolean,可以是01,但无论数据库中存储的是什么值,我的输入都会被禁用。< / p>

我需要在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 : ''">

12 个答案:

答案 0 :(得分:340)

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

因此,如果validated的值为1或0,则根据该值有条件地设置disabled道具。 E.g:

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

Here is an example

答案 1 :(得分:50)

你可以有一个计算属性,它返回一个布尔值,取决于你需要的任何标准。

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

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

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

答案 2 :(得分:20)

不难,请检查一下。

<button @click="disabled = !disabled">Toggle Enable</button>
<input type="text" id="name" class="form-control" name="name"  v-model="form.name" :disabled="disabled">

jsfiddle

答案 3 :(得分:14)

您的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的{​​{1}}或0值转换为1false

不相信我?进入您的控制台并输入true!!0: - )

另外,要确保您的号码!!11绝对是一个号码,而不是字符串0'1'预先挂起您的值使用'0'例如+进行检查,这会将数字字符串转换为数字,例如

<input :disabled="!!+validated"/> 就像David Morrow上面所说的那样,你可以将你的条件逻辑放入一个方法中 - 这会给你更多可读代码 - 只需返回你要检查的条件的方法。

答案 4 :(得分:8)

您可以在 vue.js 中操纵:disabled属性。

它会接受一个布尔值,如果它是 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>

答案 5 :(得分:5)

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

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

答案 6 :(得分: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>

答案 7 :(得分:2)

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

(1)请记住:输入的“已禁用”属性是不是布尔值属性。
该属性的仅状态表示该输入被禁用。

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

(感谢@connexo ... How to add disabled attribute in input text in vuejs?

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

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

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

答案 8 :(得分:1)

尝试一下

 <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;
    }
  }
})

答案 9 :(得分:0)

请记住,在撰写本文时,据我所知,ES6集/地图似乎没有反应性。

答案 10 :(得分:0)

这也将起作用

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

答案 11 :(得分:0)

我的解决方案:

// App.vue 模板

<button
            type="submit"
            class="disabled:opacity-50 w-full px-3 py-4 text-white bg-indigo-500 rounded-md focus:bg-indigo-600 focus:outline-none"
            :disabled="isButtonDisabled()"
            @click="sendIdentity()"
          >
            <span v-if="MYVARIABLE > 0"> Add {{ MYVARIABLE }}</span>
            <span v-else-if="MYVARIABLE == 0">Alternative text if you like</span>
            <span v-else>Alternative text if you like</span>
          </button>

基于 Tailwind

的样式

// App.vue 脚本

 (...)
  methods: {
   isButtonDisabled(){
    return this.MYVARIABLE >= 0 ? undefined: 'disabled';
   }
 }

手册: vue v2 vue v3

<块引用>

如果 isButtonDisabled 的值为 null、undefined 或 false,则 disabled 属性甚至不会包含在渲染中 元素。