在 JSX 中悬停时更改图像

Posted

技术标签:

【中文标题】在 JSX 中悬停时更改图像【英文标题】:Change image on hover in JSX 【发布时间】:2018-07-20 02:05:09 【问题描述】:

如何在 JSX 中更改 hover 上的图像

我正在尝试这样的事情:

<img src=require('../../../common/assets/network-inactive.png')
onMouseOver=this.src = require('../../../common/assets/network.png')
onMouseOut=this.src = require('../../../common/assets/network-inactive.png') />

【问题讨论】:

【参考方案1】:

我将假设您正在 React 组件中编写此代码。如:

class Welcome extends React.Component 
  render() 
    return (
       <img src=require('../../../common/assets/network-inactive.png')
       onMouseOver=this.src = require('../../../common/assets/network.png')
       onMouseOut=this.src = require('../../../common/assets/network-inactive.png') 
       />
    );
  

在这种情况下,定位 this.src 将不起作用,因为您实际上是在课堂上寻找名为 src 的东西。例如this.src 可以找到这样的东西:

src = () => (alert("a source"))

但这不是你想要做的。您想要定位图像本身。

因此您需要输入&lt;img /&gt; 上下文。您可以像这样轻松地做到这一点:

 <img
    onMouseOver=e => console.log(e)
  />

您可以从那里定位currentTarget 属性等。这将进入元素的上下文。所以现在你可以这样做:

  <img
    src="img1"
    onMouseOver=e => (e.currentTarget.src = "img2")
  />

onMouseOut 也可以这样做。

您可以在其他元素上使用相同的方法,因为您肯定需要再次这样做。但要小心,因为这不是唯一的解决方案。在更大的项目中,您可能需要考虑使用商店 (Redux),并传递道具而不是改变元素。

【讨论】:

谢谢,这正是我后来意识到的。我宁愿用 CSS 的方式来解决这个问题。是的,我在项目中使用 redux,我会实施你的建议。 不客气@new-boy-in-web-dev-business :) 我为你感到高兴。 @TypeKev 那么在哪种情况下this.src 会起作用?期待您的评论。 @hardy,对不起,我现在才看到你的回复。我有点晚了,但是在这种情况下,要在 img 上下文中完成 props 的突变,您需要编写一个名为 src 的函数,它基本上可以完成@ new-boy-in-web-dev-business 正在做的事情排队。即在你的类中有一个名为src 的函数:src = ( currentTarget: src ) =&gt; src = "img2"。这将完成同样的事情 - 将 currentTarget(即img 元素)的 src 设置为 'img2' :)【参考方案2】:

最好是在状态下管理这个:

class App extends Component 
  state = 
    img: "https://i.vimeocdn.com/portrait/58832_300x300"
  

  render() 
    return (
      <div style=styles>
        <img
          src=this.state.img
          onMouseEnter=() => 
            this.setState(
              img: "http://www.toptipsclub.com/Images/page-img/keep-calm-and-prepare-for-a-test.png"
            )
          

          onMouseOut=() => 
            this.setState(
              img: "https://i.vimeocdn.com/portrait/58832_300x300"
            )
          
        />
      </div>
    )
  
;

https://codesandbox.io/s/5437qm907l

【讨论】:

我的是一个无状态组件(Functional Component)。【参考方案3】:

这是一种使用功能组件和打字稿的非类方法:

interface IconProps 
  src?: string;
  srcOnHover?: string;
  alt?: string;


const Icon: React.FC<IconProps> = ( src, srcOnHover, alt ) => (
  <img
    src=src
    alt=alt
    onMouseOver=(e): void => 
      srcOnHover && (e.currentTarget.src = srcOnHover);
    
    onMouseOut=(e): void => 
      srcOnHover && (e.currentTarget.src = src || '');
    
  />
);

可以这样使用:

<Icon src="path/to/image.png" srcOnHover="path/to/hover-image.png"  />

【讨论】:

【参考方案4】:

另一种非类方法:

import arrow from "../images/arrow.svg";
import arrowHover from "../images/arrowHover.svg";

function Arrow() 
  const [over, setOver] = useState(false);
  return (
    <div
      onMouseOver=() => setOver(true)
      onMouseOut=() => setOver(false)
    >
         <img
          src=over ? arrowHover : arrow
          
          
          
        />
    </div>   
  )

【讨论】:

【参考方案5】:

简单的方法:

class Home 扩展 React.Component 状态 = 图标:ICON_ONE

渲染() 返回( this.setState(icon:ICON_TWO) onMouseOut=() => this.setState( icon: ICON_ONE ) /> )

【讨论】:

以上是关于在 JSX 中悬停时更改图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WPF 中悬停时更改图像?

如何在悬停时更改背景图像?

如何使用 SVG 更改悬停时的图像源?

在悬停其他元素时更改身体背景图像/渐变

CSS样式:悬停时如何更改图像?

如何在悬停时更改图像源?