当光标在 React JS 中的组件上快速移动时如何管理状态值?
How to manage State values when cursor is moving fast over a component in React JS?
我正在尝试设置光标是否在组件上时的状态值。
toggleIcon = () => {
this.setState({ isMouseOver: !this.state.isMouseOver });
};
...
<div
onMouseEnter={() => this.toggleIcon()}
onMouseLeave={() => this.toggleIcon()}
>
{isMouseOver ? (
<InfoIcon />
) : (
<NormalIcon />
)}
</div>
当我以正常速度将光标移到该组件上时,它运行良好。
但是如果我快速移动光标,只会触发 onMouseEnter
事件而不是 onMouseLeave
事件。
顺便说一句,即使光标不在该组件上,InfoIcon
也不会更改为 NormalIcon
。
如果 toggleIcon
函数中没有状态管理,即使光标在组件上快速移动也会触发这两个事件。
请告诉我哪里出了问题,我该如何解决。
谢谢。 :)
尝试显式传递您想要的状态而不是切换它。
toggleIcon = isMouseOver => this.setState({ isMouseOver });
...
onMouseEnter={() => this.toggleIcon(true)}
onMouseExit={() => this.toggleIcon(false)}
const NormalIcon = () => (<div> Normal </div>)
const InfoIcon = () => (<div> Info </div>)
class Thing extends React.Component {
state = { isMouseOver: false };
toggleIcon = () => this.setState(prevState => ({ isMouseOver: !prevState.isMouseOver }));
render = () => {
const { isMouseOver } = this.state;
return (
<div
onMouseEnter={this.toggleIcon}
onMouseLeave={this.toggleIcon}
>
{isMouseOver ? <InfoIcon /> : <NormalIcon />}
</div>
)
}
}
ReactDOM.render(<Thing />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root" />
看起来像预期的那样工作。我在 toggleIcon
中更改了您的 setState
以使用函数而不是对象,但除此之外,它似乎还不错...
您可以使用 :hover 效果来更改背景图片。
我正在尝试设置光标是否在组件上时的状态值。
toggleIcon = () => {
this.setState({ isMouseOver: !this.state.isMouseOver });
};
...
<div
onMouseEnter={() => this.toggleIcon()}
onMouseLeave={() => this.toggleIcon()}
>
{isMouseOver ? (
<InfoIcon />
) : (
<NormalIcon />
)}
</div>
当我以正常速度将光标移到该组件上时,它运行良好。
但是如果我快速移动光标,只会触发 onMouseEnter
事件而不是 onMouseLeave
事件。
顺便说一句,即使光标不在该组件上,InfoIcon
也不会更改为 NormalIcon
。
如果 toggleIcon
函数中没有状态管理,即使光标在组件上快速移动也会触发这两个事件。
请告诉我哪里出了问题,我该如何解决。 谢谢。 :)
尝试显式传递您想要的状态而不是切换它。
toggleIcon = isMouseOver => this.setState({ isMouseOver });
...
onMouseEnter={() => this.toggleIcon(true)}
onMouseExit={() => this.toggleIcon(false)}
const NormalIcon = () => (<div> Normal </div>)
const InfoIcon = () => (<div> Info </div>)
class Thing extends React.Component {
state = { isMouseOver: false };
toggleIcon = () => this.setState(prevState => ({ isMouseOver: !prevState.isMouseOver }));
render = () => {
const { isMouseOver } = this.state;
return (
<div
onMouseEnter={this.toggleIcon}
onMouseLeave={this.toggleIcon}
>
{isMouseOver ? <InfoIcon /> : <NormalIcon />}
</div>
)
}
}
ReactDOM.render(<Thing />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root" />
看起来像预期的那样工作。我在 toggleIcon
中更改了您的 setState
以使用函数而不是对象,但除此之外,它似乎还不错...
您可以使用 :hover 效果来更改背景图片。