javascript - 推送到数组是返回索引而不是项目(React)
问题描述
我正在尝试将一个新对象添加到我通过 API 动态获取的数组的末尾。用户填写表单,以便将数据从表单传递到状态。
最初的第一次获取是将原始数组存储到一些反应状态,这很好,然后在某个时候,应该将一个对象添加到原始数组的末尾,所以整个数组将包含原始数据,加上新对象添加。
自然,我正在尝试使用 array.push() 来尝试实现这一目标,但我一直在获取索引而不是数据对象。
// declare state will be an array
const [originalPages, setOriginalPages] = useState([]);
// Get all the existing data
loadInitialValues() {
return fetch(`example.com/api/collections/get/testing_features?token=${process.env.REACT_APP_API_KEY}`)
.then((res) => {
return res.json();
})
.then((res)=>{
// set state to be the whole array for this post
setOriginalPages(res.entries[4].pagebuild);
return res.entries[4].pagebuild[0].settings;
})
.catch((err)=>{
console.error(err);
})
}
此时数据一切正常,从表单中收集新数据也正常。但是,此时数据会被回发以更新 API,但只返回一个数字:
onSubmit(formData) {
// Dynamically hook all the newly collected form data to this new data object
let theData = {
component: 'page',
settings: {
title: formData.title,
pageOptions: {
pageSideImg: formData.pageOptions.pageSideImg,
isReversed: formData.pageOptions.isReversed,
paraGap: formData.pageOptions.paraGap,
paraFont: formData.pageOptions.paraFont,
},
pageNavigation: {
pageSlug: formData.pageNavigation.pageSlug,
nextPage: formData.pageNavigation.nextPage,
prevPage: formData.pageNavigation.prevPage,
},
globalOptions: {
projectName: formData.globalOptions.projectName,
transType: formData.globalOptions.transType,
menuTrans: formData.globalOptions.menuTrans,
},
blocks: formData.blocks
}
};
cms.alerts.info('Saving Content...');
return fetch(`example.com/api/collections/save/testing_features?token=${process.env.REACT_APP_API_KEY}`, {
method: 'post',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
data: {
// Only returning the array count as a number
pagebuild: originalPages.push(theData),
_id: "610963c235316625d1000023"
}
})
})
.then(response => response.json())
.catch((err) => {
cms.alerts.error('Error Saving Content');
console.log(err);
});
},
如果有人对为什么会发生这种情况有任何想法,我将不胜感激!
作为参考,我在这里检查过,也许我应该使用 spread 代替?
解决方案
Array.push
不会返回您需要的最终数组,而是返回修改后数组的最终长度(这就是您认为它是索引的原因)。
用这个替换这个字符串pagebuild: originalPages.push(theData),
:
pagebuild: [...originalPages, theData],
当然,如果您想更新内部originalPages
状态值,请在您的onSubmit()
:
setOriginalPages(x => [...x, theData]);
推荐阅读
- python - RuntimeError: imageio.ffmpeg.download() 已被弃用。请改用“pip install imageio-ffmpeg”。
- xamarin - 如何通过指定类来构建 xamarin 应用程序
- javascript - 使用 redux-saga 进行轮询
- spring-boot - PageImpl 反序列化期间出错:无法构造 `org.springframework.data.domain.PageImpl` 的实例
- python - 如何中断函数并从循环中返回最后一个值。返回值为无
- javascript - JS - 查找字符串的所有实例并包装在锚标记中
- excel - 编辑代码有问题(召回错误的工作表)-错误(运行时错误'1004')无效参数
- javascript - 在 Docker 容器中找不到 npm(但仅在通过 child_process 执行时)
- r - 整理来自 IMF 的数据,尝试制作动画线图以供练习
- angular - 套接字为单个请求创建多个数据