我不确定这是否是提问的正确方法,因为我不是专家。 在.NET中,存在一个称为信号R的信号,您可以在其中将数据从服务器推送到客户端,而客户端不必每隔X秒从服务器提取数据。
我正在开发一个带有通知栏的react应用,该通知栏应该在服务器上的某些内容完成处理后从服务器获取消息。
后端是Web api 2,前端与redux反应。
我的问题是,当服务器发生问题时如何使该组件“刷新”,我只是希望我不必使用setTimeout
import React, { Component } from 'react';
import { Popover } from 'antd';
import { connect } from 'react-redux';
import IntlMessages from '../../components/utility/intlMessages';
import TopbarDropdownWrapper from './topbarDropdown.style';
const demoNotifications = [
{
id: 1,
name: 'David Doe',
notification:
'A National Book Award Finalist An Edgar Award Finalist A California Book Award Gold Medal Winner'
},
{
id: 2,
name: 'Navis Doe',
notification:
'A National Book Award Finalist An Edgar Award Finalist A California Book Award Gold Medal Winner'
},
{
id: 3,
name: 'Emanual Doe',
notification:
'A National Book Award Finalist An Edgar Award Finalist A California Book Award Gold Medal Winner'
},
{
id: 4,
name: 'Dowain Doe',
notification:
'A National Book Award Finalist An Edgar Award Finalist A California Book Award Gold Medal Winner'
}
];
class TopbarNotification extends Component {
constructor(props) {
super(props);
this.handleVisibleChange = this.handleVisibleChange.bind(this);
this.hide = this.hide.bind(this);
this.state = {
visible: false
};
}
hide() {
this.setState({ visible: false });
}
handleVisibleChange() {
this.setState({ visible: !this.state.visible });
}
render() {
const { customizedTheme } = this.props;
const content = (
<TopbarDropdownWrapper className="topbarNotification">
<div className="isoDropdownHeader">
<h3>
<IntlMessages id="sidebar.notification" />
</h3>
</div>
<div className="isoDropdownBody">
{demoNotifications.map(notification => (
<a className="isoDropdownListItem" key={notification.id}>
<h5>{notification.name}</h5>
<p>{notification.notification}</p>
</a>
))}
</div>
<a className="isoViewAllBtn">
<IntlMessages id="topbar.viewAll" />
</a>
</TopbarDropdownWrapper>
);
return (
<Popover
content={content}
trigger="click"
visible={this.state.visible}
onVisibleChange={this.handleVisibleChange}
placement="bottomLeft"
>
<div className="isoIconWrapper">
<i
className="ion-android-notifications"
style={{ color: customizedTheme.textColor }}
/>
<span>{demoNotifications.length}</span>
</div>
</Popover>
);
}
}
export default connect(state => ({
...state.App.toJS(),
customizedTheme: state.ThemeSwitcher.toJS().topbarTheme
}))(TopbarNotification);
答案 0 :(得分:2)
套接字可能是最直接的答案。看看socket.io,它们使您完全可以轻松实现所需的内容。
这里是一个使用套接字https://medium.com/@gethylgeorge/using-socket-io-in-react-redux-app-to-handle-real-time-data-c0e734297795构建Redux反应应用的示例,其中包括一个git repo:https://github.com/Gethyl/RealTimeTodo。他们可能将node.js用于后端,但是socket.io与后端无关。
您只需在组件加载时将存储连接到套接字即可。以下是示例存储库中的相关代码段:https://github.com/Gethyl/RealTimeTodo/blob/f6c19b175977127c4a542882c75b76836b4a5ba4/src/js/components/Layout.js#L41