src/context/ToastContext.js
import { createContext, useCallback, useContext, useEffect, useState } from "react"; const CreateAlertBox = createContext(); export const useCreateAlert = () => useContext(CreateAlertBox); const AlertType = ['error', 'success', 'info', 'warning']; export const CreateAlertBoxProvider = ({ children }) => { const [alert, setAlert] = useState([]); const createAlert = useCallback((message, type = 'warning') => { if (!AlertType.includes(type)) return; setAlert((prevAlert) => [ ...prevAlert, { id: Date.now(), message, type } ]) }, []) const removeAlert = useCallback((id) => { setAlert((prevAlert) => prevAlert.filter((alert) => alert.id !== id)); }, []) return ( <CreateAlertBox.Provider value={{ createAlert, removeAlert }}> {children} <div className="toast-container"> { alert.map((alert) => ( <div key={alert.id} className={`toast toast-${alert.type}`}> {alert.message} <button onClick={() => removeAlert(alert.id)}>X</button> </div> )) } </div> </CreateAlertBox.Provider> ) }
/* src/styles/toast.css */
.toast-container { position: fixed; top: 1rem; right: 1rem; z-index: 9999; } .toast { background-color: #333; color: #fff; padding: 1rem; margin-bottom: 1rem; border-radius: 4px; display: flex; align-items: center; justify-content: space-between; } .toast-info { background-color: #007bff; } .toast-success { background-color: #28a745; } .toast-warning { background-color: #ffc107; } .toast-error { background-color: #dc3545; } .toast button { background: none; border: none; color: #fff; cursor: pointer; margin-left: 1rem; }
// src/main.js
import React from 'react' import ReactDOM from 'react-dom/client' import App from './App.jsx' import './index.css' import { RouterProvider } from 'react-router-dom' import { router } from './router.jsx' import { CreateAlertBoxProvider } from './context/toastcontext.jsx' ReactDOM.createRoot(document.getElementById('root')).render( <React.StrictMode> <CreateAlertBoxProvider> <RouterProvider router={router}> <App /> </RouterProvider> </CreateAlertBoxProvider> </React.StrictMode>, )
import React, { useContext, useEffect } from 'react' import { UserContext } from '../context/usercontext' import { useCreateAlert } from '../context/toastcontext' const Profile = () => { const { user } = useContext(UserContext) const { createAlert } = useCreateAlert(); const showToast = () => { try { createAlert("Deal created successfully", 'success') } catch (error) { createAlert('This is an info toast!', 'error'); } }; return ( <div className="App"> <p>Hello Profile</p> <button onClick={showToast}>Show Toast</button> </div> ) } export default Profile
以上是在 React 中使用特定类型和上下文 API 设置 Toast 自定义通知的详细内容。更多信息请关注PHP中文网其他相关文章!