【发布时间】:2021-01-05 01:28:06
【问题描述】:
我在 ReactJS 中尝试使用 Axios 和 useReducer 钩子实现无限滚动。我从 GIPHY API 接收数据很好,但问题是当我到达视口的底部时,新的 gif 只是替换了最初加载到网页上的那些,而不是为它们创建新的容器。
我知道我的映射方法或设置交叉点观察器以触发获取下一个 gif 请求的方式没有问题。我正在使用 useReducer 来存储以前的状态并将附加的 gif 添加到原始状态。
我不断收到错误“TypeError: undefined is not an object (evalating 'gifs.data.map')” 有鉴于此,我认为我正在改变来自 API 的响应,将其放入一个额外的数组中以存储以前的数据,但没有雪茄。
这是reducer的代码:
else if(action.type === 'success') {
return {
...state,
loading: false,
data: prevData => {
return [...prevData, action.res.data]
}
}
这是我的映射方法:
<div className='infinite-scroll-gifs'>
{gifs.data.map((gif, index) => {
if(gifs.data.length === index + 1) {
return (
<div ref={infiniteScrollTriggerRef} key={gif.id}>
<img src={gif.images.fixed_height.url} alt='Random GIF'></img>
</div>
)
}
}}
GIPHY API 返回的对象的形状如下:
{
"data":
[
{
gifData
},
{
gifData
},
{
gifData
}
]
}
这是我关于 Stack Overflow 的第一个问题,我已经尝试解决了四天,哈哈。如果有人知道我可以做些什么来工作,请告诉我!非常感谢任何帮助。
【问题讨论】:
-
你什么时候收到的?你确定
data甚至gifs被定义了吗? -
是的,如果我不尝试使用数据将以前的帖子与新帖子一起存储,我可以显示数据:prevData => { return [...prevData, action.res.data] }只有当我使用函数状态将以前的数据与新数据一起存储时,我才会收到错误。我最初认为这是因为我通过添加一个额外的数组来改变从 API 返回的对象的形状,但我更改了我的代码以解决这个问题。
-
你能分享更多的代码吗?我们甚至看不到
gifs的来源。或者更好的是,创建一个带有运行示例的codesandbox.io/index2。 -
是的,当然。如果您点击此链接,您可以看到完整的代码。 stackoverflow.com/questions/63957743/…
标签: javascript reactjs pagination axios infinite-scroll