繁体   English   中英

如何以编程方式显示 Chakra-UI Toast?

[英]How can I show a Chakra-UI Toast programmatically?

我正在尝试使用 Chakra-UI React.js 组件库以编程方式显示Chakra-UI Toast,并且正在努力让它工作。 Chakra-UI Toast 文档仅显示了如何基于按钮单击显示吐司,但我想以编程方式显示它 - 在调用 AJAX 后返回的 promise 中。 我不确定它是否可行,但我想有一个 showToast function 我可以打电话来展示它。

我正在将 Chakra-UI 集成到 React.js web 应用程序中,我对 React.js 和 Chakra-UI 都很陌生。

更新

这是一个 CodeSandbox,展示了我正在努力实现的目标: https://codesandbox.io/embed/upbeat-rhodes-9zkii 我在那里有一个按钮,当它被点击时会显示吐司,但我想在 TODO 所在的 setTimeout 中显示它。

您可以使用 React 的 useEffect 挂钩以编程方式触发 toast。 useEffect 钩子适用于任何副作用,例如获取数据或 DOM 操作。

 const toast = useToast();

  useEffect(() => {
    // Show toast every 5 seconds.
    setInterval(() => {
      toast({
        title: "Current Time.",
        description: `Time ${new Date()}`,
        status: "success",
        duration: 5000,
        isClosable: true
      });
    }, 5000);
  }, []); // Passing in empty array so this will only get called on mount

有关完整的解决方案,请查看代码沙箱https://codesandbox.io/s/eloquent-knuth-bt5u8?fontsize=14

这是我的解决方案,以防万一有人偶然发现这个线程:

import { useToast } from "@chakra-ui/react";
import { useState, useEffect } from "react";

export function useToastHook() {
  const [state, setState] = useState(undefined);
  const toast = useToast();

  useEffect(() => {
    if (state) {
      const { message, status } = state;

      toast({
        title: status,
        description: message,
        status: status,
        duration: 3000,
        position: "top",
        isClosable: true,
      });
    }
  }, [state, toast]);

  return [state, setState];
}

并使用这样做(您也可以将 newToast 传递给任何不在 a.jsx 文件中的 function):

import { useToastHook } from "../components/Toast";

const App = () => {
  const [state, newToast] = useToastHook();

  const someThingHappens = (message) => {
    newToast({ message: message, status: "error" });
  };

  return (
    <div>
    ......
   </div>
  );
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM