当前位置: 首页 > 知识库问答 >
问题:

React Js:如何在DOM中只显示一次组件?

巫墨一
2023-03-14

我是新鲜的新反应,并试图建立一个简单的博客项目。

这个博客将显示一个帖子列表,访问者可以点击评论在帖子下面显示。

这里是我的问题,我想要一个特定的行为女巫是我想要用户能够显示一次只有一个评论框/窗口。

如果你点击了另一个评论链接,我想强迫其他的关闭。

我不知道该怎么做...

下面是一些代码来表示我的实际应用程序:CondeSandBox

很抱歉我的英语不好...

共有2个答案

冯流觞
2023-03-14

您只需要在displayposts组件上定义一个新的状态值。

displayPosts.js

const DisplayPosts = () => {
  const [openedComments, setOpenedComments] = useState();

  const handleCommentOpen = (id) => {
    if (openedComments === id)
        setOpenedComments(null)
    else 
        setOpenedComments(id)
  }

  return data.map((post) => (
          <Post openedComments onCommentsOpen={() => handleCommentOpen(post.id)} key={post.id} props={post} />
        ))
}

post.js

const Post = ({ openedComments, onCommentsOpen }) => {
  return (
     <a href="/#" onClick={onCommentsOpen}>
        Comments: {comments}
     </a>
     {openedComments === id && <DisplayComments postId={id} />}
  )
}
祝宾白
2023-03-14

无论如何,您都需要在所有注释之间共享状态,以便执行此操作。这将使您至少返回两层,即displayposts。您可以向下传递statesetstate,也可以使用上下文。

这是您修改的沙箱,通过上下文使用共享状态。以下是这方面的简单内容:

首先,在app.js(或DisplayPosts,并不重要)中,创建上下文并用提供程序包装返回

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中,您只需要使用Context而不是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(我假设您没有-1ID...您可以在那个地方使用null或其他任何东西。

*编辑:在沙箱中,我对代码进行了一些重构,以便更好地分离组件。我把所有的上下文/提供程序都放在了DisplayComments中,一个非常基本的包装器提供程序组件导入到了App中。这样,它将评论逻辑和状态排除在主应用程序功能之外。

这里的示例代码保持不变,因为它使代码更短、更简单,便于说明。

 类似资料:
  • 问题内容: 我们现在在使用React时遇到了一些问题,但这 有点 归结于我们如何使用React的一部分。 我们应该如何显示/隐藏子组件? 这就是我们的编码方式(这只是组件的片段)… 最近,我一直在阅读一些示例,例如应该沿着以下方向进行: 我应该一直在使用那个React.render()吗?似乎停止了各种各样的事情,如级联到孩子和诸如… 问题答案: 我提供了一个工作示例,它遵循您的第二种方法。更新组

  • 闪屏应该在我每次使用应用程序时都能工作,但一旦我从任务管理器中清除应用程序并重新启动它。 动画不会出现,它会直接进入登录屏幕,不会出现动画。

  • 问题内容: 我正在关注此软件包https://www.npmjs.com/package/react- pdf 我从后端获取了整个原始pdf数据,因此我尝试使用以下代码。 但是它显示“无法加载PDF文件”。我不想在本地保存任何文件。最好的方法是显示pdf以及后端提供的原始数据。 在终端中,它记录了错误: 问题答案: 好像您是将PDF数据作为prop 的值直接传递给组件一样。但是根据文档,您需要使用

  • 我想创建一个底部工作表对话框。看起来像下面的图像在这里输入图像描述 我尝试过许多方法,如SharedPreferences。但它不起作用

  • 我用自定义适配器创建了一个旋转器,其中我有一个图像视图和一个文本视图,当我从旋转器中选择项目时,我用选定的项目显示图像,这是完美的工作。 问题: 但问题是当我选择任何项目时,它会在下拉框中显示选定项目的图像。并在旋转器中显示相同的(图像和文本)…

  • 问题内容: 我是ReactJS(0.13.1)的新手,并且在我的应用程序中创建了一个组件来显示HTML5视频。 它似乎完美运行,但仅适用于第一选择。从一个视频切换到另一个视频时(更改时),页面中实际显示和播放的视频不会改变。 我可以在Chrome检查器中看到元素更新,但是页面中实际渲染的视频没有改变,如果已经播放,则继续播放。Safari和Firefox中也会发生相同的情况。所有其他元素也会适当更