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
}
}
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
}
}
Odpowiedzi:
Cytując bezpośrednio z sekcji komentarzy w StyleSheet.js w React native
Jakość kodu:
Odsuwając style od funkcji renderowania, ułatwiasz zrozumienie kodu.
Nazywanie stylów jest dobrym sposobem nadania znaczenia komponentom niskiego poziomu w funkcji renderowania.
Występ:
Tworzenie arkusza stylów z obiektu stylu umożliwia odwoływanie się do niego przez identyfikator zamiast tworzenia za każdym razem nowego obiektu stylu.
Pozwala również na jednorazowe przesłanie stylu przez most. Wszystkie kolejne zastosowania będą dotyczyły identyfikatora (jeszcze nie zaimplementowany).
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.
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 kompilacji
StyleSheet.create
zwykłym Object, not inline a const poza klasą
Nie ma żadnej korzyści. Kropka.
StyleSheet
jest bardziej wydajnyNie ma absolutnie żadnej różnicy w wydajności między StyleSheet
obiektem zadeklarowanym na zewnątrz a render
(byłoby inaczej, gdyby za render
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
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:
const containerStyle: ViewStyle = {
...
}
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:
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 powiedz flex: "1"
lub borderStyle: "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.
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:
create < +S: ____Styles_Internal > (obj: S): $ReadOnly < S > {
// TODO: This should return S as the return type. But first,
// we need to codemod all the callsites that are typing this
// return value as a number (even though it was opaque).
if (__DEV__) {
for (const key in obj) {
StyleSheetValidation.validateStyle(key, obj);
if (obj[key]) {
Object.freeze(obj[key]);
}
}
}
return obj;
}
Poleciłbym go używać, ponieważ wykonuje walidację w czasie wykonywania podczas programowania, a także zamraża obiekt.
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):
import { View, Text, Image, StyleSheet } from 'react-native';
import logo from './logo.svg';
export default class App extends Component {
render() {
return (
<View style={styles.someViewStyle}>
<Text style={styles.someTextStyle}>Text Here</Text>
<Image style={styles.someImageStyle} source={logo} />
</View>
);
}
}
const styles: StyleSheet.create({
someViewStyle: {
backgroundColor: '#FFF',
padding: 10,
},
someTextStyle: {
fontSize: 24,
fontWeight: '600',
},
someImageStyle: {
height: 50,
width: 100,
},
});
równa się temu:
import { View, Text, Image, ViewStyle, TextStyle, ImageStyle } from 'react-native';
import logo from './logo.svg';
export default class App extends Component {
render() {
return (
<View style={styles.someViewStyle}>
<Text style={styles.someTextStyle}>Text Here</Text>
<Image style={styles.someImageStyle} source={logo} />
</View>
);
}
}
const styles: {
someViewStyle: ViewStyle;
someTextStyle: TextStyle;
someImageStyle: ImageStyle;
} = {
someViewStyle: {
backgroundColor: '#FFF',
padding: 10,
},
someTextStyle: {
fontSize: 24,
fontWeight: '600',
},
someImageStyle: {
height: 50,
width: 100,
},
};