Vue.js 从数组中删除对象无效
Vue.js removing objects from array not working
我有一个 Vue.js 项目,我试图通过单击 CheckList.vue 文件中的删除按钮从项目数组中删除对象,但出现以下错误:属性 或方法“remove”未在实例上定义,但在渲染期间被引用。通过初始化 属性,确保此 属性 是反应性的,无论是在数据选项中,还是对于基于 class 的组件。有人可以帮忙吗?
Example.vue
<template>
<div>
<input type="text" v-model="message" @keyup.enter="add">
<button @click="add">Add Item</button>
<CheckList :items="items" all="all" title="All Items"></CheckList> <!-- v-bind -->
<CheckList :items="doneItems" title="Done Items"></CheckList>
<CheckList :items="notDoneItems" title="Not Done Items"></CheckList>
</div>
</template>
<script>
import CheckList from "./CheckList";
export default {
name: "Example",
components: {CheckList},
data() {
return {
message: '',
items: [
{name:'Apple', done: true, key: 0},
{name:'Orange', done: false, key: 1},
{name:'Grapes', done: true, key: 2},
],
}
},
methods: {
add(){
if(this.message !== '') {
this.items.push({
name: this.message,
done: false,
key: this.items.length
});
this.message = '';
}
},
remove(index){
this.events.splice(index, 1);
}
},
computed: {
doneItems(){
return this.items.filter(item => item.done);
},
notDoneItems(){
return this.items.filter(item => !item.done);
}
}
}
</script>
<style scoped>
</style>
CheckList.vue
<template>
<div>
<h3>{{ title }}</h3>
<ul>
<li v-for="(item,key) in items" :key="item.key">
<input type="checkbox" v-model="item.done">
{{item.name}}
<button v-if="all" v-on:click="remove(key)" class="button1">remove</button>
</li>
</ul>
</div>
</template>
<script>
export default {
name: "CheckList",
props: ['items', 'title', 'all']
}
</script>
<style scoped>
.button1{
margin-left:10px;
}
</style>
像下面的片段一样尝试:
Vue.component('check-list', {
template: `
<div>
<h3>{{ title }}</h3>
<ul>
<li v-for="(item,key) in items" :key="item.key">
<input type="checkbox" v-model="item.done">
{{item.name}}
<button v-if="all" v-on:click="$emit('remove',key)" class="button1">remove</button>
</li>
</ul>
</div>
`,
props: ['items', 'title', 'all'],
methods: {
remove() {
$emit('remove', 'key')
}
}
})
new Vue({
el: '#demo',
data: {
message: '',
items: [
{name:'Apple', done: true, key: 0},
{name:'Orange', done: false, key: 1},
{name:'Grapes', done: true, key: 2},
],
},
computed: {
doneItems(){
return this.items.filter(item => item.done);
},
notDoneItems(){
return this.items.filter(item => !item.done);
}
},
methods: {
add(){
if(this.message !== '') {
this.items.push({
name: this.message,
done: false,
key: this.items.length + 1
});
this.message = '';
}
},
remove(index){
this.items.splice(index, 1);
}
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="demo">
<div>
<input type="text" v-model="message" @keyup.enter="add">
<button @click="add">Add Item</button>
<check-list :items="items" all="all" title="All Items" @remove="remove" />
</div>
</div>
我有一个 Vue.js 项目,我试图通过单击 CheckList.vue 文件中的删除按钮从项目数组中删除对象,但出现以下错误:属性 或方法“remove”未在实例上定义,但在渲染期间被引用。通过初始化 属性,确保此 属性 是反应性的,无论是在数据选项中,还是对于基于 class 的组件。有人可以帮忙吗?
Example.vue
<template>
<div>
<input type="text" v-model="message" @keyup.enter="add">
<button @click="add">Add Item</button>
<CheckList :items="items" all="all" title="All Items"></CheckList> <!-- v-bind -->
<CheckList :items="doneItems" title="Done Items"></CheckList>
<CheckList :items="notDoneItems" title="Not Done Items"></CheckList>
</div>
</template>
<script>
import CheckList from "./CheckList";
export default {
name: "Example",
components: {CheckList},
data() {
return {
message: '',
items: [
{name:'Apple', done: true, key: 0},
{name:'Orange', done: false, key: 1},
{name:'Grapes', done: true, key: 2},
],
}
},
methods: {
add(){
if(this.message !== '') {
this.items.push({
name: this.message,
done: false,
key: this.items.length
});
this.message = '';
}
},
remove(index){
this.events.splice(index, 1);
}
},
computed: {
doneItems(){
return this.items.filter(item => item.done);
},
notDoneItems(){
return this.items.filter(item => !item.done);
}
}
}
</script>
<style scoped>
</style>
CheckList.vue
<template>
<div>
<h3>{{ title }}</h3>
<ul>
<li v-for="(item,key) in items" :key="item.key">
<input type="checkbox" v-model="item.done">
{{item.name}}
<button v-if="all" v-on:click="remove(key)" class="button1">remove</button>
</li>
</ul>
</div>
</template>
<script>
export default {
name: "CheckList",
props: ['items', 'title', 'all']
}
</script>
<style scoped>
.button1{
margin-left:10px;
}
</style>
像下面的片段一样尝试:
Vue.component('check-list', {
template: `
<div>
<h3>{{ title }}</h3>
<ul>
<li v-for="(item,key) in items" :key="item.key">
<input type="checkbox" v-model="item.done">
{{item.name}}
<button v-if="all" v-on:click="$emit('remove',key)" class="button1">remove</button>
</li>
</ul>
</div>
`,
props: ['items', 'title', 'all'],
methods: {
remove() {
$emit('remove', 'key')
}
}
})
new Vue({
el: '#demo',
data: {
message: '',
items: [
{name:'Apple', done: true, key: 0},
{name:'Orange', done: false, key: 1},
{name:'Grapes', done: true, key: 2},
],
},
computed: {
doneItems(){
return this.items.filter(item => item.done);
},
notDoneItems(){
return this.items.filter(item => !item.done);
}
},
methods: {
add(){
if(this.message !== '') {
this.items.push({
name: this.message,
done: false,
key: this.items.length + 1
});
this.message = '';
}
},
remove(index){
this.items.splice(index, 1);
}
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="demo">
<div>
<input type="text" v-model="message" @keyup.enter="add">
<button @click="add">Add Item</button>
<check-list :items="items" all="all" title="All Items" @remove="remove" />
</div>
</div>