Відповіді:
Цитуючи безпосередньо з розділу коментарів StyleSheet.js з рідного React
Якість коду:
Відсуваючи стилі від функції візуалізації, ви полегшуєте розуміння коду.
Іменування стилів - це хороший спосіб додати значення компонентам низького рівня у функції візуалізації.
Продуктивність:
Створення таблиці стилів з об’єкта стилю дає можливість посилатися на нього за ідентифікатором, а не створювати новий об'єкт стилю кожен раз.
Це також дозволяє надсилати стиль лише один раз через міст. Усі наступні використання будуть посилатися на ідентифікатор (ще не реалізований).
Також StyleSheet перевіряє вміст таблиці ваших стилів. Таким чином, будь-яка помилка властивості неправильного стилю відображається під час компіляції, а не під час виконання, коли фактично реалізовано StyleSheet.
StyleSheet.create({styles...})
краще / швидше, ніж {styles...}
. Код настільки ж чистий, і ви також використовуєте найменування замість вставки. Чи може хтось пролити на це світло?
StyleSheet
надає перевірку під час компіляції
StyleSheet.create
простим Об'єктом, а не
Користі немає. Період.
StyleSheet
ефективнішийАбсолютно немає різниці в продуктивності між StyleSheet
об'єктом і оголошеним поза ним render
(це було б інакше, якщо ви створюєте новий об'єкт всередині render
кожного разу). Різниця у виконанні - міф.
Походження міфу, ймовірно, тому, що команда React Native намагалася це зробити, але вони не мали успіху. Ніде в офіційних документах ви не знайдете нічого про продуктивність: https://facebook.github.io/react-native/docs/stylesheet.html , тоді як вихідний код зазначає "ще не реалізовано": https://github.com/ facebook / реакція-рідний / blob / master / Бібліотеки / StyleSheet / StyleSheet.js # L207
StyleSheet
перевіряє об'єкт стилю під час компіляціїЦе не правда. Звичайний JavaScript не може перевірити об'єкти під час компіляції.
Дві речі:
const containerStyle: ViewStyle = {
...
}
StyleSheet.create( {x:{flex: "1"}} )
станеться збій під час виконання, як буде перевірка машинопису на це під час компіляції.
Прийнята відповідь не є відповіддю на питання ОП.
Питання полягає не в різниці між вбудованими стилями та const
поза класом, а в тому, чому нам слід використовувати StyleSheet.create
замість простого об'єкта.
Після невеликого дослідження я знайшов наступне (будь ласка, оновіть, якщо у вас є інформація). Досягненнями StyleSheet.create
повинні бути такі:
Раніше вважали , що з допомогою STYLESHEET був більш продуктивним, і був рекомендований з цієї причини по RN команди аж до версії 0.57, але вона тепер уже не рекомендується , так як правильно вказав у інший відповідь на це питання.
Документація RN тепер рекомендує StyleSheet з наступних причин, хоча, думаю, ці причини однаково стосуватимуться звичайних об'єктів, створених поза функцією візуалізації:
Тож, на вашу думку , можливі переваги використання StyleSheet над простими об’єктами?
1) Не дивлячись на заяви про зворотне моєму випробуванні на RN v0.59.10 означає , що ви робите отримати деякі перевірки при виклику StyleSheet.create()
і машинопис (і , ймовірно , потік) також буде повідомляти про помилки під час компіляції. Навіть без перевірки часу компіляції, я думаю, що все-таки вигідно зробити перевірку часу стилів перед тим, як вони будуть використані для візуалізації, особливо там, де компоненти, які використовують ці стилі, можуть бути умовно надані. Це дозволить збирати такі помилки без необхідності перевіряти всі сценарії візуалізації.
2) З огляду на , що StyleSheet буде рекомендований командою RN , вони можуть по- , як і раніше є надія , використовуючи таблицю стилів для підвищення продуктивності в майбутньому, і вони можуть мати інші можливі покращення в вигляді , як добре, наприклад:
3) Поточна StyleSheet.create()
перевірка часу роботи корисна, але трохи обмежена. Здається, обмежується перевірка типів, які ви отримаєте з потоком або шрифтом, так що вибираєте скажіть flex: "1"
або borderStyle: "rubbish"
, але не width: "rubbish"
так, як це може бути відсотковий рядок. Можливо, команда RN може в майбутньому вдосконалити таку перевірку, перевіривши такі речі, як процентні рядки або обмеження діапазону, або ви можете ввімкнути StyleSheet.create()
свою функцію, щоб зробити цю більш широку перевірку.
4) Використовуючи StyleSheet, вам, можливо, полегшується перехід на сторонні альтернативи / розширення, такі як таблиця стилів-реагуючих-розширених стилів, які пропонують більше.
Створення ваших стилів за допомогою StyleSheet.create
пройде, проте перевірка буде лише тоді, коли глобальна змінна __DEV__
встановлена на істинне (або під час роботи в емуляторах Android або IOS див. React Native DEV і PROD змінні )
Вихідний код функції досить простий:
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;
}
Я рекомендую використовувати його, оскільки він виконує перевірку часу виконання під час розробки, також він заморожує об'єкт.
Я не виявив жодних відмінностей між StyleSheet
і простим об'єктом, за винятком введення перевірки в TypeScript.
Наприклад, це (врахуйте відмінності введення тексту):
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,
},
});
дорівнює цьому:
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,
},
};