在 React 中单击卡片图标时阻止链接激活

Prevent Link from activating on click on card icon in React

提问人:Hi - P 提问时间:9/18/2023 更新时间:9/20/2023 访问量:58

问:

我有一张卡片,包裹在 .里面是卡片的 div,div 是相对定位的。在卡片 div 内部是一个绝对位于卡片上的图标,单击该图标时应该会改变背景颜色。现在的问题是,单击图标也会单击我不想要的图标。我尝试使用,但它也会阻止所有后续事件再次正确触发,因为我希望能够在单击图标时随时翻转图标的背景颜色。我试过了,但它们似乎不起作用。Linkreact-router-dom@v5LinkLinke.preventDefault()e.stopPropagation()e.nativeEvent.stopImmediatePropagation

我也经历了几个 SO 答案,但似乎没有一个能解决我的问题。


 function handleFavClick(event) {
    event.stopPropagation();
    console.log(event);
 }

 <Link to={`/movies/${movie.id}`} key={movie.id}>

      <div 
        className="card"
        key={movie.id}
      >
        <img 
          src="/heart-icon.png"
          alt="heart icon"
          onClick={handleFavClick}
        />
        <img 
          src="/card-image.png"
          alt="original card image"

        />
      </div>  
 </Link>

可能是什么问题?

JavaScript ReactJS 事件处理

评论

0赞 TP95 9/18/2023
如果您只是想在单击图标时更改背景颜色,为什么要放置链接?这个组件的一些图片将有助于更好地了解你要做什么
0赞 Hi - P 9/18/2023
该链接指向有关该卡的详细信息页面。我想在单击图标时更改它的背景颜色。
0赞 Hi - P 9/18/2023
我最初想做的是创建一张电影卡,其中包含一张图像和一个绝对位于卡片上的收藏图标,这是我有问题的那个。当用户单击收藏夹图标时,更改其背景以指示该图标已保存。将卡片包裹在卡片中将指向一个包含电影详细信息的页面。但我希望用户能够点击收藏夹图标,而不必先转到详细信息页面。Link

答:

0赞 Onoriode 9/18/2023 #1

Event.preventDefault()在提交表单时起作用,以防止页面重新加载。 除此之外,不要点击链接标签,您应该从链接标签中删除img标签。react-router-dom

import { Link } from "react-router-dom"

const onClickFunction = () =>{

const handleFavClick = (event) =>{
    event.preventDefault() 
    console.log(event);
 }

return (
  <>
  <Link to={`/movies/${movie.id}`} key={movie.id}>
     <div className="card" key={movie.id}>
     <img src="/card-image.png" alt="original card image"/>
     </div>  
 </Link>
 <img src="/heart-icon.png" alt="heart icon" onClick={handleFavClick}/>
 </>
);
}

export default onClickFunction;

评论

0赞 Hi - P 9/18/2023
谢谢。我也试过了。它工作不正确。当我单击该图标时,它会发生变化,不会触发任何其他内容。如果我再次单击它以翻转背景颜色,它不会检测到单击,直到我单击图标中的外部区域。e.preventDefault()
0赞 Hi - P 9/18/2023
我已经尝试了你的建议。将图标从卡片中取出有点工作,并停止点击卡片。图标从文档中取出,因为我想将图标放在卡片上,就像在设计中一样。
0赞 Nikhil Prajapati 9/18/2023 #2

为了防止在单击心形图标时触发 ,同时仍然允许函数执行,您可以用 包装 并将事件处理程序放在该 上。这样,单击心形图标不会触发 .下面是代码的更新版本:LinkhandleFavClickLinkdivonClickdivLink

<div onClick={() => handleFavClick(movie.id)}>
  <Link to={`/movies/${movie.id}`} key={movie.id}>
    <div className="card" key={movie.id}>
      <img src="/heart-icon.png" alt="heart icon" />
      <img src="/card-image.png" alt="original card image" />
    </div>
  </Link>
</div>
0赞 Hi - P 9/19/2023 #3

终于弄清楚了问题所在。这是因为,在我的 CSS 中,我使用了悬停和焦点样式,即使在单击切换收藏夹图标的背景颜色后,该样式仍在反映。