Heim  >  Fragen und Antworten  >  Hauptteil

React-Toastify-Komponenten sind wiederverwendbar

Ich versuche, eine wiederverwendbare Toast-Komponente zu erstellen.

Hier ist der Code: https://codesandbox.io/s/custom-toastify-toast-with-react-component-forked-mu2l9c?file=/src/Toast.js:146-680

Beim Rendern der Toast-Komponente selbst [Kommentare unten] wird der Toast wunderschön angezeigt.

return (
    <>
      {/* <Toast /> */}   ---> This one works perfectly.
      <input
        type="text"
        value={input}
        onChange={(e) => setInput(e.target.value)}
        name="input"
      />
    </>

Allerdings versuche ich, den Toast durch die Öffentlichkeit zu erreichen toastMeta 来实现对 toast 的调用。这样调用者只需输入 toastMeta.message("please show up.."). Optionale Parameter horizontale und vertikale Position werden ebenfalls übergeben.

Problem: Kann toastMeta.message("") nicht zum Aufrufen der Toastkomponente verwenden

Hinweis: Bei diesem CustomToast handelt es sich um ein npm-Paket, daher muss der Aufrufer diese Bibliothek installieren und importieren toastMeta.

export const toastMeta = {
  position: "top-right",
  message: "Error Toast"
};

export const Toast = ({ className, children, ...props }) => {
  return (
    <>
      <ToastContainer {...props}>
        {toast.error(toastMeta.message, {
          position: toastMeta.position,
          autoClose: 3000,
          hideProgressBar: false,
          closeOnClick: true,
          pauseOnHover: true,
          draggable: true,
          progress: undefined,
          theme: "colored"
        })}
      </ToastContainer>
    </>
  );
};

Rufen Sie nach jedem Tastendruck Toast an..

const [input, setInput] = useState("");

  useEffect(() => {
    toastMeta("Error Message..");
  }, [input]);

  return (
    <>
      {/* <Toast /> */}
      <input
        type="text"
        value={input}
        onChange={(e) => setInput(e.target.value)}
        name="input"
      />

Grund für die Erstellung der Toast-Komponente:

Wird zur Versionskontrolle verwendet, da es eine der Komponenten der öffentlichen Bibliothek ist. Die gemeinsame Bibliothek enthält alle UI-Elemente.

Vielen Dank für Ihre Hilfe. Vielen Dank im Voraus.

P粉514458863P粉514458863281 Tage vor396

Antworte allen(1)Ich werde antworten

  • P粉090087228

    P粉0900872282024-02-04 12:50:49

    您不能将对象作为函数调用,这也是实现不正确的原因之一,您需要使用 toast 的 ref,然后动态传递值。

    请检查代码,希望对您有所帮助!

    App.js

    import React, { useEffect, useRef, useState } from "react";
    import { Toast, toastMeta } from "./Toast";
    
    const App = () => {
      const [input, setInput] = useState("");
    
      const toastRef = useRef(null);
    
      useEffect(() => {
        // toastMeta("Error Message..");
        if (input !== "") {
          toastRef.current.showToast({
            position: "top-right",
            message: "Custom Error Toast"
          });
        }
      }, [input]);
    
      return (
        <>
          
           setInput(e.target.value)}
            name="input"
          />
        
      );
    };
    
    export default App;

    Toast.js

    import React, { forwardRef, useImperativeHandle, useState } from "react";
    import { ToastContainer, toast } from "react-toastify";
    import "react-toastify/dist/ReactToastify.css";
    
    export const toastMeta = () => {
      return { position: "top-right", message: "Error Toast" };
    };
    
    export const Toast = forwardRef(({ className, children, ...props }, ref) => {
      const [toastConfig, setToastConfig] = useState({});
    
      useImperativeHandle(ref, () => ({
        showToast: (_data) => {
          setToastConfig(_data);
        }
      }));
    
      return (
        
          {toast.error(toastConfig?.message, {
            position: toastConfig?.position,
            autoClose: 3000,
            hideProgressBar: false,
            closeOnClick: true,
            pauseOnHover: true,
            draggable: true,
            progress: undefined,
            theme: "colored"
          })}
        
      );
    });

    Antwort
    0
  • StornierenAntwort