reactjs - 将过滤后的对象从父组件异步传递给子组件
问题描述
在下面的代码片段中,我遇到了以下问题。
console.log(uniques)
正在正确返回所有过滤后的事件,所以接下来我要让return
uniques
它们在我的父组件中可用。
但是,当尝试访问events
我的父组件中的 时,它们会返回undefined
. 所以console.log(eventsFiltered)
在父是undefined
。我的猜测是在我的子组件中我应该return
uniques
以更多asynchronous
方式?但我不知道如何正确编写它。
如果有人可以调查它,我将非常感激
// Childcomponent
export const filterDateRange = async (dateRange) => {
const startDate = new Date(dateRange.startDate).getTime()
const endDate = new Date(dateRange.endDate).getTime()
let newArray = []
return axios
.get(`fetchAllEventsHere`)
.then((res) => {
res.data.events.map((item) => {
item.dates.map((date) => {
const evtDate = new Date(date).getTime()
if (evtDate >= startDate && evtDate <= endDate) {
newArray.push(item)
let uniques = [...new Set(newArray)]
console.log(uniques) // This returns the event objects as expected
return uniques
}
})
})
})
.catch((err) => {
return err
})
}
// Parentcomponent
useEffect(async () => {
if (dateRange?.startDate && dateRange?.endDate) {
const eventsFiltered = await filterDateRange(dateRange)
console.log(eventsFiltered) // trying to access the events here results in undefined
setEventsFiltered(eventsFiltered)
}
}, [dateRange])
提前致谢 !
解决方案
您不能将 useEffect 的回调函数设置为异步,因为这不起作用。尝试定义另一个异步函数并调用 api,然后在 useEffect 中调用该函数。
编辑:
你这样做了——
useEffect(async () => {
if (dateRange?.startDate && dateRange?.endDate) {
const eventsFiltered = await filterDateRange(dateRange)
console.log(eventsFiltered) // trying to access the events here results in undefined
setEventsFiltered(eventsFiltered)
}
}, [dateRange])
相当 -
useEffect(() => {
(async ()=> await apiCall())()
}, [dateRange])
const apiCall = async () {
if (dateRange?.startDate && dateRange?.endDate) {
const eventsFiltered = await filterDateRange(dateRange)
console.log(eventsFiltered) // trying to access the events here results in undefined
setEventsFiltered(eventsFiltered)
}
}
编辑(2):
您可以在地图外声明 uniques 变量,也可以在地图外将其返回。
export const filterDateRange = async (dateRange) => {
const startDate = new Date(dateRange.startDate).getTime()
const endDate = new Date(dateRange.endDate).getTime()
let newArray = []
return axios
.get(`fetchAllEventsHere`)
.then((res) => {
let uniques; // declare here
res.data.events.map((item) => {
item.dates.map((date) => {
const evtDate = new Date(date).getTime()
if (evtDate >= startDate && evtDate <= endDate) {
newArray.push(item)
uniques = [...new Set(newArray)]
console.log(uniques) // This returns the event objects as expected
}
})
})
return uniques; // return here
})
.catch((err) => {
return err
})
}
// Parentcomponent
useEffect(() => {
(async ()=> await apiCall())()
}, [dateRange])
const apiCall = async () {
if (dateRange?.startDate && dateRange?.endDate) {
const eventsFiltered = await filterDateRange(dateRange)
console.log(eventsFiltered) // trying to access the events here results in undefined
setEventsFiltered(eventsFiltered)
}
}
推荐阅读
- php - 函数爆炸不适用于“+”字符
- java - 嵌套异常是 java.lang.VerifyError: Bad return type + getProfiler()Lcom/orientechnologies/common/profiler/OProfiler;@4: 转
- angular - 虚拟列表中的反应式表单行为不稳定
- android-gradle-plugin - 为什么 Android Studio 不运行 gradle?
- android - 谷歌地图 - 膨胀 SupportMapFragment 时出错
- java - 为什么仅通过更改 ConcurrentHashMap 中的键值来输出差异
- uml - 混淆的内部和外部用例图
- ios - 通过应用程序注册 Azure B2C Facebook
- java - 为什么我不能使用 SQLITE 在我的数据库中插入新数据?
- php - error octobercms:头像必须是图片