VueX 突变优化
VueX Mutation Optimization
我目前正在使用 VueX 商店,我有 1 个突变可以推送到整个数组。目前一切正常,但想知道我是否可以使这段代码更简单、行数更少/同时更优化。
旁注,这些是存储在数组中的对象。
PUSH_TO_ALL: (state, data) => {
const found = state.all.find((one, i) => {
if (one.slug === data.slug) {
state.all[i] = data // modify current state
return true
}
return false
})
if (!found) {
state.all.push(data) // add to the state
}
}
我的第一个想法是,如果你将data
中的slug
与数组中每个对象中的slug
进行比较,它必须是唯一的(否则你将替换[=14中的多个对象=]).
这意味着,如果您将状态的 'root' 转换为数组,而改为使用由 [=12= 索引的对象,则几乎可以肯定会使事情变得更快、更简单].
然后你的代码会变成这样:
PUSH_TO_ALL: (state, data) => {
state.all[data.slug] = data
这有两个优点 - 修改状态更简单、更快速,因为您不需要遍历所有状态来检查对象是否已经存在。其次,不需要单独的代码来区分添加新对象和替换它(如果它已经存在)。
如果出于某种原因您必须将状态存储为数组,我会使用状态的不同部分来维护一个跟踪 slug
到数组索引的对象。那么您的代码将类似于:
PUSH_TO_ALL: (state, data) => {
if (state.map[data.slug]) {
state.all[state.map[data.slug]] = data
} else {
// Push returns length of array - index is len-1
state.map[data.slug] = state.all.push(data) - 1
}
注意 - 在 Vue2 中,您可能需要使用 Vue.set()
来更新嵌套对象,否则代码可能不会对这些更改做出反应。 Vue3 不再有这个限制。
您可以使用Array.findIndex代替Array.find,并将其与三元配对以使琐碎的逻辑更简洁(但不一定更清晰)。
const mutations = {
PUSH_TO_ALL: (state, data) => {
const indexOfMatchingSlug = state.all.findIndex(one => one.slug === data.slug);
state.all[indexOfMatchingSlug] = data ? indexOfMatchingSlug > -1 : state.all.push(data);
}
}
我目前正在使用 VueX 商店,我有 1 个突变可以推送到整个数组。目前一切正常,但想知道我是否可以使这段代码更简单、行数更少/同时更优化。 旁注,这些是存储在数组中的对象。
PUSH_TO_ALL: (state, data) => {
const found = state.all.find((one, i) => {
if (one.slug === data.slug) {
state.all[i] = data // modify current state
return true
}
return false
})
if (!found) {
state.all.push(data) // add to the state
}
}
我的第一个想法是,如果你将data
中的slug
与数组中每个对象中的slug
进行比较,它必须是唯一的(否则你将替换[=14中的多个对象=]).
这意味着,如果您将状态的 'root' 转换为数组,而改为使用由 [=12= 索引的对象,则几乎可以肯定会使事情变得更快、更简单].
然后你的代码会变成这样:
PUSH_TO_ALL: (state, data) => {
state.all[data.slug] = data
这有两个优点 - 修改状态更简单、更快速,因为您不需要遍历所有状态来检查对象是否已经存在。其次,不需要单独的代码来区分添加新对象和替换它(如果它已经存在)。
如果出于某种原因您必须将状态存储为数组,我会使用状态的不同部分来维护一个跟踪 slug
到数组索引的对象。那么您的代码将类似于:
PUSH_TO_ALL: (state, data) => {
if (state.map[data.slug]) {
state.all[state.map[data.slug]] = data
} else {
// Push returns length of array - index is len-1
state.map[data.slug] = state.all.push(data) - 1
}
注意 - 在 Vue2 中,您可能需要使用 Vue.set()
来更新嵌套对象,否则代码可能不会对这些更改做出反应。 Vue3 不再有这个限制。
您可以使用Array.findIndex代替Array.find,并将其与三元配对以使琐碎的逻辑更简洁(但不一定更清晰)。
const mutations = {
PUSH_TO_ALL: (state, data) => {
const indexOfMatchingSlug = state.all.findIndex(one => one.slug === data.slug);
state.all[indexOfMatchingSlug] = data ? indexOfMatchingSlug > -1 : state.all.push(data);
}
}