当前位置:首页 > 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文件添加基础样式:

react实现Toast组件

.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

react实现Toast组件

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样式:

.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
分享给朋友:

相关文章

react如何取消渲染

react如何取消渲染

取消渲染的方法 在React中,取消渲染通常指阻止组件在特定条件下进行不必要的渲染。可以通过以下几种方式实现: 条件渲染 使用条件语句(如if或三元运算符)直接返回null,避免渲染组件内容。例如…

react如何销毁

react如何销毁

销毁 React 组件 在 React 中,销毁组件通常涉及清理副作用(如事件监听器、定时器或订阅)以防止内存泄漏。以下是实现组件销毁的常见方法: 使用 useEffect 清理副作用 在函数组件…

vue radio组件实现

vue radio组件实现

Vue Radio 组件实现 在 Vue 中实现 Radio 组件可以通过原生 HTML 的 <input type="radio"> 结合 Vue 的响应式特性,或者使用第三方 UI 库…

vue实现tooltips组件

vue实现tooltips组件

Vue实现Tooltips组件的方法 基础实现:使用Vue指令 创建一个自定义指令v-tooltip,通过鼠标事件触发提示框的显示与隐藏。 Vue.directive('tooltip', {…

vue实现多级组件

vue实现多级组件

Vue 多级组件实现方法 在 Vue 中实现多级组件通常涉及父子组件通信、动态组件或递归组件等技术。以下是几种常见实现方式: 父子组件嵌套 通过逐层嵌套组件实现多级结构,适用于固定层级场景:…

vue穿梭框组件实现

vue穿梭框组件实现

实现 Vue 穿梭框组件的基本思路 穿梭框(Transfer)组件通常用于在两个列表之间移动数据项。核心功能包括左侧列表、右侧列表、移动按钮(左移、右移、全选等)以及数据项的渲染与交互。 基础结构…