javascript - React Js:如何在 dom 中只显示一次组件?
问题描述
我是 React 的新手,正在尝试构建一个简单的博客项目。
该博客将显示帖子列表,访问者可以单击评论以在帖子下方显示它们。
这是我的问题,我想要一个特定的行为,我希望用户一次只能显示一个评论框/窗口。
如果您单击另一个评论链接,我想强制其他人关闭。
我不知道如何做到这一点......
这是一些代表我的实际应用程序的代码:CondeSandBox
对不起我的英语不好...
解决方案
一种或另一种方式,您需要在所有评论之间共享状态才能做到这一点。这至少需要你回到两层,到DisplayPosts
. 您可以传递state
和setState
向下,或者您可以使用上下文。
这是您的沙箱修改为通过上下文使用共享状态。简而言之,这涉及到:
首先在 App.js(或 DisplayPosts,并不重要)中,创建 Context 并使用 Provider 包装返回:
export const CommentContext = createContext(-1);
export default function App() {
const [post, setPost] = useState(-1);
return (
<CommentContext.Provider value={{ post, setPost }}>
<div className="App">...</div>
</CommentContext.Provider>
);
}
接下来在 Posts.js 中,您只需要使用 useContext 而不是 useState:
const Post = ({ props }) => {
const { post, setPost } = useContext(CommentContext);
const { id, title, comments } = props;
const handleClick = (e) => { // ...
setPost((pid) => (pid === id ? -1 : id));
};
return (<>...
{post === id ? <DisplayComments postId={id} /> : null}
</>);
};
这样你就有了一个显示评论的状态,它是应该显示评论的帖子的 id。如果不应该显示任何评论,它会被设置为 -1(我假设你没有 -1 id ......你可以在那个地方使用 null 或任何东西。
*编辑:在沙箱中,我稍微重构了代码以更好地分离组件。我将所有 Context/Provider 的东西放在 DisplayComments 中,并将一个非常基本的包装器提供程序组件导入到 App 中。这样,它将评论逻辑和状态保留在主 App 功能之外。
为了便于说明,我将此处的示例代码保持不变,因为它使代码更短更简单。
推荐阅读
- kubernetes - 当涉及主机路径卷时,kubernetes 如何处理跨多个 pod 的文件写入储物柜
- amazon-web-services - 你认为我们需要在 api 网关前面有一个 CDN 吗?
- linux - 在 Ubuntu 上使用 .net core 2.1.300 的 SOAP NTLM 登录失败
- php - 卢比符号 (₹) 在 Firefox 中不起作用
- google-play - 嵌入脚本引擎和 iOS 或 Android 商店批准或拒绝
- nginx - Sendgrid 品牌链接与 nginx 代理
- chromium-embedded - CEFSHARP 视频播放器在 weibo.com 网站上无法使用
- javascript - 是否可以强制 morphia 将 ObjectId 映射到十六进制表示?
- python - 新手:使用 TensorFlow MNIST 代码示例的 Keras:错误的预测
- c# - 如何在程序中运行2个线程