通常,当创建一个我们想要有条件地渲染的可重用 React 组件时,我们要么给它一个 prop 来告诉它是否渲染自己:
function TheComponent(props) {
return(
props.isVisible?<div>...</div>:null
);
}
或者只是有条件地从外部渲染整个组件:
function App() {
//...
return (
isVisible ? <TheComponent /> : null
);
}
或者,如果我们想制作一个可以在应用程序中的任何地方显示/隐藏的组件——比如toast 通知——我们可以包装在一个提供者中并制作一个自定义钩子来访问它的上下文;这将让我们在 provider 内部的任何地方显示/隐藏它,只需调用一个函数:
const App = () => (
<ToastProvider>
<OtherStuff />
</ToastProvider>
);
const OtherStuff = () => {
const { showToast } = useToast();
showToast();
return ...;
};
然而,有一个非常酷的包react-toastify,我似乎无法理解它是如何实现的。你所要做的就是<ToastContainer />
在你的应用程序的某个地方放置一个,然后从其他任何地方,你可以:
import { toast } from "react-toastify";
toast.info("this will show the component with a message");
由于这个函数可以在提供者之外调用,我真的不明白它是如何控制树中其他地方的组件状态的。我试过查看它的代码,但作为一个 React 初学者,这有点超出我的理解。我喜欢完全独立的组件的想法,您可以将其固定在应用程序的某个位置,并通过从任何地方调用函数来调用。没有提供者/包装器或任何东西:只是一个函数调用,然后弹出。
有人可以帮助阐明从根本上说这样的组件如何工作吗?提供者外部的函数如何控制另一个组件内部的状态?