-
Notifications
You must be signed in to change notification settings - Fork 14.6k
InputNumber: fix change触发事件优先于input bug #12291
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Deploy preview for element ready! Built with commit 4842b22 |
这种情况直接 |
默认值为 由于使用了 如果直接使用 但是需要注意的一点是在 |
@@ -223,7 +223,9 @@ | |||
return; | |||
} | |||
this.$emit('input', newVal); | |||
this.$emit('change', newVal, oldVal); | |||
setTimeout(() => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这里可以用 this.$nextTick 替代
1f20774
to
4842b22
Compare
@jikkai 已更改为 |
看了一下代码。其实还是input和input-number内部实现的问题。没有严格遵守单向数据流,内部另外维护了显示值。彻底修要和input一起重构。 |
这句话,我不是特别理解。😂InputNumber 的实现大致如下: <el-input :value="currentInputValue" @change="handleInputChange"></el-input>
我感觉内部维护一个显示值是不可少的,如果不需要这个值,那要怎么去做? |
我倾向于直接把组件的 value 显示出来。currentInputValue 其实是想获得用户输入的值,但应该显示的值是根据 value 和 currentInputValue 算出来的。改完以后有点像 date-picker 里我以前改过的 userInput + (computed) displayValue 那种写法 https://github.com/ElemeFE/element/blob/dev/packages/date-picker/src/picker.vue#L492-L508。 watch 的坏处是「难以弄清方法调用顺序和关系」,维护起来很麻烦。容易导致timing的问题(比如某些操作必须 nextTick 等更新) input 的话,就更不需要维护一个 currentValue 了(现在是watch value再更新currentValue)。额外内部状态会导致 https://jsfiddle.net/60d1cm5j/ 里面 input 的值可以修改,但是代码却刻意无视了input事件,这种情况下 input 显示的内容无法被修改才比较合理(和下面的date-picker对比)。 另外,可以考虑把 textarea 和 input 分成两个子组件,两者的逻辑分开来会比现在的写法更清晰。 |
这个的 nextTick 和 input 的内部实现也有关联:#12171 |
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions. |
Please make sure these boxes are checked before submitting your PR, thank you!
dev
branch.模拟一个使用场景,用户期望文本框显示值恒为5的倍数时,虽然在源码中
input
比change
写的早,但是在实际场景中,change
中this.number
的setter
会早于input
的触发,导致用户在change
中设置的值,会被input
触发的newVal
所覆盖掉。如果不修改此BUG,用户需要手动在
handelChange
中写setTimeout
或nextTick
,这明显不是一个比较好的做法。