【问题标题】: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 最初使用空值呈现 <input>。
如你所愿在禁用按钮中使用变量,我的建议是:使用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>
或者,如果您可以将name 和defaultName 都设置为相同的初始值,则甚至不需要上面的mounted() 逻辑。
【解决方案2】:
我的解决方案可能比使用禁用标志更详细。但我会使用:
@click.prevent="提交"
然后做一个提交方法来处理检查,如果输入没有改变则返回false。