React - styl zależny od stanu

React - styl zależny od stanu
VD
  • Rejestracja:ponad 10 lat
  • Ostatnio:10 miesięcy
  • Postów:72
0

Cześć,

naprowadzicie co robię nie tak?

Kopiuj
export default ()=> {
    const [done, setDone] = useState(false);
    return <TouchableOpacity onPress={() => setDone(!done)} style={{opacity: done ? 0.2 : 1}}>...</TouchableOpacity>;
}

To mój komponent. Logika jest dosyć prosta - chcę, żeby klikniecie powodowało zmianę opacity na 0.2, a ponowne przywrócenie do 1.0. Problem jest w tym, że styl jest tak jakby z poprzedniego stanu. Czyli:

  1. opacity = 1.0; done = false
  2. Klikam
  3. opacity = 1.0; done = true
  4. Klikam
  5. opacity = 0.2; done = false

Pewnie jest to moje niezrozumienie mechanizmu stanu :)

Tasmanian Devil
Hej! Twój post prawdopodobnie zawiera niesformatowany kod. Użyj znaczników ``` aby oznaczyć, co jest kodem, będzie łatwiej czytać. (jestem botem, ta akcja została wykonana automatycznie, prawdopodobieństwo 0.99114233)
Kokoniłaj
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 3 godziny
  • Postów:182
0
Kopiuj
() => setDone(!done)}

Według mnie źle robisz to, że korzystasz w ten sposób z wartości stanu. Spróbuj to zrobić tak:

Kopiuj
() => setDone(oldState => !oldState)
VD
  • Rejestracja:ponad 10 lat
  • Ostatnio:10 miesięcy
  • Postów:72
0
Kokoniłaj napisał(a):
Kopiuj
() => setDone(!done)}

Według mnie źle robisz to, że korzystasz w ten sposób z wartości stanu. Spróbuj to zrobić tak:

Kopiuj
() => setDone(oldState => !oldState)

Próbowałem tak, niestety nie pomogło. W dokumentacji reacta też nie dają tam funkcji.

MA
  • Rejestracja:prawie 17 lat
  • Ostatnio:10 dni
  • Postów:644
0

https://codesandbox.io/s/react-hooks-playground-forked-cvvw0?file=/src/index.tsx
Zamiast komponentu Hello wstaw sobie div i zobaczysz różnice.
TouchableOpacity prawdopodobnie nie wspiera propsa style.

Edit. nie doczytałem, problem leży pewnie w innym miejscu - kolega @tsz mnie uświadomił, że nie o to chodziło :)

edytowany 3x, ostatnio: Markuz
TS
To nie działa wcale.
MA
Zgadza się, ponieważ jest ten sam błąd który ma autor tematu - a w moim poście jest jego rozwiązanie.
TS
Zwróć uwagę, że OP twierdzi, że opacity się w końcu zmienia. Nie wiem czy to sprawdził organoleptycznie, ale jeśli tak to problem jest inny.
MA
Racja, w takim razie to coś innego :)
VD
TouchableOpacity wspiera style - https://reactnative.dev/docs/touchableopacity#style, ale rzeczywiście coś z tym jest nie tak
VD
  • Rejestracja:ponad 10 lat
  • Ostatnio:10 miesięcy
  • Postów:72
1

Problem rzeczywiście z komponentem TouchableOpacity, tego się nie spodziewałem. Opakowałem wszystko w jeszcze jeden kontener i działa elegancko.
Możliwe, że związane z tym issue: https://github.com/facebook/react-native/issues/17105

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.