【问题标题】:How to update state without refreshing page in reactjsreactjs中如何在不刷新页面的情况下更新状态
【发布时间】:2020-04-20 16:33:10
【问题描述】:

如果后端有任何更改作为 Facebook 中的通知,我想更新我的仪表板。

我有两页:

  • 用户发送请求消息的页面
  • 用户个人资料页面,用户可以在其中查看所有请求消息

如果有新的请求消息,用户需要刷新用户配置文件才能看到新消息。我希望在不刷新页面的情况下显示新消息。这是我的代码:

在消息页面中

state = {

    team: {
      message: 'Hi! I would like to join in your team! Please accept my request',
      invitation_message: 'Hi! I would like to invite you to join in my team.',
      email: '',
    },

  }
  // Invite user to a team
  handleInvite = event => {
    event.preventDefault();
    const userObject = JSON.parse(localStorage.getItem('user'));
    const jwt = userObject.jwt;
    const config = {
      headers: { 'Authorization': `bearer ${jwt}` },
    };     
    api
      .post('/teammembers', {
        team: this.state.teaminfo,
        profile: responseData.data[0],
        status: "invited",
        message: this.state.team.invitation_message,
      }, config)
      .then(response => {
        this.setState({
          success_message: true,
        })
        console.log('Success', response);
      })
      .catch(err => {
        console.log('An error occurred:', err);
      });

  }


在用户个人资料页面中

export class UserProfile extends React.Component {
import socketIOClient from "socket.io-client";

state = {

    invited_teams:[],
    endpoint: "myurl"

  }
 componentDidMount() {
 const { endpoint } = this.state;
    //Very simply connect to the socket
    const socket = socketIOClient(endpoint);
    socket.on('request', (data) => {
      this.setState({ state: data.requests });
    });
    if (localStorage.getItem('userData')) {
      const userObject = JSON.parse(localStorage.getItem('user'));
      api
        .get(`/profiles/?user=${userObject.user.id}`)
        .then(responseData => {
          this.setState({
            invited_teams: responseData.data
          })
        }
    }      
}

谁能帮我解决这个问题?

【问题讨论】:

  • TLDR,“shouldComponentUpdate”可以用吗?
  • 低级解决方案:您可以安排一个作业(或 setInterval)每隔一定时间(例如每 5 分钟)获取一次请求,并更新您的请求列表的状态。和更高的解决方案,我认为你应该研究长轮询技术。

标签: javascript reactjs


【解决方案1】:

使用 socket.IO 库。您可以在新请求上设置监听器,然后更新状态。

socket.on('request' , (data) => {
  this.setState({state: data.requests});
});

【讨论】:

  • 我需要在后端设置一个socket.io吗???我将 socket.io 添加到我的前端代码中,我遇到了一个 cors 问题。你能检查我的代码吗?我不确定我的代码是否正确。谢谢
  • 是的,你也需要在后端实现它。查看 socket.io 站点,它有一个非常好的文档并且易于实现实时网络应用程序。您是使用开发服务器进行 React 还是将构建的 html+s 页面用作静态页面? @凯文
  • 我在前端使用 ReactJS。页面应该是动态的。好的,我会和我的队友一起调查这件事。非常感谢您的帮助:)
  • 如果您不需要在后端保存请求,您应该从 parent 传递 down 方法,您可以在其中更新父状态并传递两个页面的父状态。我不确定你是否明白我在说什么:D。问有什么不清楚的。 @凯文
猜你喜欢
  • 2011-06-15
  • 2021-08-20
  • 2019-03-02
  • 2017-03-24
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 2019-11-25
  • 2017-12-21
相关资源
最近更新 更多