我目前在理解 VueJS 的 v-model 反应性如何工作方面遇到一些困难。
我有一个选择插件可以帮助我设置选择字段的样式,但它当然可以通过JS更改选择字段值,问题是它永远不会触发v-model来更新其值,如果我尝试
document.getElementById('field').value = 'whatever'
,也会发生同样的情况,如果我这样做,v-model 将不会更新,只有当我直接在字段中键入或单击真正的选择字段时,它才会更新。
正如我所读到的,Vue 似乎只监听
input
事件来触发其反应性,当我简单地用 JS 更改字段的值时,事件不会被触发,但不会更新变量的值。
我真的需要更深入地了解这一点,并在下次发生此类问题时找到处理此类问题的最佳方法。在这种情况下,我无法控制插件的事件,最好的解决方案是什么?当值动态更改时,如何让 Vue 监听并且不再出现此问题?
感谢您的帮助!
我不完全确定这是否有帮助,但是您查看过表单输入组件吗? https://v2.vuejs.org/v2/guide/components.html#Form-Input-Components-using-Custom-Events
您的输入组件必须将事件发送回外部,以使其更新与该组件关联的
v-model
的值。
如果您无法确定输入值是否已更改,您可能还需要检查
watchers
https://v2.vuejs.org/v2/guide/compulated.html#Compulated-vs-Watched-Property
我希望这有帮助。
如果您想以编程方式修改
<input>
值后触发 Vue 反应性,您基本上有两个选择:
例如,创建Vue实例时,将其保存到全局var
window.vueapp = Vue.createApp({
//blah blah
});
//and then
window.vueapp.PropertyX = "whatever";
change
DOM事件。$('#textBox').val('Some text')[0].dispatchEvent(new Event('input'));
这就是该行中发生的事情:您获取输入的 jQuery 对象,然后获取
[0]
,它为您提供纯 DOM 元素(不是 jQuery 对象),然后触发浏览器的 change
事件。
附注有时,您需要触发
change
事件,而不是触发 input
。文本框需要 input
。选择框和复选框需要 change
。
P.P.S。我知道这很令人困惑,但是,是的,就是这样。