我是Vue的新手,我想通过使用firebase构建一个简单的CRUD应用程序来学习Veux。到目前为止,我已经能够解决问题(尽管如果你看到一些编码错误,我会很感激任何反馈),但我似乎无法弄清楚如何删除一个项目。主要问题是我无法正确引用它。我在我的参考路径中获得了[object Object]
,但是当我记录它时,我得到了正确的ID。
Firebase Flow:
因此,我引用了'items'
,Firebase为每个项目生成了一个唯一的密钥,我添加了一个id以便能够引用它,尽管我也可以通过密钥引用它。
我已经能够在不使用Veux和组件状态的情况下做到这一点,但我已经尝试了几个小时来弄清楚我做错了什么。
我也收到了这个错误:
Store.js
import Vue from 'vue'
import Vuex from 'vuex'
import database from './firebase'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
items: []
},
mutations: {
RENDER_ITEMS(state) {
database.ref('items').on('value', snapshot => {
state.items = snapshot.val()
})
},
ADD_ITEM(state, payload) {
state.items = payload
database.ref('items').push(payload)
},
REMOVE_ITEM(index, id) {
database.ref(`items/${index}/${id}`).remove()
}
},
// actions: {
// }
})
Main.vue
<template>
<div class="hello">
<input type="text" placeholder="name" v-model="name">
<input type="text" placeholder="age" v-model="age">
<input type="text" placeholder="status" v-model="status">
<input type="submit" @click="addItem" />
<ul>
<li v-for="(item, index) in items" :key="index">
{{ item.name }}
{{ item.age }}
{{ item.status }}
<button @click="remove(index, item.id)">Remove</button>
</li>
</ul>
</div>
</template>
<script>
import { mapState, mapMutations } from 'vuex'
import uuid from 'uuid'
export default {
name: 'HelloWorld',
created() {
this.RENDER_ITEMS(this.items)
},
data() {
return {
name: '',
age: '',
status: '',
id: uuid(),
}
},
computed: {
...mapState([
'items'
])
},
methods: {
...mapMutations([
'RENDER_ITEMS',
'ADD_ITEM',
'REMOVE_ITEM'
]),
addItem() {
const item = {
name: this.name,
age: this.age,
status: this.status,
id: this.id
}
this.ADD_ITEM(item)
this.name = ''
this.age = ''
this.status = ''
},
remove(index, id) {
console.log(index, id)
this.REMOVE_ITEM(index, id)
}
}
}
</script>
答案 0 :(得分:2)
突变的第一个参数始终是状态。
在您的初始代码中:
REMOVE_ITEM(index, id) {
database.ref(`items/${index}/${id}`).remove()
}
index
是状态对象,这就是您在网址中获取[object Object]
的原因。
要解决您的问题,请将对象传递给您的突变并将其更改为:
REMOVE_ITEM(state, {index, id}) {
database.ref(`items/${index}/${id}`).remove()
}
当你用remove方法调用你的变异时,也传递一个对象:
remove(index, id) {
console.log(index, id)
// pass an object as argument
// Note: {index, id} is equivalent to {index: index, id: id}
this.REMOVE_ITEM({index, id})
}