【问题标题】:Issue with accessing previous data being stored in React component state访问存储在 React 组件状态中的先前数据的问题
【发布时间】: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


【解决方案1】:

我认为问题在于您如何将初始数据提供给 useReducer


const MyComponent = () => {

    const [state, dispatch] = useReducer(gifReducer, initialState);

}

在 initialState 变量中,您需要为您的状态提供默认值。

const initialState = {
    gifs: [],
    loading: false
}

这样当你渲染 gif 时,就不会出现未定义的错误。

同样在您的gifReducer 函数中,您也可以提供默认值。

我认为这应该可以解决错误。或者,请粘贴您的 JSXreducer 函数的完整代码。

【讨论】:

  • 您好,首先感谢您的回答!我只是尝试在减速器内部使用初始状态变量,但它没有改变任何东西。在我的 RandomGIF 组件中,我使用从 reducer 返回的数据作为 const { loading, error, data: gifs } = useInfiniteScroll(url)。由于字符限制,我无法将所有代码都放入评论中,但如果您有时间看,我已经用完整的 JSX 发表了一篇新帖子:stackoverflow.com/questions/63957743/…
猜你喜欢
  • 2019-03-20
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 2016-11-14
  • 2017-12-05
  • 2017-07-11
  • 2021-05-04
  • 2018-09-25
相关资源
最近更新 更多