nedb中添加的记录是单条的,为什么VUE会多次存储同一条记录?
Record added in nedb is single but why VUE store same record multiple times?
我在 Vue 中使用电子。我正在使用 nedb 保存数据。我将事件从 vue 组件发送到 background.js,当它 returns 带有数据时,它会在 fibbonaccicaly 中的 vuex 中添加数据。
喜欢
如果我添加 1 个对象假设 A 然后 vuex 存储 1 个对象
如果我再添加 1 个对象假设 B 那么 vuex 存储总共有 3 个
对象(1 个用于 A,2 个用于 B);等等。
所以我只需要在vuex中插入一次数据。我是怎么做到的?
// 在CreateNewTodo.vue
methods:{
// saveTodo method get triggers when user submit the form in modal
saveTodo() {
if (this.isFormValid) {
const newTodo = {
task: this.task,
priority: this.priority,
eventDate: this.eventDate,
createdDate: new Date(),
completedDate: null,
isCompleted: false,
};
// new Todo is an object that contains data that is requested from user
// from a form like task, priority and eventDate
ipcRenderer.send('createNewTodo', newTodo);
ipcRenderer.on('createNewTodoResponse', (e, newDoc) => {
if (typeof newDoc === 'object') {
this.$store.dispatch('createNewTodo', newDoc);
$('#createNewModal').modal('hide');
} else {
$('#createNewModal').modal('hide');
}
});
}
},
}
// 在background.js
ipcMain.on('createNewTodo', (e, args) => {
// db.performTask is a function that insert document/record in nedb.
// I've used nedb-promises. In return we'll get promise.
const dbpromise = db.performTask('todos', 'insert', args);
// newDoc is the newly inserted document, including its _id
dbpromise.then((newDoc) => {
e.sender.send('createNewTodoResponse', newDoc);
})
.catch(() => {
e.sender.send('createNewTodoResponse', 'error');
});
});
// vuex 存储
const state = {
todos: [],
};
const getters = {
getAllTodos(todosState) {
return todosState.todos;
},
};
const mutations = {
CREATE_NEW_TODO(todosState, todo) {
todosState.todos.push(todo);
},
};
const actions = {
createNewTodo({ commit }, todo) {
commit('CREATE_NEW_TODO', todo);
},
};
每次保存待办事项时,都会为 IPC 回复频道注册一个新的侦听器。听众都保持活跃,每个人都选择并处理每个事件。这不是你想要的,你只想处理每个响应一次,Electron 有一个方法 :) 试试这个:
// register a listener to process the response (once)
ipcRenderer.once('createNewTodoResponse', (e, newDoc) => {
if (typeof newDoc === 'object') {
this.$store.dispatch('createNewTodo', newDoc);
$('#createNewModal').modal('hide');
} else {
$('#createNewModal').modal('hide');
}
});
// send the request
ipcRenderer.send('createNewTodo', newTodo);
我在 Vue 中使用电子。我正在使用 nedb 保存数据。我将事件从 vue 组件发送到 background.js,当它 returns 带有数据时,它会在 fibbonaccicaly 中的 vuex 中添加数据。 喜欢
如果我添加 1 个对象假设 A 然后 vuex 存储 1 个对象
如果我再添加 1 个对象假设 B 那么 vuex 存储总共有 3 个 对象(1 个用于 A,2 个用于 B);等等。
所以我只需要在vuex中插入一次数据。我是怎么做到的?
// 在CreateNewTodo.vue
methods:{
// saveTodo method get triggers when user submit the form in modal
saveTodo() {
if (this.isFormValid) {
const newTodo = {
task: this.task,
priority: this.priority,
eventDate: this.eventDate,
createdDate: new Date(),
completedDate: null,
isCompleted: false,
};
// new Todo is an object that contains data that is requested from user
// from a form like task, priority and eventDate
ipcRenderer.send('createNewTodo', newTodo);
ipcRenderer.on('createNewTodoResponse', (e, newDoc) => {
if (typeof newDoc === 'object') {
this.$store.dispatch('createNewTodo', newDoc);
$('#createNewModal').modal('hide');
} else {
$('#createNewModal').modal('hide');
}
});
}
},
}
// 在background.js
ipcMain.on('createNewTodo', (e, args) => {
// db.performTask is a function that insert document/record in nedb.
// I've used nedb-promises. In return we'll get promise.
const dbpromise = db.performTask('todos', 'insert', args);
// newDoc is the newly inserted document, including its _id
dbpromise.then((newDoc) => {
e.sender.send('createNewTodoResponse', newDoc);
})
.catch(() => {
e.sender.send('createNewTodoResponse', 'error');
});
});
// vuex 存储
const state = {
todos: [],
};
const getters = {
getAllTodos(todosState) {
return todosState.todos;
},
};
const mutations = {
CREATE_NEW_TODO(todosState, todo) {
todosState.todos.push(todo);
},
};
const actions = {
createNewTodo({ commit }, todo) {
commit('CREATE_NEW_TODO', todo);
},
};
每次保存待办事项时,都会为 IPC 回复频道注册一个新的侦听器。听众都保持活跃,每个人都选择并处理每个事件。这不是你想要的,你只想处理每个响应一次,Electron 有一个方法 :) 试试这个:
// register a listener to process the response (once)
ipcRenderer.once('createNewTodoResponse', (e, newDoc) => {
if (typeof newDoc === 'object') {
this.$store.dispatch('createNewTodo', newDoc);
$('#createNewModal').modal('hide');
} else {
$('#createNewModal').modal('hide');
}
});
// send the request
ipcRenderer.send('createNewTodo', newTodo);