【问题标题】:vue js disable input if value hasn't changed如果值没有改变,vue js禁用输入
【发布时间】:2018-09-10 13:40:26
【问题描述】:

我有一个带有初始值的输入:

<input type="text" v-model="name" ref="input" />
<button type="submit" :disabled="$refs.input.defaultValue == $refs.input.value">Submit</button>

但是disabled 绑定给出了错误:Cannot read property defaultValue of undefined。 在不向 vm.data 发送过多垃圾邮件的情况下执行此操作的最佳方法是什么?

【问题讨论】:

  • "这给出了一个错误" ...并且错误是?

标签: javascript vue.js binding vuejs2 disabled-input


【解决方案1】:

错误:

无法读取未定义的属性 defaultValue

是因为ref 这么快还不可用:

关于 ref 注册时间的重要说明:因为 refs 它们是由渲染函数创建的,你不能 在初始渲染时访问它们——它们还不存在! $refs 是 也是非反应性的,因此您不应尝试在 数据绑定模板。

当您将其添加到button 的模板时,它会尝试过早使用它。

解决方法是添加一个简单的条件:

<button type="submit" :disabled="!$refs.input || $refs.input.defaultValue == $refs.input.value">Submit</button>

但暂时不要高兴。


defaultValue 不会有你想象的价值

当使用v-model 时,defaultValue 实际上将始终为空字符串 (""),因为 Vue 最初使用空值呈现 &lt;input&gt;

如你所愿在禁用按钮中使用变量,我的建议是:使用mouted() 逻辑来“保存”初始值,并在按钮模板中与它进行比较,而不是defaultValue

下面的演示。

new Vue({
  el: '#app',
  data: {
    name: 'Hello Vue.js!'
  },
  mounted() {
    this.$refs.input.dataset.defVal = this.$refs.input.value;
  }
})
<script src="https://unpkg.com/vue"></script>

<div id="app">
  <p>{{ name }}</p>
  <input type="text" v-model="name" ref="input" />
  <button type="submit" :disabled="!$refs.input || $refs.input.dataset.defVal == $refs.input.value">Submit</button>
</div>


替代方案:一直使用 Vue

当然,如果有可能,您应该利用 Vue 的数据驱动响应式特性,因为处理 DOM 总是很棘手。

解决方案是创建另一个变量并将其填充到mounted()

new Vue({
  el: '#app',
  data: {
    name: 'Hello Vue.js!',
    defaultName: null
  },
  mounted() {
    this.defaultName = this.name;
  }
})
<script src="https://unpkg.com/vue"></script>

<div id="app">
  <p>{{ name }}</p>
  <input type="text" v-model="name"/>
  <button type="submit" :disabled="name == defaultName">Submit</button>
</div>

或者,如果您可以将namedefaultName 都设置为相同的初始值,则甚至不需要上面的mounted() 逻辑。

【讨论】:

    【解决方案2】:

    我的解决方案可能比使用禁用标志更详细。但我会使用: @click.prevent="提交"

    然后做一个提交方法来处理检查,如果输入没有改变则返回false。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      • 2020-04-03
      • 2021-04-22
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      相关资源
      最近更新 更多