【问题标题】:React doesn't display all of my array from stateReact 不会从状态显示我的所有数组
【发布时间】:2020-07-26 11:50:17
【问题描述】:

我正在尝试构建一个用于个人目的的新闻阅读器(并练习我所学的内容),但我的文章列表有问题,我从 NewsApi 和 Reddit 头版获取。我没有 API,因为我认为创建一个只是为了获取文章是没有用的,而且我没有存储它们,所以它都在我的 React 应用程序中。

代码如下:

componentDidMount() {
let posts = [];

fetch(`https://www.reddit.com/r/all.json`)
.then(resp => resp.json())
.then(redditAllPosts => {
  redditAllPosts.data.children.map((redditSinglePost) => {
    const { author, title, subreddit, permalink, created_utc } = redditSinglePost.data;
    let redditPost = {
      'sourcePost': 'Reddit',
      'date': created_utc,
      'title': title,
      'author': author,
      'url': `https://www.reddit.com${permalink}`,
      'subredditUrl': `https://www.reddit.com/r/${subreddit}`,
    };
    posts.push(redditPost);
  })
})

fetch(`https://newsapi.org/v2/top-headlines?country=us&apiKey=${process.env.REACT_APP_API_KEY}`)
.then(resp => resp.json())
.then(newsApiPosts => {
  newsApiPosts.articles.map((newsApiSinglePost) => {
    const dateNewsApiPost = moment(newsApiSinglePost.publishedAt).unix();
    const { author, title, url } = newsApiSinglePost;
    let newsApiPost = {
      'sourcePost': 'NewsApi',
      'date': dateNewsApiPost,
      'title': title,
      'author': author,
      'url': url,
      'sourceNews': newsApiSinglePost.source.name
    };
    posts.push(newsApiPost);
  })
  return posts;
})
.then(posts => {
  this.setState({posts})
})
}

constructor() {
 super()
 this.state = {
   posts: null,
   filtersTheme: null, ( will be implemented later )
   filtersCountry: null ( will be implemented later )
 }
}

因此,基本上,一旦安装了应用程序,它就会从 Reddit 获取帖子,映射获取的内容并将按我的方式格式化的文章推送到帖子数组,它对 NewsAPI 帖子也是如此。完成此操作后,程序将设置状态,我尝试在每一步中记录几乎所有内容。它记录了包含 20 个 NewsAPI 帖子和 45 个 Reddit 帖子的完整数组,但它只显示数组的前 20 个帖子。日志的包裹线是这样的:

(20) [{…}、{…}、{…}、{…}、{…}、{…}、{…}、{…}、{…}、{…}、{…} , {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]

那是从哪里来的?

【问题讨论】:

    标签: javascript arrays reactjs components state


    【解决方案1】:

    改用这个:

    this.setState(prevState => ({ posts: [...prevState.posts, ...posts] })
    

    这样你只添加到状态中的帖子,而不是覆盖它们。

    【讨论】:

    • 所以你的意思是我应该在帖子出现时添加它们?这不会在每次添加时都会引发重新渲染吗?
    • 是的。为了解决这个问题,您可能必须在状态中跟踪已收到哪些响应,并使用它来等待呈现。
    • 哇,我真的迷失了所有这些 prevState 语法,我会调查一下,非常感谢您的回答!另外,如何跟踪已获取哪些文章,以及如何在触发渲染之前等待?如果没有真正给我代码,那是我的问题哈哈,但只是一个跟踪,我完全迷失了,与我迄今为止在 React 中所做的相比,它正在变得更先进!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2021-03-17
    • 1970-01-01
    相关资源
    最近更新 更多