Jaka jest dokładnie korzyść z używania w StyleSheet.create()
porównaniu do zwykłego przedmiotu?
const styles = StyleSheet.create({
container: {
flex: 1
}
}
Vs.
const styles = {
container: {
flex: 1
}
}
react-native
corasan
źródło
źródło
Odpowiedzi:
Cytując bezpośrednio z sekcji komentarzy w StyleSheet.js w React native
StyleSheet sprawdza również zawartość arkusza stylów. Tak więc każdy błąd związany z nieprawidłową właściwością stylu jest wyświetlany w czasie kompilacji, a nie w czasie wykonywania, gdy arkusz StyleSheet jest faktycznie implementowany.
źródło
StyleSheet.create({styles...})
jest lepsze / szybsze niż{styles...}
. Kod jest równie czysty, a zamiast wstawiania używasz również nazewnictwa. Czy ktoś może rzucić na to trochę światła?StyleSheet
zapewnia walidację podczas kompilacjiStyleSheet.create
zwykłym Object, not inline a const poza klasąNie ma żadnej korzyści. Kropka.
Mit 1:
StyleSheet
jest bardziej wydajnyNie ma absolutnie żadnej różnicy w wydajności między
StyleSheet
obiektem zadeklarowanym na zewnątrz arender
(byłoby inaczej, gdyby zarender
każdym razem tworzył nowy obiekt wewnątrz ). Różnica w wydajności to mit.Pochodzenie mitu jest prawdopodobne, ponieważ zespół React Native próbował to zrobić, ale nie udało im się to. Nigdzie w oficjalnych dokumentach nie znajdziesz nic o wydajności: https://facebook.github.io/react-native/docs/stylesheet.html , podczas gdy kod źródłowy stwierdza, że „jeszcze nie zaimplementowano”: https://github.com/ facebook / reag-native / blob / master / Libraries / StyleSheet / StyleSheet.js # L207
Mit 2:
StyleSheet
sprawdza poprawność obiektu stylu w czasie kompilacjiTo nie jest prawda. Zwykły JavaScript nie może sprawdzać poprawności obiektów w czasie kompilacji.
Dwie rzeczy:
źródło
StyleSheet.create( {x:{flex: "1"}} )
zawiedzie w czasie wykonywania, podobnie jak kontrola maszynopis na to w czasie kompilacji.Przyjęta odpowiedź nie jest odpowiedzią na pytanie PO.
Nie chodzi o różnicę między stylami w wierszu a stylami
const
zewnętrznymi, ale dlaczego powinniśmy używaćStyleSheet.create
zamiast zwykłego obiektu.Po krótkiej analizie tego, co znalazłem, jest następujące (zaktualizuj, jeśli masz jakieś informacje). Zalety
StyleSheet.create
powinny być następujące:źródło
Kiedyś uważano, że używanie arkusza StyleSheet było bardziej wydajne i było zalecane z tego powodu przez zespół RN aż do wersji 0.57, ale teraz nie jest już zalecane, jak poprawnie wskazano w innej odpowiedzi na to pytanie.
Dokumentacja RN zaleca teraz arkusz StyleSheet z następujących powodów, chociaż myślę, że te powody miałyby zastosowanie w równym stopniu do zwykłych obiektów, które są tworzone poza funkcją renderowania:
Więc jak myślę, jakie są możliwe zalety używania arkusza StyleSheet nad zwykłymi obiektami?
1) Pomimo twierdzeń przeciwnych moje badania na RN v0.59.10 oznacza, że zrobić trochę walidacji podczas wywoływania
StyleSheet.create()
i maszynopis (i prawdopodobnie przepływu) będzie także zgłaszać błędy w czasie kompilacji. Myślę, że nawet bez sprawdzania czasu kompilacji nadal korzystne jest sprawdzanie poprawności stylów w czasie wykonywania, zanim zostaną one użyte do renderowania, zwłaszcza gdy komponenty używające tych stylów mogą być warunkowo renderowane. Umożliwi to wychwycenie takich błędów bez konieczności testowania wszystkich scenariuszy renderowania.2) Biorąc pod uwagę, że StyleSheet jest zalecany przez zespół RN, mogą nadal mieć nadzieję na wykorzystanie StyleSheet do poprawy wydajności w przyszłości, a także mogą mieć na uwadze inne możliwe ulepszenia, na przykład:
3) Bieżąca
StyleSheet.create()
walidacja w czasie wykonywania jest przydatna, ale nieco ograniczona. Wydaje się, że ogranicza się to do sprawdzania typu, które można uzyskać za pomocą przepływu lub skryptu, więc wybierze powiedzflex: "1"
lubborderStyle: "rubbish"
, ale nie,width: "rubbish"
ponieważ może to być ciąg procentowy. Jest możliwe, że zespół RN może ulepszyć taką walidację w przyszłości, sprawdzając takie rzeczy, jak ciągi procentowe lub limity zakresów, lub możesz zawinąćStyleSheet.create()
swoją własną funkcję, aby wykonać bardziej rozbudowaną walidację.4) Używając arkusza StyleSheet, być może ułatwiasz przejście na alternatywne rozwiązania / rozszerzenia innych firm, takie jak reakcja-natywny-rozszerzony-arkusz stylów, które oferują więcej.
źródło
Tworzenie twoich stylów za pomocą
StyleSheet.create
przejdzie przez walidację tylko wtedy, gdy zmienna globalna__DEV__
jest ustawiona na true (lub podczas pracy w emulatorach Androida lub IOS zobacz zmienne React Native DEV i PROD )Kod źródłowy funkcji jest dość prosty:
Poleciłbym go używać, ponieważ wykonuje walidację w czasie wykonywania podczas programowania, a także zamraża obiekt.
źródło
Nie znalazłem żadnych różnic w między
StyleSheet
i zwykłym obiekcie, z wyjątkiem sprawdzania poprawności wpisywania w TypeScript.Na przykład to (zwróć uwagę na różnice w pisaniu):
równa się temu:
źródło