使用 React 实现全局 Message 组件

使用 React 实现全局 Message 组件

在前端开发中常用的组件之一就是进行全局通知,一般的组件库都提供了这些功能:

全局提示 Message - Ant Design (gitee.io)

Message 全局提示 | TDesign (tencent.com)

这里将不使用第三方库,自己动手实现一个简单的全局消息组件

所有的代码都在一个 tsx 文件中

全局消息的组成

  1. 一个可以全局调用的对象
  2. 一个消息列表组件
  3. 一个消息组件

定义消息的类型

消息一般分为 成功信息警告错误 四种,这里使用枚举进行定义

// 消息的类型枚举
enum MessageType {
    Success = "success",
    Error = "error",
    Warning = "warning",
    Info = "info"
}

定义全局消息的对象的类型

也就是分别对应上述四种类型的方法

// 消息对象类型
type Message = {
    success: (message: string) => void
    error: (message: string) => void
    warning: (message: string) => void
    info: (message: string) => void
}

定义消息组件

onRemove 方法用来移除当前组件,移除交给上级组件完成

// 消息组件参数
type MessageProps = {
    id: string
    type: MessageType
    content: string
    onRemove?: (id: string) => void
}

// 消息组件
const MessageItem: React.FC<MessageProps> = (props) => {
    setTimeout(() => {
        props.onRemove?.(props.id);
    }, 2000);
    return (
        <div className={`message-item ${props.type}`}>{props.content}</div>
    );
};

定义消息列表组件

这里通过每次需要页面更新时修改 flagId 来实现刷新的效果

// 消息对象
const message: Partial<Message> = {};

// 标识消息的ID
let incrementId = 0;
// 消息列表对象
const messageList: { [key: string]: MessageProps } = {};

// 消息列表组件
const MessageList = () => {
    const [flagId, setFlagId] = useState(0);

    const removeById = (id: string) => {
        delete messageList[id];
        setFlagId(flagId + 1);
    };

    const _message = (type: MessageType, content: string) => {
        const id = `${++incrementId}`;
        messageList[id] = {
            id: id,
            type: type,
            content: content,
        };
        setFlagId(flagId + 1);
    };

    message.success = (content: string) => {
        _message(MessageType.Success, content);
    };

    message.error = (content: string) => {
        _message(MessageType.Error, content);
    };

    message.warning = (content: string) => {
        _message(MessageType.Warning, content);
    };

    message.info = (content: string) => {
        _message(MessageType.Info, content);
    };
    
    return (
        <div className="message-list">
            {Object.keys(messageList).map(key => {
                const item = messageList[key];
                return <MessageItem key={item.id} id={item.id} type={item.type} content={item.content}
                                    onRemove={removeById}></MessageItem>;
            })}
        </div>
    );
};

加载时自动挂载全局消息的模态框

// 在加载 JS 时在页面上挂载消息 model
const messageModelContainer = document.createElement("div");
messageModelContainer.className = "message-model-container";
document.body.appendChild(messageModelContainer);

ReactDOM.createRoot(messageModelContainer as HTMLElement).render(
    <MessageList></MessageList>
);

最后导出 message 对象

export default message as Message;

对应的 scss 文件

