在我的React项目中有一段特定的JSX代码,其中事件和路由都不起作用.

PhotoFrame.tsx:

const PhotoFrame = ({ photoId }: PhotoFrameProps) => {
    const photo = useAppSelector((state: RootState) =>
        selectPhotoById(state, photoId)
    );
    const navigate = useNavigate();
    
    const url = photo.urls.regular;
    const author = photo.user.name;
    const authorUsername = photo.user.username; 
    const path = `/user/${authorUsername}`;
    const authorPhotoUrl = photo.user.profile_image.small;

    return (
        <article className="frame-container" >
             {/* <Link to={path}>{author}</Link> */}  ----> THIS IS THE LAST PLACE IN CODE WHERE LINK WORKS
            <div className="frame">
            {/* <Link to={path}>{author}</Link> */} ----> DOESN'T WORK
                <img
                    src={url}
                    alt={`Photography by ${author}`}
                />
                <address className="author">
                    <img src={authorPhotoUrl} alt="Author" />
                    <Link to={path}>{author}</Link>  ----> DOESN'T WORK (THIS IS THE ORIGINAL PLACEMENT OF LINK)
                </address>
            </div>
            {/* <Link to={path}>{author}</Link> */} ----> DOESN'T WORK
        </article>
    );
};

a元素在DOM中呈现,但单击它绝对不会产生任何影响.URL没有变化,没有错误或任何其他行为.

DOM screenshot of a PhotoFrame instance

起初,我以为问题只与路由/链路元素有关.我向address元素添加了一个onClick事件,并从事件处理程序内部的路由使用useNavigate钩子来查看它是否可以工作--这是我发现我的事件也没有被激发的时候.我试图将address更改为不同的元素,但什么都没有改变.即使我输入button而不是address,事件也不会触发.

PhotoFrame.tsx with event handler:

    const handleAddressClick: MouseEventHandler<HTMLElement> = (e) => {
        e.stopPropagation();
        console.log("CLICK");   ---> NOT LOGGED IN THE CONSOLE
        navigate(path);  
    };

    return (
        <article className="frame-container" >
            <div className="frame">
                <img
                    src={url}
                    alt={`Photography by ${author}`}
                />
                <address className="author" onClick={handleAddressClick}>
                    <img src={authorPhotoUrl} alt="Author" />
                </address>
            </div>
        </article>
    );

推荐答案

问题出在关于伪元素的position: absolute个集合中.它将它们覆盖在Linkaddress元素上,使它们无法访问/无法点击.

.frame::before, .frame::after {
    content: "";
    position: absolute;
}

此外,在页面底部有一个弹性容器,在滚动时覆盖了大量的PhotoFrame实例,再次使该区域无法接触到Link.

两种不需要更改布局的解决方案:

  1. pointer-events: none;添加到所有伪元素和覆盖交互元素的元素(如果它们本身不需要任何鼠标交互).
  2. position: relativez-index加到应该响应鼠标/指针事件的元素上,其中z-indexvalue高于覆盖.

Html相关问答推荐

如何防止下拉菜单内的Bootstrap列表行包装?

z—index总是 destruct 我的头,我该如何修复它?

NG8004:找不到名为""的管道.'' [插件Angular 编译器]

使用Cypress循环遍历不一致的父对象

如何将功能附加到嵌入式药剂中的按钮?

如何在R rmarkdown中创建循环中的分页表?

在TWebLabel标题中设置换行符/换行符的方法?

如何设计缠绕锚点元素的样式?

动画的停止和启动并不顺利

如何使用javascript在jsx中重复插入特殊字符?

我如何使用 html 在表格的单元格内实现下面显示的背景 colored颜色 加载器(请判断设计参考的图像链接)

Github上部署需要花费几小时时间:等待github pages部署批准

HTML、CSS设计图像出格

如何并排放置部分?

什么没有 margin-right 和 width:100% 溢出子元素到左边?

使用 sprite 的问题,字符 sprite 中的额外边距

暗模式转换器

如何使用 html 和 css 为卡片创建此背景框架

动态使用时波浪号不转换为绝对路径