reactjs 警告:validateDOMNesting(...):不能< a>显示为的后代< a>

ttygqcqt  于 2023-10-17  发布在  React
关注(0)|答案(2)|浏览(398)

我正在使用React router dom Link组件。它基本上是Twitter的主页。我希望能够有两种类型的链接在一个div组件。一个将链接到用户的个人资料和其他一个去后。我目前收到警告,暂时找不到解决方案。以下是截图作为参考:

我明白这里的问题,我的文章链接是父元素,我已经添加了两个用户链接组件内,它作为用户应该能够访问后页面时,他点击任何内部的职位,除了用户的个人资料照片和用户的名字。有没有更聪明的方法来实现这一点,并保持这样的链接?
代码:

  1. {posts?.map((post) => (
  2. <Link
  3. className={classes.link}
  4. key={post.user.id}
  5. to={`/posts/${post.id}`}
  6. >
  7. <div className={classes.post}>
  8. <Link to={`/users/${post.user.id}`}>
  9. <img
  10. className={classes.profileImage}
  11. src={DefaultLogo}
  12. alt="default-profile"
  13. />
  14. </Link>
  15. <article className={classes.postDetails}>
  16. <Link
  17. className={classes.link}
  18. to={`/users/${post.user.id}`}
  19. >
  20. <Typography
  21. variant="subtitle1"
  22. className={`${classes.postTitle} ${classes.content}`}
  23. >
  24. {post.user.name}
  25. </Typography>
  26. </Link>
  27. <Typography
  28. variant="subtitle1"
  29. className={`${classes.postText} ${classes.content}`}
  30. >
  31. {post.body}
  32. </Typography>
  33. </article>
  34. </div>
  35. </Link>
  36. ))}
lbsnaicq

lbsnaicq1#

是的,在另一个锚标记中包含锚标记是一种错误的做法。但是根据你的需求,你可以使用一个带有react router dom history API的基本按钮。

一个简单的例子:

  1. import {Link, useHistory} from 'react-router-dom'
  2. const App = () => {
  3. const history = useHistory()
  4. return (
  5. <a
  6. href='/user/1'
  7. >
  8. <h2>John doe</h2>
  9. <div>here are some use information</div>
  10. {/* Need to prevent the event bubbling */}
  11. <Link role='link' to='/users/1/posts'>
  12. User posts
  13. </Link>
  14. </div>
  15. )
  16. }
展开查看全部
yks3o0rb

yks3o0rb2#

让我们使用一个专用的导航处理函数。我们将用<p>标记替换那些讨厌的<Link>标记,并将onClick事件处理程序连接到<p>标记。我们还将利用强大的useNavigate React钩子,它可以方便地支持在导航过程中将状态传递给其他组件。
下面是一个修改后的组件示例:

  1. import { useNavigate } from "react-router-dom";
  2. const NestedLinkSolution = () => {
  3. const navigate = useNavigate();
  4. const handleNavigation = (event: React.MouseEvent, childRoute: string) => {
  5. event.stopPropagation();
  6. navigate(childRoute);
  7. };
  8. return (
  9. <p
  10. onClick={(event) => {
  11. handleNavigation(event, "/parentRoute");
  12. }}>
  13. 🌟 {/* Initial parts of the component */}
  14. <p
  15. onClick={(event) => {
  16. handleNavigation(event, "/childRoute");
  17. }}>
  18. 🚗 Goto Child Route
  19. </p>
  20. {/* rest of the component */}
  21. </p>
  22. );
  23. };
  24. export default NestedLinkSolution;

使用这种方法,您不仅可以解决问题,还可以在代码中注入一些风格。

展开查看全部

相关问题