【发布时间】:2020-11-14 07:18:14
【问题描述】:
我目前正在构建一个使用来自 Contentful API 的数据的 Vue 应用程序。对于每个条目,我都有一个 thumbnail(图像)字段,我想从中提取突出的颜色作为十六进制值,并将它们存储在状态中以便在应用程序的其他地方使用。
使用 Vuex 操作 (getAllProjects) 查询 API,运行 Vibrant (node-vibrant) 并将响应提交到状态。
async getAllProjects({ commit }) {
let {
fields: { order: order }
} = await api.getEntry("entry");
let projects = order;
projects.forEach(p =>
Vibrant.from(`https:${p.fields.thumbnail.fields.file.url}`)
.getPalette()
.then(palette => (p.fields.accent = palette.Vibrant.hex))
);
console.log(projects);
// Commit to state
commit("setAllProjects", projects);
}
当我在调用commmit 之前记录projects 的内容时,我可以看到在accent 键下添加了 之后的十六进制值。但是,当我在 devtools 中检查突变有效负载时,accent 键丢失了,因此不会处于该状态。
我如何构建这些任务,以便commit 仅在 API 调用和 Vibrant 依次运行之后触发?
【问题讨论】:
-
你确定在项目中发现了口音吗? forEach() 方法不会改变它开始操作的数组。
-
@crosen9999 API 响应中不存在
accent键,我正在尝试添加该键并将其值分配为Vibrant.getPalette()的输出,然后提交修改后的数组(包括原始响应值加上新的accent键)到状态。 编辑:accent字段不是内容模型的一部分,所以当我说密钥不是 API 响应的一部分时,这种行为是预期的。 -
我的意思是代码似乎不会将属性添加到项目中,因为 forEach 不会修改项目;它修改每个元素的副本。请在下面尝试我的答案,看看是否有效。
-
我不太了解 Vibrant,对我来说这似乎是循环回调的时间问题,据我所知,您可以选择使用 Promise。在这种情况下,有很多选择,但要测试它,您可以在每个 .then() 调用中提交,并用新数据覆盖直到结束(这太可怕了)但如果它有效,我们可以找到一个好的解决方案等待进程。
标签: javascript vue.js vuex contentful