Como você pode obter um evento hover ou um evento ativo no ReactJS ao fazer estilização embutida?
Descobri que a abordagem onMouseEnter, onMouseLeave tem bugs, então espero que haja outra maneira de fazer isso.
Especificamente, se você passar o mouse sobre um componente muito rapidamente, apenas o evento onMouseEnter será registrado. O onMouseLeave nunca dispara e, portanto, não pode atualizar o estado ... deixando o componente parecer como se ainda estivesse sendo pairado sobre ele. Eu percebi a mesma coisa se você tentar imitar a pseudo classe css ": active". Se você clicar muito rápido, apenas o evento onMouseDown será registrado. O evento onMouseUp será ignorado ... deixando o componente aparecendo ativo.
Aqui está um JSFiddle mostrando o problema: https://jsfiddle.net/y9swecyu/5/
Vídeo do JSFiddle com problema: https://vid.me/ZJEO
O código:
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')
)
fonte
Respostas:
Você já experimentou algum desses?
onMouseDown onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp
SyntheticEvent
também menciona o seguinte:
O React normaliza eventos para que tenham propriedades consistentes em diferentes navegadores.
Os manipuladores de eventos abaixo são acionados por um evento na fase de bolhas. Para registrar um manipulador de eventos para a fase de captura, anexe Capture ao nome do evento; por exemplo, em vez de usar onClick, você usaria onClickCapture para manipular o evento de clique na fase de captura.
fonte
The onMouseEnter and onMouseLeave events propagate from the element being left to the one being entered instead of ordinary bubbling and do not have a capture phase.
As respostas anteriores são muito confusas. Você não precisa de um estado de reação para resolver isso, nem de qualquer biblioteca externa especial. Isso pode ser alcançado com puro css / sass:
O estilo:
O Componente React
Uma
Hover
função de renderização pura simples :Uso
Em seguida, use-o assim:
fonte
você pode usar
onMouseOver={this.onToggleOpen}
eonMouseOut={this.onToggleOpen}
refletir sobre o componentefonte
Se você puder produzir uma pequena demonstração mostrando o bug onMouseEnter / onMouseLeave ou onMouseDown / onMouseUp, valeria a pena postá-lo na página de problemas do ReactJS ou na lista de e-mails, apenas para levantar a questão e ouvir o que os desenvolvedores têm a dizer sobre isso.
Em seu caso de uso, você parece sugerir que os estados CSS: hover e: active seriam suficientes para seus propósitos, então sugiro que você os use. CSS é muito mais rápido e confiável do que Javascript, porque é implementado diretamente no navegador.
No entanto, os estados: hover e: active não podem ser especificados em estilos embutidos. O que você pode fazer é atribuir um ID ou um nome de classe aos seus elementos e escrever seus estilos em uma folha de estilo, se eles forem constantes em seu aplicativo, ou em uma
<style>
tag gerada dinamicamente .Aqui está um exemplo da última técnica: https://jsfiddle.net/ors1vos9/
fonte
Uma
css
solução simples .Para aplicar estilos básicos, CSS é mais simples e tem mais desempenho que as soluções JS 99% das vezes. (Embora as soluções CSS-in-JS mais modernas - por exemplo, componentes do React etc. - sejam indiscutivelmente mais fáceis de manter.)
Execute este snippet de código para vê-lo em ação ...
fonte
more performant that JS solutions 99% of the time
Não é verdade. leia artigos desmascarando esse mito. você tem alguma fonte?Acabei de encontrar o mesmo problema ao ouvir eventos onMouseLeave em um botão desativado. Eu trabalhei em torno disso ouvindo o evento de mouseleave nativo em um elemento que envolve o botão desativado.
Aqui está um violino https://jsfiddle.net/qfLzkz5x/8/
fonte
onMouseLeave
-EventoUm pacote chamado
styled-components
pode resolver este problema de maneira ELEGANTE .Referência
Exemplo
fonte
Você não pode com o estilo embutido sozinho. Não recomendo reimplementar os recursos CSS em JavaScript, pois já temos uma linguagem extremamente poderosa e incrivelmente rápida construída para este caso de uso - CSS. Então use! Made Style It para ajudar.
npm install style-it --save
Sintaxe funcional ( JSFIDDLE )
Sintaxe JSX ( JSFIDDLE )
fonte
Use Radium !
A seguir está um exemplo de seu site:
fonte
Eu usaria onMouseOver e onMouseOut. Causa em reação
Aqui está na documentação do React para eventos de mouse.
fonte
Tive um problema semelhante quando onMouseEnter foi chamado, mas às vezes o evento onMouseLeave correspondente não foi disparado. Esta é uma solução alternativa que funciona bem para mim (depende parcialmente do jQuery):
Veja no jsfiddle: http://jsfiddle.net/qtbr5cg6/1/
Por que isso estava acontecendo (no meu caso): estou executando uma animação de rolagem jQuery (através
$('#item').animate({ scrollTop: 0 })
) ao clicar no item. Portanto, o cursor não sai do item "naturalmente", mas durante uma animação baseada em JavaScript ... e neste caso o onMouseLeave não foi disparado corretamente pelo React (React 15.3.0, Chrome 51, Desktop)fonte
Eu sei que já faz um tempo desde que esta pergunta foi feita, mas acabei de encontrar o mesmo problema de inconsistência com onMouseLeave () O que fiz foi usar onMouseOut () para a lista suspensa e, ao sair do mouse, para todo o menu, é confiável e funciona sempre que o testei. Eu vi os eventos aqui na documentação: https://facebook.github.io/react/docs/events.html#mouse-events aqui está um exemplo usando https://www.w3schools.com/bootstrap/bootstrap_dropdowns.asp :
fonte
Eu pessoalmente uso o Style It para o estilo inline no React ou mantenho meu estilo separadamente em um arquivo CSS ou SASS ...
Mas se você estiver realmente interessado em fazer isso in-line, olhe para a biblioteca, eu compartilho alguns dos usos abaixo:
No componente :
Produto :
Além disso, você pode usar variáveis JavaScript com foco em seu CSS como abaixo:
E o resultado é o seguinte:
fonte
Eu pessoalmente acho o uso do Emotion para gerenciar esses estilos. Emotion é uma biblioteca CSS-in-JS que pode tornar o gerenciamento de estilos React mais conveniente, dependendo de sua preferência, ao contrário de estilos embutidos como você tem em seu exemplo. Aqui você poderá encontrar mais informações sobre ele https://emotion.sh/docs/introduction espero que isso ajude você.
Aqui está um exemplo simples de emoção que adiciona um ponteiro e uma mudança de cor a um div ao passar o mouse:
fonte