.message-model-container {
  z-index: 1000;
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  pointer-events: none;
  display: flex;
  justify-content: center;

  .message-list {
    width: 350px;
    position: relative;

    .message-item {
      position: absolute;
      top: -64px;
      width: 100%;
      box-sizing: border-box;
      height: 48px;
      line-height: 48px;
      text-overflow: ellipsis;
      white-space: nowrap;
      overflow: hidden;
      box-shadow: rgba(0, 0, 0, 0.2) 0 0 8px;
      border-radius: 4px;
      padding: 0 16px;
      margin-top: 12px;
      background-color: white;
      animation: message-item-animation 2s;

      &.success {
        border-left: solid 4px var(--success-color);
      }

      &.error {
        border-left: solid 4px var(--error-color);
      }

      &.warning {
        border-left: solid 4px var(--warning-color);
      }

      &.info {
        border-left: solid 4px var(--info-color);
      }

      @keyframes message-item-animation {
        0% {
          top: -64px;
        }
        20% {
          top: 0;
        }
        80% {
          top: 0;
        }
        100% {
          top: -64px;
        }
      }
    }
  }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 好的,我来为你解答如何使用 React 实现用户登录组件。 首先,你需要准备一个表单,用于输入用户的登录信息。表单可以使用 React 中的 form 元素来实现。 下面是一个简单的登录表单的示例代码: ``` import React, { useState } from 'react'; function LoginForm() { const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const handleSubmit = (event) => { event.preventDefault(); // 这里可以添加登录逻辑 }; return ( <form onSubmit={handleSubmit}> <label> 用户名: <input type="text" value={username} onChange={(event) => setUsername(event.target.value)} /> </label> <br /> <label> 密码: <input type="password" value={password} onChange={(event) => setPassword(event.target.value)} /> </label> <br /> <button type="submit">登录</button> </form> ); } export default LoginForm; ``` 在上面的代码中,我们使用React 的 useState hook 来管理表单中的用户名和密码的状态。当用户在输入框中输入信息时,通过调用 setUsername 和 setPassword 函数来更新状态。 在表单提交时,我们使用了 handleSubmit 函数来阻止默认的提交行为,并在函数内部添加登录逻辑。 这就是 React实现用户登录组件的简单方法。希望这对你有所帮助。 ### 回答2: React是一个用于构建用户界面的JavaScript库,可以用它来实现用户登录组件。 要实现一个用户登录组件,首先需要创建一个React组件。可以创建一个名为“Login”的组件,该组件将包含用户登录所需的输入字段和登录按钮。 在组件的构造函数中,可以定义state来存储用户输入的用户名和密码。可以使用React的setState函数来更新state。 组件的render函数将返回一个包含用户名输入框、密码输入框和登录按钮的表单。可以使用React的onChange事件监听器来监听输入框的变化,并使用setState函数更新state。 当用户点击登录按钮时,可以在onClick事件处理程序中调用一个函数来处理登录逻辑。该函数可以验证用户名和密码是否正确,并执行相应的操作,例如显示登录成功或失败的消息。 在组件的render函数中,可以使用state来根据登录成功与否来显示不同的内容。例如,可以根据state中的一个布尔值来显示“登录成功”或“登录失败”的消息。 除了上述基本功能外,还可以根据需求添加其他的功能,例如记住登录状态、实现更复杂的验证逻辑等。 最后,将登录组件添加到应用的其他组件中,以实现完整的用户登录功能。 通过使用React,可以轻松地构建用户登录组件,并实现用户登录功能。 ### 回答3: 要实现用户登录组件,可以使用React来完成。 首先,需要创建一个Login组件,包含用户名输入框、密码输入框和登录按钮。在构造函数中,设置相关的state数据,如username和password,用于保存用户输入的值。 接下来,在render方法中,使用input元素来创建用户名和密码输入框,并通过onChange事件监听用户输入,将输入的值更新到state数据中。 在登录按钮的onClick事件处理函数中,可以在点击按钮时,获取state中保存的用户名和密码,并向后台发送登录请求。 在进行登录请求的处理过程中,可以使用axios等库来发起真正的网络请求。可以定义一个handleLogin方法来处理登录请求,在该方法中,使用axios发送POST请求,并将用户名和密码作为请求体参数发送到后台。成功登录后,可以根据后台返回的数据进行相应的处理,如跳转到登录成功页面或显示登录失败的提示信息。 最后,将Login组件渲染到页面中,即可实现用户登录功能。 需要注意的是,实现用户登录组件还需要进行表单验证、用户输入的数据处理和错误提示等方面的处理,以保证登录功能的完整性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值