Kieruj na inny komponent ze stylem po najechaniu kursorem


87

Jaki jest najlepszy sposób obsługi zawisów w stylizowanych komponentach. Mam element zawijający, który po najechaniu kursorem ujawni przycisk.

Mógłbym zaimplementować stan komponentu i przełączyć właściwość po najechaniu kursorem, ale zastanawiałem się, czy istnieje lepszy sposób na zrobienie tego ze styled-cmponents.

Coś takiego nie działa, ale byłoby idealne:

const Wrapper = styled.div`
  border-radius: 0.25rem;
  overflow: hidden;
  box-shadow: 0 3px 10px -3px rgba(0, 0, 0, 0.25);
  &:not(:last-child) {
    margin-bottom: 2rem;
  }
  &:hover {
    .button {
      display: none;
    }
  }
`

Odpowiedzi:


164

Począwszy od styled-components v2, możesz interpolować inne stylizowane komponenty, aby odwołać się do ich automatycznie wygenerowanych nazw klas. W twoim przypadku prawdopodobnie będziesz chciał zrobić coś takiego:

const Wrapper = styled.div`
  &:hover ${Button} {
    display: none;
  }
`

Więcej informacji znajdziesz w dokumentacji !

Kolejność komponentów jest ważna. Będzie działać tylko wtedy, gdy Buttonzostało zdefiniowane powyżej / wcześniej Wrapper.


Jeśli używasz wersji 1 i musisz to zrobić, możesz to obejść, używając niestandardowej nazwy klasy:

const Wrapper = styled.div`
  &:hover .my__unique__button__class-asdf123 {
    display: none;
  }
`

<Wrapper>
  <Button className="my__unique__button__class-asdf123" />
</Wrapper>

Ponieważ v2 jest aktualizacją typu drop-in z v1, polecam aktualizację, ale jeśli nie ma tego na kartach, jest to dobre obejście.


17
Dla każdego, kto to czyta, ważna jest kolejność komponentów. Będzie działać tylko wtedy, gdy Buttonzostanie zdefiniowane powyżej / wcześniejWrapper
Titan

Właściwie kolejną ważną dokumentacją jest
Odnoszenie się

A co, gdybym chciał liczyć na niektóre rekwizyty przekazane Button z Wrappera, więc najechanie kursorem wygląda inaczej w zależności od tych rekwizytów?
rmartrenado

29

Podobnie jak w przypadku odpowiedzi mxstbr, możesz również użyć interpolacji, aby odwołać się do komponentu macierzystego. Podoba mi się ta trasa, ponieważ hermetyzuje stylowanie komponentu trochę lepiej niż odwoływanie się do komponentu podrzędnego w rodzicu.

const Button = styled.button`
  ${Wrapper}:hover & {
    display: none;
  }
`;

Nie mogłem powiedzieć, kiedy ta funkcja została wprowadzona, ale działa od wersji 3.

Odpowiedni link: https://www.styled-components.com/docs/advanced#referring-to-other-components



0

To rozwiązanie zadziałało dla mnie:

const ContentB = styled.span`
  opacity: 0;

  &:hover {
    opacity: 1;
  }
`

const ContentA = styled.span`
  &:hover ~ ${ContentB} {
    opacity: 1;
  }
`

0

To właśnie zadziałało dla mnie

const NoHoverLine = styled.div`
  a {
    &:hover {
      text-decoration: none;
    }
  }
`

Wyjaśnij, jak działa Twój kod i jak to robi.
M-Chen-3
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.