ChatGPT解决这个技术问题 Extra ChatGPT

v-model 更改时如何触发事件?

我正在尝试使用 @click 触发 foo() 功能,但如您所见,需要按两次单选按钮才能正确触发事件。仅在您第二次按下时捕获该值...

我想在没有 @click 的情况下触发事件,仅在 v-model (srStatus) 更改时触发事件。

这是我的小提琴:

http://fiddle.jshell.net/wanxe/vsa46bw8/

小提琴链接不再起作用。
如果调用 foo() 的目的是进行非模板更改,请使用 watcher
这是一个很好的例子,说明为什么问题中需要代码。如果可能,请恢复它并在此处显示。
我希望我能检索到问题的代码,但那已经是 5 年前了……幸运的是,我们有很好的答案

A
Antti29

您实际上可以通过删除 v-on 指令来简化此操作:

<input type="radio" name="optionsRadios" id="optionsRadios1" value="1" v-model="srStatus">

并使用 watch 方法来监听变化:

new Vue ({
    el: "#app",
    data: {
        cases: [
            { name: 'case A', status: '1' },
            { name: 'case B', status: '0' },
            { name: 'case C', status: '1' }
        ],
        activeCases: [],
        srStatus: ''
    },
    watch: {
        srStatus: function(val, oldVal) {
            for (var i = 0; i < this.cases.length; i++) {
                if (this.cases[i].status == val) {
                    this.activeCases.push(this.cases[i]);
                    alert("Fired! " + val);
                }
            }
        }
    }
});

你能自动观看任何型号的变化吗?例如,对于一个具有多个输入的表单,所有这些都需要被监视?
@EricBurel 我知道这很旧,但答案是否定的。您无法查看所有字段绑定到的整个数据对象,您需要单独查看该对象的每个属性,这使得这种方法对于具有大量字段的表单上的大记录存在问题。
@EricBurel 实际上,您可以观看将“深”属性设置为“真”的嵌套对象 --> vuejs.org/v2/api/#watch
p
pherris

发生这种情况是因为您的 click 处理程序在单选按钮的值更改之前触发。您需要改为监听 change 事件:

<input 
  type="radio" 
  name="optionsRadios" 
  id="optionsRadios2" 
  value=""
  v-model="srStatus" 
  v-on:change="foo"> //here

另外,请确保您真的想在准备好时调用 foo()... 似乎您实际上并不想这样做。

ready:function(){
    foo();
},

您将如何处理滑块?
文档中列出的可用事件在哪里。我找不到?
这些只是您可以在此处找到的标准 JavaScript 事件:developer.mozilla.org/en-US/docs/Web/Events#Standard_events
谢谢!但是 Ready:function 对我不起作用。相反,方法:{ foo(){//do something} }
另请注意,如果您想在自定义 vue 组件(单文件组件)上注册“v-on:change”事件,则应使用“v-on:input”。
a
adadion

您应该使用 @input

<input @input="handleInput" />

@input 在用户更改输入值时触发。

@change 在用户更改值和取消焦点输入时触发(例如单击外部某处)

您可以在这里看到不同之处:https://jsfiddle.net/posva/oqe9e8pb/


t
tony19

Vue2: 如果您只想检测输入模糊的变化(例如,按下回车键或单击其他位置后),请执行(更多信息 here

<input @change="foo" v-model... >

如果您想检测单个字符的更改(在用户输入期间),请使用

<input @keydown="foo" v-model... >

您还可以使用 @keyup@input 事件。如果您想传递额外的参数,请在模板中使用,例如 @keyDown="foo($event, param1, param2)"。下面的比较(可编辑版本 here

new Vue({ el: "#app", data: { keyDown: { key:null, val: null, model: null, modelCopy: null }, keyUp: { key:null, val: null, model: null, modelCopy : null }, change: { val: null, model: null, modelCopy: null }, input: { val: null, model: null, modelCopy: null }, }, methods: { keyDownFun: function(event){ //事件类型:KeyboardEvent console.log(event); this.keyDown.key = event.key; // 或 event.keyCode this.keyDown.val = event.target.value; // html 当前输入值 this.keyDown. modelCopy = this.keyDown.model; // 事件处理时模型值的副本 }, keyUpFun: function(event){ // 事件类型:KeyboardEvent console.log(event); this.keyUp.key = event .key; // 或 event.keyCode this.keyUp.val = event.target.value; // html 当前输入值 this.keyUp.modelCopy = this.keyUp.model; // 事件发生时模型值的拷贝processing }, changeFun: function(event) { // 事件类型:事件 console.log(event); this.change.val = event.target.value; // html 当前输入价值 this.change.modelCopy = this.change.model; // 事件处理时模型值的副本 }, inputFun: function(event) { // 事件类型:事件 console.log(event); this.input.val = event.target.value; // html 当前输入值 this.input.modelCopy = this.input.model; // 事件处理时模型值的副本 } } }) div { margin-top: 20px; } 在下方输入字段(查看事件详情打开浏览器控制台)


@keyDown(注意:model 不同于 value 和 modelCopy)
键:{{keyDown.key}}
值:{{ keyDown.val }}
modelCopy:{{keyDown.modelCopy}}
模型:{{keyDown.model}}

@keyUp(注意:事件发生前的模型改变值)
key:{{keyUp. key}}
值:{{ keyUp.val }}
modelCopy:{{keyUp.modelCopy}}
模型:{{keyUp.model}}

@change(发生在输入键或焦点更改(选项卡,鼠标外点击)等)
值:{{更改.val }}
modelCopy: {{change.modelCopy}}
model: {{change.model}}

@input
值: {{ input.val }}
modelCopy: {{input.modelCopy}}
model: {{input.model}}


按下“退格键”后,keyDown 不起作用。所以最好使用@input
在这个小提琴中,我们看到退格与 @keyDown jsfiddle.net/rLzm0f1q 一起使用(但我并没有说 @input 是好是坏)
M
Matthew

只是为了添加上面的正确答案,在 Vue.JS v1.0 中,您可以编写

<a v-on:click="doSomething">

所以在这个例子中它将是

 v-on:change="foo"

请参阅:http://v1.vuejs.org/guide/syntax.html#Arguments