В чем смысл StyleSheet.create
Я читаю React Native docs/tutorial, и мне интересно, что точка в функции StyleSheet.create
.
Например, учебник имеет следующий код:
const styles = StyleSheet.create({
bigblue: {
color: 'blue',
fontWeight: 'bold',
fontSize: 30,
},
red: {
color: 'red',
},
});
Но я не понимаю разницы между этим и:
const styles = {
bigblue: {
color: 'blue',
fontWeight: 'bold',
fontSize: 30,
},
red: {
color: 'red',
},
};
Ответы
Ответ 1
TL; DR Всегда используйте StyleSheet.create()
, когда можете.
Ответ от Nico верен, но есть и больше.
Подводя итог:
- Он проверяет стили, упомянутые Нико
- Как упоминалось в documentation:
Создание таблицы стилей из объекта стиля позволяет ссылаться на нее по идентификатору, а не на создание нового объекта стиля каждый раз.
- Также упоминается в documentation:
Он также позволяет отправлять стиль только один раз через мост. Все последующие использования будут ссылаться на id (еще не реализованы).
Как вы знаете, отправка данных через мост - очень дорогостоящая операция, которая оказывает значительное влияние на производительность приложения. Таким образом, используя StyleSheet.create()
, вы уменьшаете нагрузку на мост.
Ответ 2
StyleSheet.create
больше не повышает производительность.
https://github.com/DefinitelyTyped/DefinitelyTyped/issues/29265#issuecomment-430783289
цитируя комментарий github:
@alloy Я понимаю, что говорит документация, но могу доказать этот код:
const myStyle: ViewStyle = { flex: 1 } export const FlexView:
React.SFC = (props) => <View style={myStyle}>{props.children}</View>
имеет почти такую же производительность (даже немного быстрее) по сравнению с
const s = StyleSheet.create({ flex: { flex: 1 } })
export const FlexView: React.SFC = (props) => <View style={s.flex}>{props.children}</View>
потому что, если вы посмотрите на источники, вы обнаружите, что последний фрагмент эффективно извлечен для этого (см.: https://github.com/facebook/react-native/blob/0.57-stable/Libraries/StyleSheet/StyleSheet.js#L373):
const s = { flex: { flex: 1 } }
export const FlexView = (props) => <View style={s.flex}>{props.children}</View>
И да, в предыдущем версии RN это был глобальный реестр стилей, но это было еще больше медленный, потому что на самом деле он никогда не пересекал границу моста (доказательство от 0.55 филиал) 😀
Ответ 3
Вот исходный код создания.
create<T: Object, U>(obj: T): {[key:$Keys<T>]: number} {
var result: T = (({}: any): T);
for (var key in obj) {
StyleSheetValidation.validateStyle(key, obj);
result[key] = ReactNativePropRegistry.register(obj[key]);
}
return result;
}
Я не эксперт React ни в каком. Я фактически никогда не использовал это, но вот мои идеи. Похоже, что create
выполняет некоторую проверку ваших ключей и регистрирует их в React.
Я думаю, что вы можете пропустить проверку, просто не вызывая create
, но я не уверен, что именно ReactNativePropRegistry.register
делает точно.
Ссылка на источник