Eu gosto bastante do padrão CSS embutido no React e decidi usá-lo.
No entanto, você não pode usar os :hover
seletores e similares. Então, qual é a melhor maneira de implementar o realce em foco enquanto usa estilos CSS embutidos?
Uma sugestão do #reactjs é ter um Clickable
componente e usá-lo assim:
<Clickable>
<Link />
</Clickable>
O Clickable
tem um hovered
estado e o passa como adereços para o Link. No entanto, o Clickable
(a maneira que eu implementei) envolve o Link
em um div
modo que possa definir onMouseEnter
e onMouseLeave
para ele. Isso torna as coisas um pouco complicadas (por exemplo, span
envolto em um div
comportamento diferentespan
).
Existe uma maneira mais simples?
onMouseEnter
eonMouseLeave
. Em relação à implementação exata disso - é inteiramente sua. Para examinar seu exemplo específico, por que não tornar o<Clickable/>
wrapper umspan
?Respostas:
Eu estou na mesma situação. Realmente gosto do padrão de manter o estilo nos componentes, mas os estados de foco parecem ser o último obstáculo.
O que eu fiz foi escrever um mixin que você pode adicionar ao seu componente que precisa de estados de foco. Este mixin adicionará uma nova
hovered
propriedade ao estado do seu componente. Será definido comotrue
se o usuário passar o mouse sobre o nó DOM principal do componente e configurá-lo de volta parafalse
se os usuários deixarem o elemento.Agora, na função de renderização de componentes, você pode fazer algo como:
Agora, sempre que o estado do
hovered
estado for alterado, o componente será renderizado novamente.Também criei um repositório de sandbox para isso, que eu mesmo uso para testar alguns desses padrões. Confira se você quiser ver um exemplo da minha implementação.
https://github.com/Sitebase/cssinjs/tree/feature-interaction-mixin
fonte
Acho que onMouseEnter e onMouseLeave são os caminhos a seguir, mas não vejo a necessidade de um componente adicional do wrapper. Aqui está como eu o implementei:
Em seguida, você pode usar o estado de foco (verdadeiro / falso) para alterar o estilo do link.
fonte
:hover
, mas não:focus
onFocus
evento; assim que você poderia fazer a mesma coisa para:focus
que:hover
, exceto em vez de precisaronMouseEnter
eonMouseLeave
se fosse única necessidadeonFocus
Tarde para a festa, mas vem com solução. Você pode usar "&" para definir estilos para pairar enésimo filho, etc:
fonte
Você pode usar o Radium - é uma ferramenta de código aberto para estilos embutidos com o ReactJS. Ele adiciona exatamente os seletores necessários. Muito popular, confira - Radium on npm
fonte
module.exports = React.createClass({ displayName: 'App',})
module.exports = Radium(React.createClass({ displayName: 'App',}))
ou atribuir a classe a um valor e adicionar o@Radium
decorador acima dele, conforme os documentos mencionam github.com/FormidableLabs/radium#usageO suporte total a CSS é exatamente o motivo pelo qual essa enorme quantidade de bibliotecas CSSinJS, para fazer isso com eficiência, você precisa gerar CSS real, não estilos embutidos. Também os estilos embutidos são muito mais lentos em reagir em um sistema maior. Isenção de responsabilidade - eu mantenho o JSS .
fonte
Feito o estilo - em parte - por esse motivo (outros discordam da implementação de outras bibliotecas / sintaxe e estilos embutidos, falta de suporte para prefixar valores de propriedade). Acreditamos que deveríamos simplesmente escrever CSS em JavaScript e ter componentes totalmente independentes HTML-CSS-JS. Com as strings de modelo ES5 / ES6, agora podemos e também pode ser bonito! :)
npm install style-it --save
Sintaxe funcional ( JSFIDDLE )
Sintaxe JSX ( JSFIDDLE )
fonte
Adicionando à resposta de Jonathan , aqui estão os eventos para abranger o foco e os estados ativos, e um uso em
onMouseOver
vez de , uma vezonMouseEnter
que o último não borbulha se você tiver algum elemento filho no destino ao qual o evento está sendo aplicado.fonte
Aqui está a minha solução usando React Hooks. Combina o operador de propagação e o operador ternário.
style.js
Button.js
fonte
Em relação aos componentes com estilo e ao react-router v4, você pode fazer o seguinte:
fonte
Isso pode ser um bom truque por ter estilo embutido dentro de um componente react (e também usar a função CSS hover):
fonte
Estilo de checkout se você estiver usando o React with Typescript.
Abaixo está um código de exemplo para: pairar
fonte
Você pode usar módulos css como uma alternativa e, adicionalmente, react-css-modules para o mapeamento de nomes de classes.
Dessa forma, você pode importar seus estilos da seguinte maneira e usar o css normal com escopo local para seus componentes:
Aqui está um exemplo de módulos webpack css
fonte
:hover
estilos em tempo de execução como você pode com Radium ou outraonMouseOver
solução baseadaonMouseOver e onMouseLeave com setState pareciam um pouco de sobrecarga para mim - mas como é assim que a reação funciona, parece a solução mais fácil e limpa para mim.
renderizar um servidor css com tema, por exemplo, também é uma boa solução e mantém os componentes de reação mais limpos.
se você não precisar anexar estilos dinâmicos a elementos (por exemplo, para um tema), não deverá usar estilos inline, mas sim classes css.
essa é uma regra tradicional de html / css para manter o html / JSX limpo e simples.
fonte
A maneira simples é usar o operador ternário
fonte
Com o uso dos ganchos:
fonte
Eu uso uma solução bastante hack-ish para isso em um dos meus aplicativos recentes que funciona para meus propósitos, e acho mais rápido do que escrever funções personalizadas de configurações de foco instantâneo no vanilla js (embora reconheço, talvez não seja a melhor prática na maioria dos ambientes) ..) Então, caso você ainda esteja interessado, aqui vai.
Eu crio um elemento pai apenas para manter os estilos javascript embutidos e, em seguida, um filho com um className ou ID no qual minha folha de estilo css se prende e grava o estilo hover no meu arquivo css dedicado. Isso funciona porque o elemento filho mais granular recebe os estilos js inline por herança, mas tem seus estilos de foco substituídos pelo arquivo css.
Então, basicamente, meu arquivo css real existe com o único objetivo de conter efeitos de foco, nada mais. Isso o torna bastante conciso e fácil de gerenciar, e me permite fazer o trabalho pesado em meus estilos de componentes React em linha.
Aqui está um exemplo:
Observe que o estilo embutido "filho" não possui um conjunto de propriedades "cor". Se isso acontecesse, isso não funcionaria porque o estilo embutido teria precedência sobre minha folha de estilo.
fonte
Não tenho 100% de certeza se essa é a resposta, mas é o truque que uso para simular o efeito CSS: hover com cores e imagens embutidas.
CSS:
Exemplo: https://codepen.io/roryfn/pen/dxyYqj?editors=0011
fonte
Onde Hoverable é definido como:
fonte