当前位置: 首页 > 知识库问答 >
问题:

如何在用户每次打开屏幕时提取数据,并且仅当提取的数据与状态中的当前数据不同时才更新状态

宗政子辰
2023-03-14

我对react、react native和redux比较陌生,我有一个关于从api获取数据和更新状态的问题。

我想做的是:-每次用户打开屏幕(即POST)时,我都想从api获取数据并更新状态。

因此:-我总是在状态中新获取数据并在屏幕上呈现。

如果我只取数据在组件didMount生命周期方法,那么我不会总是有新鲜的数据。

示例:有两个屏幕Post和Post。如果用户第一次打开posts屏幕,则会触发componentDidMount并获取和呈现POST。然后他转到Post屏幕添加一篇新文章,然后返回Posts屏幕,他将看不到该新文章,因为这些文章将从componentDidMount方法中获取的状态显示。

处理此问题并始终拥有最新数据的最佳方法是什么?

class Posts extends Component {
    componentDidMount() {
        this.props.fetchPosts();
    }

    componentDidUpdate(prevProps) {
        this.props.fetchPosts();
    }

    render () { ... }
}

const mapStateToProps = state => {
    return {
        posts: state.posts.posts,
        loading: state.posts.loading,
    }
}

const mapDispatchToProps = dispatch => {
     return {
         fetchPosts: () => dispatch(actions.fetchPosts()),
     }
}

export default connect(mapStateToProps, mapDispatchToProps)(Posts)

行动

export const fetchPosts = () => {
    return dispatch => {

         dispatch(fetchStarted());

         apiFetchPosts()
         .then(({data}) => {

             const posts = data.data;

             dispatch(fetched(posts))
         })
         .catch(error => {
             dispatch(fetchFailed(error));
         })
     }
 }

 const fetchStarted = () => {
      return {
         type: actionTypes.POSTS_FETCH_START,
      }
 }

 const fetched = (posts) => {
      return {
           type: actionTypes.POSTS_FETCH_SUCCESS,
           posts,
      }
 }

 const fetchFailed = (error) => {
     return {
         type: actionTypes.POSTS_FETCH_FAILED,
     }
 }

共有2个答案

訾雅畅
2023-03-14

您可以使用componentdiddupdate

华子航
2023-03-14

在您的情况下,您应该发送一个POST请求以插入新的POST。该请求应将新创建的帖子作为响应。您应该使用该响应来更新处于redux状态的帖子列表。只需将新帖子添加到列表中即可。

删除帖子也是如此,一旦您发送了DELETE请求,您也应该将该帖子从状态中删除。

如果您想在一段时间内未提取帖子时重新提取帖子,则应实施某种缓存解决方案:

当您第一次获取帖子时,还可以存储请求的时间戳。当用户访问Posts页面时,您可以检查时间戳是否太旧,例如过去的5分钟,并相应地重新蚀刻。

如果您想在用户每次访问该页面时简单地重新回帖,可以使用useEffect挂钩或组合使用componentDidMountcomponentDidUpdate

请注意:

您可以在componentDidUpdate()中立即调用setState(),但请注意,必须将其包装在上面示例中的条件中,否则将导致无限循环。来源

 类似资料:
  • 我有一个由以下部分组成的项目: Rest API(带Spring) Web仪表板(使用Rest API管理数据) 客户端(获取数据并使用它) 现在我要问自己的是,如何确保客户机在通过web仪表板更新后立即获取新数据?每隔几秒钟抓取一次似乎不是正确的方法,套接字连接是一个好的解决方案吗? 如果你有任何想法,请告诉我,谢谢。

  • 我正在开发一个web应用程序,使用React跟踪水果供应商的库存。js,MongoDB,Node。js和Express。我调用了数据库endpoint来呈现表中的数据。现在,我尝试使用按钮增加和减少库存量,但当我尝试设置新状态时,它不起作用。我尝试通过单击更改状态,然后更新数据库中的新状态。有什么建议吗? > 可结果成分: 从'react'导入Reac,{Component};从“react bo

  • 问题内容: 我在C#/ Visual Studio 2008中使用MySQL。我需要知道任何方法,以便如果一个用户更新数据库,则通过网络通知所有已登录用户已发生更改。如果我通过我的应用程序登录数据库,那时候数据库中最新记录的序列号是10,然后我有特权的人更新了数据库中的记录,同时我收到通知,数据库已更新为新记录。常见的例子可能是MSN Messenger的一个朋友上线时向他发出警报的提示……虽然我

  • 数据预取存储容器 (Data Store) 在服务器端渲染(SSR)期间,我们本质上是在渲染我们应用程序的"快照",所以如果应用程序依赖于一些异步数据,那么在开始渲染过程之前,需要先预取和解析好这些数据。 另一个需要关注的问题是在客户端,在挂载 (mount) 到客户端应用程序之前,需要获取到与服务器端应用程序完全相同的数据 - 否则,客户端应用程序会因为使用与服务器端应用程序不同的状态,然后导致

  • 问题内容: 我处于状态的对象数组: 我需要能够基于id属性搜索items数组,然后更新对象属性。 我可以使用id参数通过数组或在数组上获取对象。 我遇到的麻烦是更新数组,然后更新状态而不会发生突变。 此时,我有一个匹配的对象,可以使用对象传播来更新它的属性: 我的问题是我该如何更新状态,以使其覆盖初始查找操作返回的对象? 问题答案: 您的更新功能如下所示 你这样使用它 毛吧? 如果您继续以这种方式