Vue 父子发出函数正在破坏 v-model 绑定
Vue parent-child emit function is breaking v-model binding
正在修复其他人代码中的错误,因此我试图限制我必须在此处更改的内容。
似乎当我使用 $emit
功能来 运行 子组件和父组件之间的函数时,v-model 绑定在我的组件中丢失了。
有一个父组件:
ParentComponent.vue
<template>
<child-component v-bind:items="this.items"
v-on:event_child="this.eventUpdater">
</child-component>
<template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
'child-component': ChildComponent
},
methods: {
getItemDetails() {
//...ajax request that loads item details for page.
},
eventUpdater: function(id) {
this.getItemDetails();
}
}
}
</script>
然后,还有一个子组件:
ChildComponent.vue
<template>
<div v-for="item in items">
<input v-model="item.itemId">
</div>
<button v-on:click="updateItems">update</button>
</template>
<script>
export default {
props: ['items'],
methods: {
updateItems() {
//...ajax call that updates items.
this.emitWhat();
},
emitWhat: function () {
this.$emit('event_child');
}
}
}
</script>
更新我的初始项目(更新正常)后,我去更新另一个项目,那个项目的 v-model 似乎不起作用。 $emit
功能是否会在初始加载后破坏 v-model 绑定?我该如何解决这个问题?
您正在使用这个:
<child-component v-bind:items="this.items"
v-on:event_child="this.eventUpdater">
但应该使用这个:
<child-component v-bind:items="items"
v-on:event_child="eventUpdater">
已删除 this.
。
我也没有在父组件中找到 items
作为 data
属性。
更新
此外,如果您在 eventUpdater: function(id)
方法中定义 id
参数,您应该 emit
像这样:
<template>
<div v-for="item in items">
<input v-model="item.itemId">
</div>
<button v-on:click="updateItems(item.itemId)">update</button>
</template>
updateItems(id) {
//...ajax call that updates items.
this.emitWhat(id);
},
emitWhat: function (id) {
this.$emit('event_child', id);
}
Upd.2
你在 item.itemId
上还有 v-model,这可能是个问题:
<input v-model="item.itemId">
您可以考虑像这样将 v-model
绑定到 newItems
:
<input v-model="newItems[itemId]">
data(){
return {
newItems: [],
//...
};
}
正在修复其他人代码中的错误,因此我试图限制我必须在此处更改的内容。
似乎当我使用 $emit
功能来 运行 子组件和父组件之间的函数时,v-model 绑定在我的组件中丢失了。
有一个父组件:
ParentComponent.vue
<template>
<child-component v-bind:items="this.items"
v-on:event_child="this.eventUpdater">
</child-component>
<template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
'child-component': ChildComponent
},
methods: {
getItemDetails() {
//...ajax request that loads item details for page.
},
eventUpdater: function(id) {
this.getItemDetails();
}
}
}
</script>
然后,还有一个子组件:
ChildComponent.vue
<template>
<div v-for="item in items">
<input v-model="item.itemId">
</div>
<button v-on:click="updateItems">update</button>
</template>
<script>
export default {
props: ['items'],
methods: {
updateItems() {
//...ajax call that updates items.
this.emitWhat();
},
emitWhat: function () {
this.$emit('event_child');
}
}
}
</script>
更新我的初始项目(更新正常)后,我去更新另一个项目,那个项目的 v-model 似乎不起作用。 $emit
功能是否会在初始加载后破坏 v-model 绑定?我该如何解决这个问题?
您正在使用这个:
<child-component v-bind:items="this.items"
v-on:event_child="this.eventUpdater">
但应该使用这个:
<child-component v-bind:items="items"
v-on:event_child="eventUpdater">
已删除 this.
。
我也没有在父组件中找到 items
作为 data
属性。
更新
此外,如果您在 eventUpdater: function(id)
方法中定义 id
参数,您应该 emit
像这样:
<template>
<div v-for="item in items">
<input v-model="item.itemId">
</div>
<button v-on:click="updateItems(item.itemId)">update</button>
</template>
updateItems(id) {
//...ajax call that updates items.
this.emitWhat(id);
},
emitWhat: function (id) {
this.$emit('event_child', id);
}
Upd.2
你在 item.itemId
上还有 v-model,这可能是个问题:
<input v-model="item.itemId">
您可以考虑像这样将 v-model
绑定到 newItems
:
<input v-model="newItems[itemId]">
data(){
return {
newItems: [],
//...
};
}