通知让用户了解情况并参与其中。自定义 React 通知中心可让您完全控制和定制用户体验。这是从头开始构建一个简明指南,涵盖用于实时更新的前端和后端组件。
前端
后端
Microservice | Functionality |
---|---|
Notification Service | Generates and stores notifications |
Dispatch Service | Sends notifications to different channels |
User Preferences Service | Manages user settings and preferences |
示例:Node.js/Express 中的通知服务
const express = require('express'); const app = express(); let notifications = []; app.post('/notify', (req, res) => { const notification = { id: notifications.length + 1, type: req.body.type, message: req.body.message, userId: req.body.userId, status: 'unread', timestamp: new Date() }; notifications.push(notification); res.status(200).send(notification); }); app.listen(3000, () => { console.log('Notification Service running on port 3000'); });
示例:带有 Socket.IO 的 WebSocket 服务器
const io = require('socket.io')(3001); io.on('connection', (socket) => { console.log('User connected:', socket.id); socket.emit('notification', { message: 'New notification!', timestamp: new Date() }); socket.on('disconnect', () => { console.log('User disconnected:', socket.id); }); });
React 中的客户端集成
import React, { useEffect, useState } from 'react'; import io from 'socket.io-client'; const socket = io('http://localhost:3001'); function NotificationCenter() { const [notifications, setNotifications] = useState([]); useEffect(() => { socket.on('notification', (notification) => { setNotifications(prev => [...prev, notification]); }); }, []); return ( <div> <h2>Notification Center</h2> {notifications.map((notif, index) => ( <div key={index}>{notif.message} - {notif.timestamp}</div> ))} </div> ); } export default NotificationCenter;
示例:React 中的轮询实现
import React, { useEffect, useState } from 'react'; function NotificationCenter() { const [notifications, setNotifications] = useState([]); useEffect(() => { const interval = setInterval(() => { fetch('/api/notifications') .then(response => response.json()) .then(data => setNotifications(data)); }, 5000); // Poll every 5 seconds return () => clearInterval(interval); }, []); return ( <div> <h2>Notification Center</h2> {notifications.map((notif, index) => ( <div key={index}>{notif.message}</div> ))} </div> ); } export default NotificationCenter;
示例:注册 Service Worker
if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js').then(registration => { console.log('Service Worker registered:', registration.scope); }).catch(error => { console.error('Service Worker registration failed:', error); }); }
示例:显示通知
if (Notification.permission === 'granted') { new Notification('New message!', { body: 'Click to view the message.', icon: '/path/to/icon.png' }); } else if (Notification.permission !== 'denied') { Notification.requestPermission().then(permission => { if (permission === 'granted') { new Notification('New message!', { body: 'Click to view the message.', icon: '/path/to/icon.png' }); } }); }
示例:在 Node.js 中使用 FCM 发送推送通知
const admin = require('firebase-admin'); const serviceAccount = require('./path/to/serviceAccountKey.json'); admin.initializeApp({ credential: admin.credential.cert(serviceAccount) }); const message = { notification: { title: 'New Notification', body: 'You have a new notification!' }, token: 'device-token' }; admin.messaging().send(message) .then(response => console.log('Message sent:', response)) .catch(error => console.error('Error sending message:', error));
示例:通知列表组件
import React from 'react'; function NotificationList({ notifications }) { return ( <div> {notifications.map(notification => ( <div key={notification.id}>{notification.message}</div> ))} </div> ); } export default NotificationList;
示例:使用 React-toastify 的 Toast 通知
import { toast } from 'react-toastify'; import 'react-toastify/dist/ReactToastify.css'; toast.configure(); function notify() { toast('New notification!', { position: toast.POSITION.BOTTOM_RIGHT }); } notify();
示例:使用 Redux 管理状态
import { createSlice } from '@reduxjs/toolkit'; const notificationSlice = createSlice({ name: 'notifications', initialState: [], reducers: { addNotification: (state, action) => { state.push(action.payload); }, markAsRead: (state, action) => { const notification = state.find(n => n.id === action.payload); if (notification) { notification.read = true; } } } }); export const { addNotification, markAsRead } = notificationSlice.actions; export default notificationSlice.reducer;
作为一名优秀的开发人员,您应该继续从头开始构建 React 通知系统,但是,如果您的老板尽快需要它并且您已经计划了假期(或者只是真的需要休息),请查看我的工具。它简化了一切,并为您提供了即用型组件作为新的通知 API,可在所有流行的 SDK 中使用。所以您可以在我们处理基础设施时放松一下! ??
以上是在 React 中构建实时通知中心的详细内容。更多信息请关注PHP中文网其他相关文章!