前端监听websocket消息并实时弹出(实例代码)
导读:收集整理的这篇文章主要介绍了前端监听websocket消息并实时弹出(实例代码 ,觉得挺不错的,现在分享给大家,也给大家做个参考。 本文默认您已掌握react生态开发的相关技术,并熟练应用umiJS的原则上,请继续!项目需求:1、...
收集整理的这篇文章主要介绍了前端监听websocket消息并实时弹出(实例代码),觉得挺不错的,现在分享给大家,也给大家做个参考。 本文默认您已掌握react生态开发的相关技术,并熟练应用umiJS的原则上,请继续!
项目需求:
1、服务侧推送给消息给前端,前端需要展示在右下角
2、根据不同的消息类型,提供不同的操作按钮‘同意’、‘拒绝’等
代码设计:
1、使用websocket方式建立通道
2、前端基于umi+antd+reconnecting-websocket.js开发
3、使用exPress+exPRess-ws+mockjs建立websocket服务通道,模拟服务端推送消息
运行效果:
使用方法:
1、项目中已引入reconnecting-websocket.min.js,详见其官方文档
2、登录成功后,接着调用websocket初始化:
yield put({
tyPE: 'websocket/inIT', payload: {
authToken }
}
);
核心代码:
1、/service/websocket.js
/** * 基于reconnecting-websocket库已引入 * 封装service文件 */class Websocket{
/** * websocket逻辑 * 2021-10-28 */ constructor(){
this.websocket=null;
this.url='ws://127.0.0.1:30001/websocket-im';
this.options={
connectionTimeout: 5000, maxRetries: 10, }
;
}
init=()=>
{
this.websocket = new ReconnectingWebSocket(this.url,[], this.options);
}
close=()=>
{
this.websocket &
&
this.websocket.close();
}
onMessage=(callback)=>
{
this.websocket &
&
this.websocket.addEventListener('message', (e) =>
{
callback&
&
callback(e) }
);
}
}
const websocket = new Websocket();
// 初始化连接export function openWs() {
return websocket.init();
}
// 关闭连接export function closeWs() {
return websocket.close();
}
// 监听websocket消息export function onMessage() {
let deferred;
websocket.onMessage(function(e){
if(deferred) {
deferred.resolve(e) deferred = null }
}
);
return {
message() {
if(!deferred) {
deferred = {
}
deferred.promise = new Promise(resolve =>
deferred.resolve = resolve) }
return deferred.promise;
}
}
}
2、/model/websocket.js
/** * 封装model文件 * moment、immutable、antd、nanoid组件请自行学习 */import {
openWs,onMessage,closeWs}
From 'services/websocket'import moment from 'moment'import {
Map, fromJS }
from 'immutable'import {
notification }
from 'antd'import nanoid from 'nanoid';
const initstate = Map({
message:Map(), //收到的消息 }
);
export default {
namespace: 'websocket', state: initState, subscriptions: {
SETUP({
dispatch, history }
) {
dispatch({
type: 'listener' }
);
return history.listen(({
pathname, query }
) =>
{
}
);
}
, }
, effects: {
* listener({
payload }
, {
take, put, call }
) {
while (true) {
const {
type, payload }
= yield take(['LOGout']);
// 监听退出系统,则关闭websocket if (type === 'logout') {
// 关闭websocket yield call(closeWs);
notification.destroy();
yield put({
type: 'clearAllMessage', payload:{
}
}
);
}
}
}
, // 启动websocket * init ({
payload, }
, {
put, call, select }
) {
yield call(openWs);
const listener = yield call(onMessage);
yield put({
type: 'receiveMsg', payload:{
listener}
}
);
}
, // 接受消息 * receiveMsg ({
payload: {
listener}
}
, {
call, select, put}
) {
while(true){
const event = yield call(listener.message);
yield put({
type: 'progressMsg', payload:{
msg:JSON.parse(event.data) }
}
);
}
}
, // 统筹消息 * progressMsg ({
payload: {
msg}
}
, {
call, select, put}
) {
console.log(msg) yield put({
type: 'addOneMessage', payload:{
msg }
}
);
}
, }
, reducers: {
addOneMessage(state, {
payload:{
msg}
}
) {
const msgId = nanoid()+'-'+moment().format('x');
return state.setIn(['message',msgId], fromJS({
...msg,msgId}
)) }
, removeOneMessage(state, {
payload:{
msgId}
}
) {
return state.deleteIn(['message',msgId]) }
, clearAllMessage(state, {
payload:{
}
}
) {
return state.setIn(['message'],Map()) }
, }
, }
3、Notification组件封装,结构及代码
(1)package.json
{
"name": "Notification", "version": "0.0.0", "private": true, "main": "./index.js"}
(2) index.less
.Notification{
.BTns{
padding: 0;
margin: 15px 0 0 0;
list-style: none;
width: 100%;
display: flex;
justify-content: flex-end;
li{
margin-left: 10px;
}
}
}
(3)index.js
/** * 右下角弹窗组件封装 */import React from 'react'import {
injectIntl }
from 'react-intl';
import moment from 'moment'import {
connect }
from 'dva'import {
notification }
from 'antd';
import Demo1 from './Demo1'import Demo2 from './Demo2' @injectIntl@connect(({
websocket, }
) =>
({
websocket}
))export default class Notification extends React.component {
componentWillReceiveProps(nextProps) {
const {
websocket,dispatch,intl, intl: {
formatMessage }
}
= nextProps;
let message=websocket.get('message');
message.foreach((note)=>
{
let object=note.getIn(['object']);
let msgId=note.getIn(['msgId']);
let title=note.getIn(['title']);
let content=note.getIn(['content']);
let format = 'yyYY-MM-DD HH:mm:ss';
let time=note.getIn(['ts'])?moment(note.getIn(['ts']), 'x').format(format):moment().format(format);
switch (object) {
case 'demo1': content=Demo1 dispatch={
dispatch}
intl={
intl}
note={
note}
onClose={
()=>
this.onClose(msgId)}
/>
;
break;
case 'demo2': content=Demo2 dispatch={
dispatch}
intl={
intl}
note={
note}
onClose={
()=>
this.onClose(msgId)}
/>
;
break;
default: break;
}
notification.open({
message: span>
{
title}
small>
{
time}
/small>
/span>
, duration:30, key: msgId, description:content, placement: 'bottomRight', onClick: () =>
{
}
, onClose: () =>
{
this.onClose(msgId);
}
}
);
}
) }
// 关闭消息 onClose=(msgId)=>
{
const {
dispatch}
= this.props;
dispatch({
type:'websocket/removeOneMessage', payload:{
msgId }
}
) return notification.close(msgId);
}
render(){
return( null ) }
}
Notification.propTypes = {
}
(4)Demo1.js
import React from 'react'import styles from './index.less' export default class NotificationSon extends React.COMponent {
render(){
const {
note,intl:{
formatMessage}
}
= this.props;
let content=note.getIn(['content']);
return( div classname={
styles.Notification}
>
div>
{
content}
/div>
/div>
) }
}
NotificationSon.propTypes = {
}
(5)Demo2.js
import React from 'react'import styles from './index.less'import {
config }
from 'utils'import {
Button }
from 'antd';
const {
defaultstyleSize }
= config;
export default class NotificationSon extends React.Component {
dealApproval=(type,data)=>
{
const {
dispatch,onClose}
= this.props;
if(type=='refuse'){
console.log('拒绝') onClose();
}
else if(type=='agree'){
console.log('同意') onClose();
}
}
render(){
const {
note,intl:{
formatMessage}
}
= this.props;
let content=note.getIn(['content']);
return( div className={
styles.Notification}
>
div>
{
content}
/div>
ul className={
styles.btns}
>
li>
Button style={
{
marginLeft: '12px' }
}
type={
'Primary'}
size={
defaultStyleSize}
onClick={
() =>
{
this.dealApproval('agree',note.get('data'))}
}
>
{
formatMessage({
id: 'Global.agree'}
)}
/Button>
/li>
li>
Button style={
{
marginLeft: '12px' }
}
type={
'danger'}
size={
defaultStyleSize}
onClick={
() =>
{
this.dealApproval('refuse',note.get('data'))}
}
>
{
formatMessage({
id: 'Global.refuse'}
)}
/Button>
/li>
/ul>
/div>
) }
}
NotificationSon.propTypes = {
}
express模拟消息:
到此这篇关于前端监听websocket消息并实时弹出的文章就介绍到这了,更多相关websocket消息监听内容请搜索以前的文章或继续浏览下面的相关文章,希望大家以后多多支持!
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 前端监听websocket消息并实时弹出(实例代码)
本文地址: https://pptw.com/jishu/586355.html
