Каков наиболее эффективный способ динамического моделирования в React-Native?

В React-Native вы можете использовать Таблица стилей для создания CSS-подобных таблиц стилей. Основная причина использования styleshee.create в пользу простых js-объектов - повышенная производительность. Тем не менее, вы часто можете захотеть динамически стилизовать компоненты, часто на основе их свойств. В основном я нашел три подхода к этому:

Обратите внимание на следующие примеры: Считайте, что const styles ... объявлен вне Компонента, так как это общий шаблон, и вы можете захотеть использовать стили между разными Компонентами. Считайте все, что находится ниже точек дерева, как часть функции рендеринга.

  1. Используя массив стилей:

    const styles = StyleSheet.create({viewStyle: {backgroundColor:'red'}})
    ...
    return <View style = {[styles.viewStyle, {color: this.props.color}]} />
    
  2. Использование Stylesheet.flatten:

    const styles = StyleSheet.create({viewStyle: {backgroundColor:'red'}})
    ...
    const flattenedStyle = StyleSheet.flatten(styles.viewStyle, {{color: this.props.color}})
    return <View style = {flattenedStyle} />
    

  3. Использование функции для создания таблицы стилей:

    const styles = (color) => StyleSheet.create({
        viewStyle: {
            backgroundColor:'red',
            color: color
            }
        })
    ...
    const style = styles(this.props.color).viewStyle
    return <View style = {style} />
    

Мне интересно, какой подход является лучшим в отношении производительности, или есть ли другой, более производительный способ? Я думаю, что варианты 2 и 3 вообще никуда не годятся, потому что динамическое создание новых таблиц стилей при изменении свойств подрывает всю цель таблиц стилей. Рад любой мысли или намекам на эту тему!

Вы нашли на это ответ?

FaisalAhmed 10.05.2019 11:21

К сожалению нет. В большинстве случаев я просто использую подход 1.

Christoph Göttert 18.05.2019 14:09

Я также думаю, что вариант два и три потребует времени и заставит ваш код расти в 5 раз быстрее, чем обычно, поэтому я рекомендую использовать первый вариант, потому что он простой, чистый и легкий для написания в 1000 раз!

Kalinaki M Brandon 08.11.2020 10:39
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
TL;DR: Angular Signals может облегчить отслеживание всех выражений в представлении (Component или EmbeddedView) и планирование пользовательских...
Sniper-CSS, избегайте неиспользуемых стилей
Sniper-CSS, избегайте неиспользуемых стилей
Это краткое руководство, в котором я хочу поделиться тем, как я перешел от 212 кБ CSS к 32,1 кБ (сокращение кода на 84,91%), по-прежнему используя...
33
3
2 609
5

Ответы 5

Вы можете запоминать создание таблицы стилей с помощью перехватчиков React, но сначала вам нужно выполнить некоторую проверку производительности, чтобы определить, действительно ли создание таблицы стилей требует оптимизации ЦП и / или памяти.

Вот пример:

const styles = (color) => StyleSheet.create({
    viewStyle: {
        backgroundColor:'red',
        color: color
        }
    })

/*
even though makeStyle is defined in EVERY render,
React will only run it ONCE for any given props.color distinct value.
The resulting value `styles` survives re-renders
*/

const makeStyle = () => styles(props.color)
const styles = useMemo(makeStyle, [props.color]);

А вот и официальная документация.

Текущая реализация StyleSheet.create очень быстрая, и с useMemo все в порядке. Вопрос в том, стоит ли использовать мемоизацию (с не чистым дочерним компонентом) или вы можете просто создавать новый объект при каждом рендеринге.

Stanislav Mayorov 26.07.2020 18:53

Вы рассматривали CSS в библиотеках JS, таких как Styled components?

Вы можете передать реквизит и получить динамичный стиль, учитывая, что:

https://styled-components.com/docs/basics#passed-props

Невозможно представить, чтобы такая сложная библиотека обеспечивала наилучшую производительность. Конечно, лучший опыт разработчика, но вопрос не в этом.

Slbox 06.06.2021 01:55

Здесь вы можете выполнить динамическое моделирование в react native для каждого стиля.

Как это

<Text style = {styles.simpleText('red')}>Required field</Text>

// In styling
const styles = StyleSheet.create({
     simpleText: (colorProp = 'black') => ({ // default black set
           fontSize: 14,
           color: colorProp,
     })
})

и вы также можете передать любой тип данных для условного стиля

Возможно, это немного перебор для простого динамического стиля, но Reanimated очень производительный и будет запускать переход стиля со скоростью 60 кадров в секунду https://github.com/software-mansion/react-native-reanimated

Он архивирует это, заранее объявляя все стили, необходимые для анимации / перехода, и запускает их в собственном потоке, поэтому связь через мост JS-> Native кода минимальна.

На странице о них есть более подробное объяснение https://docs.swmansion.com/react-native-reanimated/docs/about

Один из подходов

// homeSreen
<View style = {styles.filterButton(isSelected)}>
  <Text> Strawberry </Text>
</View>

// styles.js
import { StyleSheet } from 'react-native';
import { Colors } from '../../theme';

export default StyleSheet.create({
  container: {
    backgroundColor: Colors.lighter,
  },

  filterButton: isSelected => ({
   padding: 15,
   backgroundColor: isSelected? Colors.background.primary: Colors.background.secondary
  }),
});

Другие вопросы по теме