¿Cuál es exactamente el beneficio de usar StyleSheet.create()
frente a un objeto simple?
const styles = StyleSheet.create({
container: {
flex: 1
}
}
Vs.
const styles = {
container: {
flex: 1
}
}
react-native
corasan
fuente
fuente
Respuestas:
Citando directamente desde la sección de comentarios de StyleSheet.js de React native
Además, StyleSheet también valida el contenido de su hoja de estilo. Por lo tanto, cualquier error de propiedad de estilo incorrecta se muestra en el momento de la compilación en lugar de en el tiempo de ejecución cuando StyleSheet está realmente implementado.
fuente
StyleSheet.create({styles...})
es mejor / más rápido que{styles...}
. El código es igual de limpio y también está usando nombres en lugar de inlining. ¿Alguien puede arrojar algo de luz sobre esto?StyleSheet
proporciona validación en la compilaciónStyleSheet.create
un Objeto simple, no en línea frente a una constante fuera de la claseNo hay ningún beneficio. Período.
Mito 1:
StyleSheet
es más eficazNo hay absolutamente ninguna diferencia de rendimiento entre
StyleSheet
un objeto declarado fuera derender
(sería diferente si está creando un nuevo objeto dentrorender
cada vez). La diferencia de rendimiento es un mito.El origen del mito probablemente se deba a que el equipo de React Native intentó hacer esto, pero no tuvo éxito. En ninguna parte de los documentos oficiales encontrará nada sobre el rendimiento: https://facebook.github.io/react-native/docs/stylesheet.html , mientras que el código fuente indica "aún no implementado": https://github.com/ facebook / react-native / blob / master / Bibliotecas / StyleSheet / StyleSheet.js # L207
Mito 2:
StyleSheet
valida el objeto de estilo en tiempo de compilaciónEsto no es verdad. JavaScript simple no puede validar objetos en tiempo de compilación.
Dos cosas:
fuente
StyleSheet.create( {x:{flex: "1"}} )
se producirá un error en tiempo de ejecución, al igual que un cheque en este manuscrito en tiempo de compilación.La respuesta aceptada no es una respuesta a la pregunta de OP.
La pregunta no es la diferencia entre estilos en línea y
const
fuera de la clase, sino por qué deberíamos usar enStyleSheet.create
lugar de un objeto simple.Después de investigar un poco, lo que encontré es lo siguiente (actualice si tiene alguna información). Las ventajas de
StyleSheet.create
deberían ser las siguientes:fuente
Antes se consideraba que el uso de una StyleSheet era más eficaz y, por esta razón, el equipo de RN lo recomendaba hasta la versión 0.57, pero ahora ya no se recomienda como se señaló correctamente en otra respuesta a esta pregunta.
La documentación de RN ahora recomienda StyleSheet por las siguientes razones, aunque creo que estas razones se aplicarían igualmente a los objetos simples que se crean fuera de la función de renderizado:
Entonces, ¿cuáles creo que son los posibles beneficios de usar StyleSheet sobre objetos simples?
1) A pesar de las afirmaciones en contrario mis pruebas en RN v0.59.10 indica que se hace conseguir un poco de validación al llamar
StyleSheet.create()
y mecanografiado (y probablemente de flujo) también informará de errores en tiempo de compilación. Incluso sin comprobar el tiempo de compilación, creo que sigue siendo beneficioso realizar la validación de los estilos en tiempo de ejecución antes de que se utilicen para el renderizado, especialmente cuando los componentes que utilizan esos estilos podrían renderizarse condicionalmente. Esto permitirá detectar dichos errores sin tener que probar todos los escenarios de renderizado.2) Dado que el equipo de RN recomienda StyleSheet, es posible que aún tengan esperanzas de usar StyleSheet para mejorar el rendimiento en el futuro, y es posible que también tengan otras posibles mejoras en mente, por ejemplo:
3) La
StyleSheet.create()
validación en tiempo de ejecución actual es útil, pero un poco limitada. Parece estar restringido a la verificación de tipos que obtendría con el flujo o el mecanografiado, por lo que seleccionará digamosflex: "1"
oborderStyle: "rubbish"
, pero no,width: "rubbish"
ya que podría ser una cadena de porcentaje. Es posible que el equipo de RN pueda mejorar dicha validación en el futuro verificando cosas como cadenas de porcentaje o límites de rango, o podría ajustarStyleSheet.create()
su propia función para hacer esa validación más extensa.4) Al usar StyleSheet, quizás esté facilitando la transición a alternativas / extensiones de terceros como react-native-extended-stylesheet que ofrecen más.
fuente
La creación de sus estilos a través
StyleSheet.create
pasará la validación solo cuando la variable global__DEV__
se establezca en verdadero (o mientras se ejecuta dentro de los emuladores de Android o IOS, consulte React Native DEV y PROD variables )El código fuente de la función es bastante simple:
Recomendaría usarlo porque realiza una validación en tiempo de ejecución durante el desarrollo, también congela el objeto.
fuente
No encontré ninguna diferencia en el
StyleSheet
objeto intermedio y simple, excepto en la validación de escritura en TypeScript.Por ejemplo, esto (tenga en cuenta las diferencias de escritura):
es igual a esto:
fuente