reactjs 我怎样才能使用脉轮用户界面在所有组件吐司?

wfveoks0  于 2023-01-30  发布在  React
关注(0)|答案(1)|浏览(95)

我尝试在用户在我的react应用程序中发出任何请求时显示警报。问题是,目前我正在为单独的组件使用单独的吐司组件。我应该如何在整个应用程序中使用一个toast组件。我尝试将toast组件放在App.jsx中,但为了管理toast消息和颜色,我必须进行属性钻取。这是我想避免的。我正在使用redux,所以我不能使用useContext来管理吐司。任何想法都将不胜感激。

bttbmeg0

bttbmeg01#

我更喜欢使用一个名为HOC的高阶组件来 Package toast并为其提供必要的支持,这样,您就可以将toast放在一个中心位置,并使用HOC Package 需要显示toast的其他组件。
例如:

// withToast.js
import { useState } from "react";
import { ToastProvider } from "@chakra-ui/core";

const withToast = (WrappedComponent) => {
  return (props) => {
    const [toast, setToast] = useState({
      message: "",
      color: "",
      isOpen: false,
    });

    const showToast = (message, color) => {
      setToast({ message, color, isOpen: true });
    };

    const hideToast = () => {
      setToast({ message: "", color: "", isOpen: false });
    };

    return (
      <ToastProvider>
        <WrappedComponent
          {...props}
          showToast={showToast}
          hideToast={hideToast}
          toast={toast}
        />
      </ToastProvider>
    );
  };
};

export default withToast;

现在,您可以在由withToast Package 的每个组件中使用相同的toast:

import React from 'react';
import withToast from './withToast';

const App = (props) => {
  const { showToast, toast } = props;

  return (
    <div>
      <button onClick={() => showToast("Hello, World!", "green")}>
        Show Toast
      </button>
      <Toast message={toast.message} color={toast.color} isOpen={toast.isOpen} />
    </div>
  );
};

export default withToast(App);

您还可以在HOC中 Package 多个组件,并在 Package 组件内呈现的任何组件中使用showToasthideToast函数,这样您就不必 * prop-drill * showToasthideToast

相关问题