当前位置:首页 > React

react实现Toast组件

2026-01-27 07:26:29React

实现Toast组件的基本思路

Toast组件通常用于显示临时性的提示信息,几秒后自动消失。React中可以通过状态管理和动画效果实现。

创建Toast组件文件

新建Toast.js文件,定义基础组件结构:

import React, { useState, useEffect } from 'react';
import './Toast.css';

const Toast = ({ message, duration = 3000, onClose }) => {
  const [visible, setVisible] = useState(true);

  useEffect(() => {
    const timer = setTimeout(() => {
      setVisible(false);
      onClose && onClose();
    }, duration);

    return () => clearTimeout(timer);
  }, [duration, onClose]);

  return visible ? (
    <div className="toast">
      {message}
    </div>
  ) : null;
};

export default Toast;

添加CSS样式

创建Toast.css文件添加基础样式:

.toast {
  position: fixed;
  bottom: 20px;
  left: 50%;
  transform: translateX(-50%);
  padding: 12px 24px;
  background-color: rgba(0, 0, 0, 0.7);
  color: white;
  border-radius: 4px;
  animation: fadeIn 0.3s, fadeOut 0.3s 2.7s;
}

@keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}

@keyframes fadeOut {
  from { opacity: 1; }
  to { opacity: 0; }
}

创建Toast管理器

为了实现全局调用,创建ToastManager.js

import React, { useState } from 'react';
import Toast from './Toast';

let toastCount = 0;

export const ToastContext = React.createContext();

export const ToastProvider = ({ children }) => {
  const [toasts, setToasts] = useState([]);

  const addToast = (message, duration) => {
    const id = toastCount++;
    setToasts([...toasts, { id, message, duration }]);
  };

  const removeToast = (id) => {
    setToasts(toasts.filter(toast => toast.id !== id));
  };

  return (
    <ToastContext.Provider value={{ addToast }}>
      {children}
      <div className="toast-container">
        {toasts.map(toast => (
          <Toast
            key={toast.id}
            message={toast.message}
            duration={toast.duration}
            onClose={() => removeToast(toast.id)}
          />
        ))}
      </div>
    </ToastContext.Provider>
  );
};

在应用中使用

在根组件中包裹ToastProvider

import React from 'react';
import { ToastProvider } from './ToastManager';

function App() {
  return (
    <ToastProvider>
      {/* 其他应用内容 */}
    </ToastProvider>
  );
}

调用Toast的方法

在任意子组件中通过context调用:

import React, { useContext } from 'react';
import { ToastContext } from './ToastManager';

function SomeComponent() {
  const { addToast } = useContext(ToastContext);

  const showToast = () => {
    addToast('操作成功', 2000);
  };

  return (
    <button onClick={showToast}>显示Toast</button>
  );
}

可选的功能扩展

  1. 支持不同类型:添加success/warning/error等样式变体
  2. 自定义位置:允许设置top/middle/bottom等显示位置
  3. 队列管理:当多个Toast同时触发时实现队列显示
  4. 自定义动画:提供更多动画效果选项
  5. 手动关闭:允许用户点击关闭Toast

实现多类型Toast示例

修改Toast组件支持不同类型:

const Toast = ({ message, type = 'info', duration = 3000, onClose }) => {
  // ...其他代码不变
  return visible ? (
    <div className={`toast toast-${type}`}>
      {message}
    </div>
  ) : null;
};

添加对应的CSS样式:

react实现Toast组件

.toast-info {
  background-color: rgba(0, 0, 0, 0.7);
}

.toast-success {
  background-color: rgba(40, 167, 69, 0.9);
}

.toast-error {
  background-color: rgba(220, 53, 69, 0.9);
}

标签: 组件react
分享给朋友:

相关文章

vue实现水印组件

vue实现水印组件

Vue 水印组件实现 基础水印组件实现 创建一个基础水印组件,通过 props 接收文本、颜色、大小等参数: <template> <div class="watermark-…

react native 如何

react native 如何

React Native 开发基础 React Native 是一个用于构建跨平台移动应用的框架,允许开发者使用 JavaScript 和 React 编写代码,同时生成原生 iOS 和 Androi…

理解如何react

理解如何react

理解React的核心概念 React是一个用于构建用户界面的JavaScript库,专注于通过组件化开发提高代码的可维护性和复用性。其核心思想包括虚拟DOM(Virtual DOM)和单向数据流,能够…

react如何分

react如何分

React 分页实现方法 在 React 中实现分页功能可以通过多种方式完成,以下是几种常见的方法: 使用状态管理分页数据 在组件内部维护当前页码和每页数据量的状态,通过计算切片数据实现分页。…

react 如何修改state

react 如何修改state

修改 state 的基础方法 在 React 中,state 的修改必须通过 setState 方法(类组件)或 state 更新函数(函数组件)。直接修改 state 会导致组件不会重新渲染,且可能…

react如何重新加载

react如何重新加载

重新加载当前页面 在React中重新加载当前页面可以通过window.location.reload()方法实现。该方法会强制浏览器重新加载当前URL,类似于按下F5刷新页面。 const relo…