javascript - Hur svävar man i ReactJS? - onMouseLeave registreras inte vid snabb svävning över
Hur kan du uppnå antingen ett hover-event eller ett aktivt event i ReactJS när du använder inline-styling?
Jag har upptäckt att onMouseEnter- och onMouseLeave-metoden är buggig, så jag hoppas att det finns ett annat sätt att göra det på.
Specifikt, om du för muspekaren över en komponent mycket snabbt, registreras endast onMouseEnter-händelsen. OnMouseLeave utlöses aldrig och kan därför inte uppdatera tillståndet... vilket får komponenten att se ut som om den fortfarande hovras över. Jag har märkt samma sak om du försöker efterlikna ":active" CSS-pseudoklassen. Om du klickar väldigt snabbt registreras endast onMouseDown-händelsen. OnMouseUp-händelsen ignoreras... vilket får komponenten att se aktiv ut.
Här är en JSFiddle som visar problemet: https://jsfiddle.net/y9swecyu/5/
Koden:
var Hover = React.createClass({
getInitialState: function() {
return {
hover: false
};
},
onMouseEnterHandler: function() {
this.setState({
hover: true
});
console.log('enter');
},
onMouseLeaveHandler: function() {
this.setState({
hover: false
});
console.log('leave');
},
render: function() {
var inner = normal;
if(this.state.hover) {
inner = hover;
}
return (
<div style={outer}>
<div style={inner}
onMouseEnter={this.onMouseEnterHandler}
onMouseLeave={this.onMouseLeaveHandler} >
{this.props.children}
</div>
</div>
);
}
});
var outer = {
height: '120px',
width: '200px',
margin: '100px',
backgroundColor: 'green',
cursor: 'pointer',
position: 'relative'
}
var normal = {
position: 'absolute',
top: 0,
bottom: 0,
left: 0,
right: 0,
backgroundColor: 'red',
opacity: 0
}
var hover = {
position: 'absolute',
top: 0,
bottom: 0,
left: 0,
right: 0,
backgroundColor: 'red',
opacity: 1
}
React.render(
<Hover></Hover>,
document.getElementById('container')
)
Svar #1
Har du provat någon av de här?
onMouseDown onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp
SyntheticEvent
det nämner också följande:
React normaliserar händelser så att de har konsekventa egenskaper över olika webbläsare.
Nedanstående händelsehanterare triggas av en händelse i bubblande fas. För att registrera en händelsehanterare för fångstfasen, lägg till Capture till händelsens namn; till exempel, istället för att använda onClick, skulle du använda onClickCapture för att hantera klickhändelsen i fångstfasen.
Svar #2
De tidigare svaren är ganska förvirrande. Du behöver inte ett react-state för att lösa detta, inte heller något speciellt externt bibliotek. Det kan uppnås med ren CSS/Sass:
Stilen:
.hover {
position: relative;
&:hover &__no-hover {
opacity: 0;
}
&:hover &__hover {
opacity: 1;
}
&__hover {
position: absolute;
top: 0;
opacity: 0;
}
&__no-hover {
opacity: 1;
}
}
React-komponenten
En enkel Hover ren-renderingsfunktion:
const Hover = ({ onHover, children }) => (
<div className="hover">
<div className="hover__no-hover">{children}</div>
<div className="hover__hover">{onHover}</div>
</div>
)
Användning
Använd det sedan så här:
<Hover onHover={<div> Show this on hover </div>}>
<div> Show on no hover </div>
</Hover>
Svar #3
du kan använda onMouseOver={this.onToggleOpen} och onMouseOut={this.onToggleOpen} för att musa över och ut på komponenten
Svar #4
Observera: Detta svar var för en tidigare version av denna fråga där den som ställde frågan försökte använda JavaScript för att tillämpa css-stilar… vilket enkelt kan göras med CSS.
En enkel css-endast lösning.
För att använda grundläggande stilar är CSS enklare och mer presterande än JS-lösningar 99 % av tiden. (Även om mer moderna CSS-i-JS-lösningar - t.ex. React-komponenter osv - kan anses vara mer underhållbara.)
Kör denna kodsnutt för att se den i aktion…
.hover-button .hover-button--on,
.hover-button:hover .hover-button--off {
display: none;
}
.hover-button:hover .hover-button--on {
display: inline;
}<button class='hover-button'>
<span class='hover-button--off'>Default</span>
<span class='hover-button--on'>Hover!</span>
</button>Svar #5
Om du kan skapa en liten demonstration som visar buggen med onMouseEnter/onMouseLeave eller onMouseDown/onMouseUp, skulle det vara värt att posta den på ReactJS:s issues-sida eller mailinglista, bara för att väcka frågan och höra vad utvecklarna har att säga om det.
I ditt användningsfall verkar du antyda att CSS :hover- och :active-tillstånd skulle vara tillräckliga för dina ändamål, så jag föreslår att du använder dem. CSS är flera storleksordningar snabbare och mer pålitligt än Javascript, eftersom det är direkt implementerat i webbläsaren.
Men :hover- och :active-tillstånd kan inte specificeras i inline-stilar. Vad du kan göra är att tilldela ett ID eller ett klassnamn till dina element och skriva dina stilar antingen i ett stylesheet, om de är något konstanta i din applikation, eller i en dynamiskt genererad <style>-tagg.
Här är ett exempel på den senare tekniken: https://jsfiddle.net/ors1vos9/
