Bardzo podoba mi się wbudowany wzorzec CSS w Reakcie i zdecydowałem się go użyć.
Nie możesz jednak używać :hover
selektorów i podobnych. Jaki jest więc najlepszy sposób na zaimplementowanie podświetlania po najechaniu kursorem podczas używania wbudowanych stylów CSS?
Jedną z sugestii od #reactjs jest posiadanie Clickable
komponentu i używanie go w następujący sposób:
<Clickable>
<Link />
</Clickable>
Clickable
Ma hovered
stan i przekazuje je jako rekwizyty do linku. Jednak Clickable
(sposób, w jaki to zaimplementowałem) zawija element Link
a, div
aby można go było ustawić onMouseEnter
i onMouseLeave
do niego. To jednak trochę komplikuje sprawę (np. span
Opakowany div
zachowuje się inaczej niż span
).
Czy jest prostszy sposób?
onMouseEnter
ionMouseLeave
. Jeśli chodzi o dokładną implementację - to zależy wyłącznie od Ciebie. Aby spojrzeć na twój konkretny przykład, dlaczego nie uczynić<Clickable/>
opakowaniaspan
?Odpowiedzi:
Jestem w tej samej sytuacji. Naprawdę podoba mi się wzór utrzymywania stylizacji w komponentach, ale stany najechania wydają się ostatnią przeszkodą.
To, co zrobiłem, to napisanie mixinu, który możesz dodać do swojego komponentu, który potrzebuje stanów najechania. Ta mieszanka doda nową
hovered
właściwość do stanu twojego komponentu. Zostanie ustawiony na,true
jeśli użytkownik najedzie kursorem na główny węzeł DOM komponentu i ustawi go z powrotemfalse
jeśli użytkownicy opuszczą element.Teraz w funkcji renderowania komponentu możesz zrobić coś takiego:
Teraz za każdym razem stan
hovered
stanu ulegnie zmianie, komponent zostanie ponownie wyrejestrowany.W tym celu utworzyłem również repozytorium piaskownicy, którego używam do samodzielnego testowania niektórych z tych wzorców. Sprawdź, jeśli chcesz zobaczyć przykład mojej realizacji.
https://github.com/Sitebase/cssinjs/tree/feature-interaction-mixin
źródło
Myślę, że onMouseEnter i onMouseLeave to sposoby, ale nie widzę potrzeby stosowania dodatkowego komponentu opakowania. Oto jak to zaimplementowałem:
Następnie możesz użyć stanu aktywowania (prawda / fałsz), aby zmienić styl linku.
źródło
:hover
ale nie:focus
onFocus
zdarzenie; więc możesz zrobić to samo za:focus
co:hover
, z wyjątkiem tego, że zamiast potrzebowaćonMouseEnter
ionMouseLeave
potrzebujesz tylkoonFocus
Spóźniony na imprezę, ale przyjdź z rozwiązaniem. Możesz użyć „&”, aby zdefiniować style dla n-tego elementu potomnego itp .:
źródło
Możesz użyć Radium - jest to narzędzie typu open source do stylów wbudowanych w ReactJS. Dodaje dokładnie te selektory, których potrzebujesz. Bardzo popularne, sprawdź to - Radium na npm
źródło
module.exports = React.createClass({ displayName: 'App',})
module.exports = Radium(React.createClass({ displayName: 'App',}))
lub przypisać klasę do wartości i dodać@Radium
dekorator nad nią, jak wspomina dokumentacja github.com/FormidableLabs/radium#usagePełne wsparcie CSS jest dokładnie powodem tak ogromnej ilości bibliotek CSSinJS. Aby robić to efektywnie, musisz wygenerować rzeczywisty CSS, a nie style wbudowane. Również style inline reagują znacznie wolniej w większym systemie. Zastrzeżenie - utrzymuję JSS .
źródło
Wykonane Style To - w części - z tego powodu (pozostałe to nieporozumienia z realizacji innych libs / składniowych i inline stylings brak wsparcia dla poprzedzenie wartości nieruchomości). Uwierz, że powinniśmy być w stanie po prostu pisać CSS w JavaScript i mieć w pełni niezależne komponenty HTML-CSS-JS. Dzięki ciągom szablonów ES5 / ES6 możemy teraz i może być całkiem! :)
npm install style-it --save
Składnia funkcjonalna ( JSFIDDLE )
Składnia JSX ( JSFIDDLE )
źródło
Dodając do odpowiedzi Jonathana , oto zdarzenia, które obejmują stan skupienia i aktywny, oraz użycie
onMouseOver
zamiast,onMouseEnter
ponieważ ten ostatni nie będzie bąbelkowy, jeśli masz jakiekolwiek elementy podrzędne w celu, do którego zdarzenie jest stosowane.źródło
Oto moje rozwiązanie wykorzystujące React Hooks. Łączy operator rozprzestrzeniania i operator trójskładnikowy.
style.js
Button.js
źródło
W odniesieniu do stylu-komponentów i reagować-routera v4 można to zrobić:
źródło
To może być niezły hack do umieszczania stylu w wierszu wewnątrz komponentu reagującego (a także używania funkcji: hover CSS):
źródło
Checkout Typestyle, jeśli używasz React with Typescript.
Poniżej znajduje się przykładowy kod dla: hover
źródło
Możesz użyć modułów css jako alternatywy, a dodatkowo reagować-css-moduły do mapowania nazw klas.
W ten sposób możesz zaimportować swoje style w następujący sposób i używać normalnego CSS w zakresie lokalnym do komponentów:
Oto przykład modułów CSS pakietu webpack
źródło
:hover
stylów w czasie wykonywania, tak jak w przypadku Radium lub innegoonMouseOver
rozwiązania opartego na rozwiązaniuonMouseOver i onMouseLeave z setState na początku wydawało mi się trochę narzutem - ale ponieważ tak działa reakcja, wydaje mi się najłatwiejszym i najczystszym rozwiązaniem.
na przykład renderowanie strony serwera z motywami css jest również dobrym rozwiązaniem i sprawia, że komponenty reagujące są bardziej czyste.
jeśli nie musisz dołączać dynamicznych stylów do elementów (na przykład do tworzenia motywów), nie powinieneś w ogóle używać stylów wbudowanych, ale zamiast tego użyj klas css.
jest to tradycyjna reguła html / css, dzięki której HTML / JSX jest czysty i prosty.
źródło
Prostym sposobem jest użycie operatora trójskładnikowego
źródło
Za pomocą haków:
źródło
Używam do tego całkiem hakerskiego rozwiązania w jednej z moich ostatnich aplikacji, która działa do moich celów, i uważam, że jest to szybsze niż pisanie niestandardowych funkcji ustawień kursora w vanilla js (chociaż, wiem, może nie jest to najlepsza praktyka w większości środowisk ..) Więc jeśli nadal jesteś zainteresowany, proszę.
Tworzę element nadrzędny tylko po to, aby przechowywać wbudowane style javascript, a następnie dziecko z className lub id, do którego mój arkusz stylów css będzie się przyczepiał i zapisuje styl najechania w moim dedykowanym pliku css. Działa to, ponieważ bardziej szczegółowy element podrzędny otrzymuje wbudowane style js poprzez dziedziczenie, ale jego style w dymku są zastępowane przez plik css.
Zasadniczo mój rzeczywisty plik css istnieje wyłącznie w celu przechowywania efektów najechania kursorem, nic więcej. To sprawia, że jest dość zwięzły i łatwy w zarządzaniu, a także pozwala mi robić ciężkie rzeczy w moich stylach komponentów React.
Oto przykład:
Zwróć uwagę, że styl wbudowany „potomny” nie ma ustawionej właściwości „kolor”. Gdyby tak było, nie zadziałałoby, ponieważ styl wbudowany miałby pierwszeństwo przed moim arkuszem stylów.
źródło
Nie jestem w 100% pewien, czy to jest odpowiedź, ale to sztuczka, której używam do symulacji CSS: efekt najechania kursorem z kolorami i obrazami w tekście.
CSS:
Przykład: https://codepen.io/roryfn/pen/dxyYqj?editors=0011
źródło
Gdzie Hoverable definiuje się jako:
źródło