如何访问 reactjs 中的悬停状态?
How can I access a hover state in reactjs?
我有一个 sidenav 和一群篮球队。因此,当其中一个团队悬停时,我想为每个团队显示不同的内容。此外,我正在使用 Reactjs,所以如果我可以有一个变量,我可以将其传递给另一个很棒的组件。
React 组件在其顶级界面中公开所有标准 Javascript 鼠标事件。当然,您仍然可以在 CSS 中使用 :hover
,这可能足以满足您的某些需求,但对于悬停触发的更高级行为,您需要使用 Javascript。因此,要管理悬停交互,您需要使用 onMouseEnter
和 onMouseLeave
。然后将它们附加到组件中的处理程序,如下所示:
<ReactComponent
onMouseEnter={() => this.someHandler}
onMouseLeave={() => this.someOtherHandler}
/>
然后您将使用 state/props 的某种组合将更改的状态或属性传递给您的子 React 组件。
ReactJs 为鼠标事件定义了以下合成事件:
onClick onContextMenu onDoubleClick onDrag onDragEnd onDragEnter onDragExit
onDragLeave onDragOver onDragStart onDrop onMouseDown onMouseEnter onMouseLeave
onMouseMove onMouseOut onMouseOver onMouseUp
如您所见,没有悬停事件,因为浏览器本身没有定义悬停事件。
您需要为悬停行为添加 onMouseEnter 和 onMouseLeave 处理程序。
我知道接受的答案很好,但对于任何正在寻找悬停感觉的人来说,您可以在 mouseover
上使用 setTimeout
并将句柄保存在地图中(假设列表 ID来设置超时句柄)。在 mouseover
从 setTimeout 中清除句柄并将其从映射中删除
onMouseOver={() => this.onMouseOver(someId)}
onMouseOut={() => this.onMouseOut(someId)
并按如下方式实现地图:
onMouseOver(listId: string) {
this.setState({
... // whatever
});
const handle = setTimeout(() => {
scrollPreviewToComponentId(listId);
}, 1000); // Replace 1000ms with any time you feel is good enough for your hover action
this.hoverHandleMap[listId] = handle;
}
onMouseOut(listId: string) {
this.setState({
... // whatever
});
const handle = this.hoverHandleMap[listId];
clearTimeout(handle);
delete this.hoverHandleMap[listId];
}
地图是这样的,
hoverHandleMap: { [listId: string]: NodeJS.Timeout } = {};
我更喜欢onMouseOver
和onMouseOut
,因为它也适用于HTMLElement
中的所有children。如果不需要,您可以分别使用 onMouseEnter
和 onMouseLeave
。
要获得悬停效果,您可以简单地尝试此代码
import React from "react";
import "./styles.css";
export default function App() {
function MouseOver(event) {
event.target.style.background = 'red';
}
function MouseOut(event){
event.target.style.background="";
}
return (
<div className="App">
<button onMouseOver={MouseOver} onMouseOut={MouseOut}>Hover over me!</button>
</div>
);
}
或者如果你想使用 useState() 钩子来处理这种情况,那么你可以试试这段代码
import React from "react";
import "./styles.css";
export default function App() {
let [over,setOver]=React.useState(false);
let buttonstyle={
backgroundColor:''
}
if(over){
buttonstyle.backgroundColor="green";
}
else{
buttonstyle.backgroundColor='';
}
return (
<div className="App">
<button style={buttonstyle}
onMouseOver={()=>setOver(true)}
onMouseOut={()=>setOver(false)}
>Hover over me!</button>
</div>
);
}
以上两段代码都适用于悬停效果,但第一个过程更容易编写和理解
这对 OP 不起作用,因为他们想要一个变量,但对于那些只想要 UI 悬停效果的人来说,通常更容易坚持使用 CSS。
下面的示例将在鼠标悬停在某个项目上时显示一个删除按钮:
<div className="revealer">
<div>
{itemName}
</div>
<div className="hidden">
<Btn label="Delete"/>
</div>
</div>
.hidden {
display: none;
}
.revealer:hover .hidden {
display: block;
}
父 div 有 revealer
class。当它悬停在上面时,它会显示 hidden
div。 Hidden div 必须嵌套在 reveerer div.
中
您可以使用 stolli 和 BentOnCoding 上面建议的那些事件来实现您自己的组件逻辑,或者使用名为 react-hover
的模块
if I could have a variable that I could pass to another component that would be awesome.
然后你可以简单地包装另一个组件
<ReactHover options={optionsCursorTrueWithMargin}>
<Trigger type="trigger">
<TriggerComponent />
</Trigger>
<Hover type="hover">
<HoverComponent />
</Hover>
</ReactHover>
或者你的普通 HTML:
<ReactHover options={optionsCursorTrueWithMargin}>
<Trigger type="trigger">
<h1 style={{ background: '#abbcf1', width: '200px' }}> Hover on me </h1>
</Trigger>
<Hover type="hover">
<h1> I am hover HTML </h1>
</Hover>
</ReactHover>
此处演示代码:demo
您可以尝试实现以下代码。悬停功能可以通过工具提示实现。
请参考下面的代码和 link 为了清楚起见
https://mui.com/material-ui/react-tooltip/
import * as React from 'react';
import DeleteIcon from '@mui/icons-material/Delete';
import IconButton from '@mui/material/IconButton';
import Tooltip from '@mui/material/Tooltip';
export default function BasicTooltip() {
return (
<Tooltip title="Delete">
<IconButton>
<DeleteIcon />
</IconButton>
</Tooltip>
);
}
我有一个 sidenav 和一群篮球队。因此,当其中一个团队悬停时,我想为每个团队显示不同的内容。此外,我正在使用 Reactjs,所以如果我可以有一个变量,我可以将其传递给另一个很棒的组件。
React 组件在其顶级界面中公开所有标准 Javascript 鼠标事件。当然,您仍然可以在 CSS 中使用 :hover
,这可能足以满足您的某些需求,但对于悬停触发的更高级行为,您需要使用 Javascript。因此,要管理悬停交互,您需要使用 onMouseEnter
和 onMouseLeave
。然后将它们附加到组件中的处理程序,如下所示:
<ReactComponent
onMouseEnter={() => this.someHandler}
onMouseLeave={() => this.someOtherHandler}
/>
然后您将使用 state/props 的某种组合将更改的状态或属性传递给您的子 React 组件。
ReactJs 为鼠标事件定义了以下合成事件:
onClick onContextMenu onDoubleClick onDrag onDragEnd onDragEnter onDragExit
onDragLeave onDragOver onDragStart onDrop onMouseDown onMouseEnter onMouseLeave
onMouseMove onMouseOut onMouseOver onMouseUp
如您所见,没有悬停事件,因为浏览器本身没有定义悬停事件。
您需要为悬停行为添加 onMouseEnter 和 onMouseLeave 处理程序。
我知道接受的答案很好,但对于任何正在寻找悬停感觉的人来说,您可以在 mouseover
上使用 setTimeout
并将句柄保存在地图中(假设列表 ID来设置超时句柄)。在 mouseover
从 setTimeout 中清除句柄并将其从映射中删除
onMouseOver={() => this.onMouseOver(someId)}
onMouseOut={() => this.onMouseOut(someId)
并按如下方式实现地图:
onMouseOver(listId: string) {
this.setState({
... // whatever
});
const handle = setTimeout(() => {
scrollPreviewToComponentId(listId);
}, 1000); // Replace 1000ms with any time you feel is good enough for your hover action
this.hoverHandleMap[listId] = handle;
}
onMouseOut(listId: string) {
this.setState({
... // whatever
});
const handle = this.hoverHandleMap[listId];
clearTimeout(handle);
delete this.hoverHandleMap[listId];
}
地图是这样的,
hoverHandleMap: { [listId: string]: NodeJS.Timeout } = {};
我更喜欢onMouseOver
和onMouseOut
,因为它也适用于HTMLElement
中的所有children。如果不需要,您可以分别使用 onMouseEnter
和 onMouseLeave
。
要获得悬停效果,您可以简单地尝试此代码
import React from "react";
import "./styles.css";
export default function App() {
function MouseOver(event) {
event.target.style.background = 'red';
}
function MouseOut(event){
event.target.style.background="";
}
return (
<div className="App">
<button onMouseOver={MouseOver} onMouseOut={MouseOut}>Hover over me!</button>
</div>
);
}
或者如果你想使用 useState() 钩子来处理这种情况,那么你可以试试这段代码
import React from "react";
import "./styles.css";
export default function App() {
let [over,setOver]=React.useState(false);
let buttonstyle={
backgroundColor:''
}
if(over){
buttonstyle.backgroundColor="green";
}
else{
buttonstyle.backgroundColor='';
}
return (
<div className="App">
<button style={buttonstyle}
onMouseOver={()=>setOver(true)}
onMouseOut={()=>setOver(false)}
>Hover over me!</button>
</div>
);
}
以上两段代码都适用于悬停效果,但第一个过程更容易编写和理解
这对 OP 不起作用,因为他们想要一个变量,但对于那些只想要 UI 悬停效果的人来说,通常更容易坚持使用 CSS。
下面的示例将在鼠标悬停在某个项目上时显示一个删除按钮:
<div className="revealer">
<div>
{itemName}
</div>
<div className="hidden">
<Btn label="Delete"/>
</div>
</div>
.hidden {
display: none;
}
.revealer:hover .hidden {
display: block;
}
父 div 有 revealer
class。当它悬停在上面时,它会显示 hidden
div。 Hidden div 必须嵌套在 reveerer div.
您可以使用 stolli 和 BentOnCoding 上面建议的那些事件来实现您自己的组件逻辑,或者使用名为 react-hover
的模块if I could have a variable that I could pass to another component that would be awesome.
然后你可以简单地包装另一个组件
<ReactHover options={optionsCursorTrueWithMargin}>
<Trigger type="trigger">
<TriggerComponent />
</Trigger>
<Hover type="hover">
<HoverComponent />
</Hover>
</ReactHover>
或者你的普通 HTML:
<ReactHover options={optionsCursorTrueWithMargin}>
<Trigger type="trigger">
<h1 style={{ background: '#abbcf1', width: '200px' }}> Hover on me </h1>
</Trigger>
<Hover type="hover">
<h1> I am hover HTML </h1>
</Hover>
</ReactHover>
此处演示代码:demo
您可以尝试实现以下代码。悬停功能可以通过工具提示实现。 请参考下面的代码和 link 为了清楚起见 https://mui.com/material-ui/react-tooltip/
import * as React from 'react';
import DeleteIcon from '@mui/icons-material/Delete';
import IconButton from '@mui/material/IconButton';
import Tooltip from '@mui/material/Tooltip';
export default function BasicTooltip() {
return (
<Tooltip title="Delete">
<IconButton>
<DeleteIcon />
</IconButton>
</Tooltip>
);
}