Quel est exactement l'avantage d'utiliser par StyleSheet.create()
rapport à un objet ordinaire?
const styles = StyleSheet.create({
container: {
flex: 1
}
}
Contre.
const styles = {
container: {
flex: 1
}
}
react-native
corasan
la source
la source
Réponses:
Citant directement à partir de la section commentaire de StyleSheet.js de React native
StyleSheet valide également le contenu de votre feuille de style. Ainsi, toute erreur de propriété de style incorrecte est affichée au moment de la compilation plutôt qu'au moment de l'exécution lorsque StyleSheet est réellement implémenté.
la source
StyleSheet.create({styles...})
c'est mieux / plus rapide que{styles...}
. Le code est tout aussi propre et vous utilisez également la dénomination au lieu de l'inlining. Quelqu'un peut-il faire la lumière là-dessus?StyleSheet
fournit la validation à la compilationStyleSheet.create
et un objet ordinaire, pas en ligne vs un const en dehors de la classeIl n'y a aucun avantage. Période.
Mythe 1:
StyleSheet
est plus performantIl n'y a absolument aucune différence de performances entre
StyleSheet
et un objet déclaré en dehors derender
(ce serait différent si vous créez un nouvel objet à l'intérieur àrender
chaque fois). La différence de performance est un mythe.L'origine du mythe est probablement due au fait que l'équipe React Native a essayé de le faire, mais elle n'a pas réussi. Nulle part dans la documentation officielle, vous ne trouverez quoi que ce soit sur les performances: https://facebook.github.io/react-native/docs/stylesheet.html , tandis que le code source indique "pas encore implémenté": https://github.com/ facebook / react-native / blob / master / Bibliothèques / StyleSheet / StyleSheet.js # L207
Mythe 2:
StyleSheet
valide l'objet de style au moment de la compilationCe n'est pas vrai. Le JavaScript brut ne peut pas valider les objets au moment de la compilation.
Deux choses:
la source
StyleSheet.create( {x:{flex: "1"}} )
échouera lors de l' exécution, tout comme un chèque dactylographiée sur ce au moment de la compilation.La réponse acceptée n'est pas une réponse à la question du PO.
La question n'est pas la différence entre les styles en ligne et un en
const
dehors de la classe, mais pourquoi nous devrions utiliser à laStyleSheet.create
place d'un objet simple.Après quelques recherches, ce que j'ai trouvé est le suivant (veuillez mettre à jour si vous avez des informations). Les avantages de
StyleSheet.create
devraient être les suivants:la source
Auparavant, on considérait que l'utilisation d'une feuille de style était plus performante, et était recommandée pour cette raison par l'équipe RN jusqu'à la version 0.57, mais elle n'est plus recommandée comme correctement indiqué dans une autre réponse à cette question.
La documentation RN recommande maintenant StyleSheet pour les raisons suivantes, bien que je pense que ces raisons s'appliqueraient également aux objets simples qui sont créés en dehors de la fonction de rendu:
Alors, à mon avis, quels sont les avantages possibles de l'utilisation de StyleSheet sur des objets simples?
1) En dépit des affirmations contraires mes tests sur la RN v0.59.10 indique que vous faites obtenir une validation lors de l' appel
StyleSheet.create()
et tapuscrit (et probablement débit) sera également rapporter des erreurs au moment de la compilation. Même sans vérification du temps de compilation, je pense qu'il est toujours avantageux de valider les styles à l'exécution avant qu'ils ne soient utilisés pour le rendu, en particulier lorsque les composants qui utilisent ces styles peuvent être rendus conditionnellement. Cela permettra de détecter ces erreurs sans avoir à tester tous les scénarios de rendu.2) Étant donné que StyleSheet est recommandé par l'équipe RN, ils peuvent encore espérer utiliser StyleSheet pour améliorer les performances à l'avenir, et ils peuvent également avoir d'autres améliorations possibles à l'esprit, par exemple:
3) La
StyleSheet.create()
validation d'exécution actuelle est utile, mais un peu limitée. Il semble être limité à la vérification de type que vous obtiendriez avec flow ou dactylographié, donc je reprendra disonsflex: "1"
ouborderStyle: "rubbish"
, mais paswidth: "rubbish"
car cela pourrait être une chaîne de pourcentage. Il est possible que l'équipe RN puisse améliorer cette validation à l'avenir en vérifiant des éléments tels que les chaînes de pourcentage ou les limites de plage, ou vous pouvez intégrerStyleSheet.create()
votre propre fonction pour effectuer cette validation plus approfondie.4) En utilisant StyleSheet, vous facilitez peut-être la transition vers des alternatives / extensions tierces telles que react-native-extended-stylesheet qui offrent plus.
la source
La création de vos styles via
StyleSheet.create
passera par la validation uniquement lorsque la variable globale__DEV__
est définie sur true (ou lors de l'exécution à l'intérieur des émulateurs Android ou IOS, voir les variables React Native DEV et PROD )Le code source de la fonction est assez simple:
Je recommanderais de l'utiliser car il effectue une validation d'exécution pendant le développement, et il gèle également l'objet.
la source
Je n'ai trouvé aucune différence dans l'
StyleSheet
objet between et plain, à l'exception de la validation de frappe dans TypeScript.Par exemple, ceci (notez les différences de frappe):
équivaut à ceci:
la source