【发布时间】:2018-09-27 04:16:38
【问题描述】:
我有一个组件,它是一个输入字段,它接受三种情况并将它们转换为内部状态(数字):
- 输入:无(空字符串);状态:未定义;类:是空的;值:空字符串
- 输入:任意正数;状态:正数;类:;值:正数
- 输入:
-;状态:-1;类:未知;值:- - 否则:状态:-2;类:是无效的;值:空字符串
这个组件有一个output 计算属性,它有一个改变内部状态的setter 和一个根据内部状态在无效时返回数字、破折号或空字符串的getter。特殊情况是我希望将字段保留为空的无效输入。
对于第一个无效字符,它工作得很好,但是下一个会显示在字段中。我怀疑这个值被缓存了,因为内部状态保持在invalid,因此使用了缓存。
<template>
<input v-model="output" v-bind:class="state"/>
</template>
<script>
export default {
name: 'TsResult',
props: ['result'],
data: function() {
return {
res: this.result
}
},
computed: {
state: function() {
// ..
if (this.res === -2) {
return 'is-invalid'
} else if (this.res === -1) {
return 'is-unknown'
}
// ...
},
'output': {
set: function(newVal) {
//..
if (isInvalid(newVal)) {
this.res = -2;
} else if (isUnknwon(newVal)) {
this.res = -1;
}
// ...
},
get: function() {
if (this.res === -2 ) { // Invalid
return ''
} else if (this.res === -1) { // Unknown
return '-'
}
// ...
}
}
</script>
使用方法而不是计算的 getter 不适用,因为我需要 setter 来执行验证。
并且使用观察者不是一个好主意,因为无效状态会改变输入值(通过设置一个空字符串)并重新触发接受空字符串的观察者。所以永远不会显示无效状态。
我可以禁用此计算属性的缓存还是有更好的选择?
一个可能的技巧是减少无效状态的内部状态,以便内部状态发生变化并重新计算值。但我希望有更好的解决方案。
【问题讨论】:
-
请提供代码示例
标签: vue.js vuejs2 vue-component