DevGang
Авторизоваться

Условия в рендеринге React Native компонент

Иногда, в зависимости от условий, вам необходимо выполнить различные действия или представить конкретное отображение. Для этого вам потребуется использовать условные выражения.

Для тех, кто не знает, что такое условные выражения:

if (year > 2017){
    console.log("It is too yearly!") 
} else {
    console.log("Yeah, it is time now!") 
}

Для разработчиков, имеющих опыт работы с React или React Native, решение проблемы с условными выражениями при рендеринге может быть очевидным, но тем кто ранее не сталкивался с миром JSX это может оказаться не столь очевидным.

Как вы уже знаете, React Native использует JSX, который является расширением синтаксиса JavaScript. Это расширение синтаксиса будет преобразовано в обычные объекты JS во время компиляции. Чтобы понять, как использовать условные выражения в функции рендеринга компонентов, давайте сначала рассмотрим, что такое JSX и как вы его используете.

class ItemViewComponent extends React.Component{
    render(){
        return (
            <View>
                <Text> Hello, JSX! </Text>
            </View>
        );
    }
}

ItemViewComponent - это простой компонент, который выводит «Hello, JSX!» На экран. Теперь, чтобы увидеть, что такое синтаксис JSX, мы назначим этот текст переменной, а затем используем эту переменную для вывода сообщения на экран:

class ItemViewComponent extends React.Component{
    render(){
        const helloMessage = 'Hello, JSX!';
        return (
            <View>
                <Text>{helloMessage}</Text>
            </View>
        );
    }
}

У нас есть константная переменная helloMessage, которая заключена в фигурные скобки и встроена в JSX. Таким способом вы можете встроить любой код JavaScript в JSX.

Теперь переменной мы присвоим не строку а целое выражение JSX:

class ItemViewComponent extends React.Component {
    render() {
        const helloMessage = <Text> Hello, JSX! </Text>;
        return (
            <View>
                {helloMessage}
            </View>
        );
    }
}

Как вы можете видеть, JSX позволяет повторно использовать и встраивать любые переменные в представление. Как я уже говорил ранее, JSX преобразуется в обычный JavaScript во время компиляции. Итак, следующий фрагмент

const element = (
  <h1 className="greeting">
    Hello, world!
  </h1>
);

будет преобразован в:

const element = React.createElement(
  'h1',
  {className: 'greeting'},
  'Hello, world!'
);

Теперь, когда мы знаем, что React-Native использует JSX, мы можем подумать о том, как использовать условные операторы для отображения того или иного представления. Рассмотрим следующий компонент в качестве примера:

class ItemViewComponent extends React.Component {
    render() {
        const helloMessage = <Text> Hello, JSX! </Text>;
        const goodbyeMessage = <Text> Goodbye, JSX! </Text>;
        return (
            <View>
                {helloMessage}
            </View>
        );
    }
}

Наше условие - отображать helloMessage, если this.props.isGreeting имеет значение true, или goodbyeMessage в противном случае.

Подход 1: использовать тернарные выражения

class ItemViewComponent extends React.Component {
    render() {
        const helloMessage = <Text> Hello, JSX! </Text>;
        const goodbyeMessage = <Text> Goodbye, JSX! </Text>;
        return (
            <View>
                {this.props.isGreeting ? helloMessage : goodbyeMessage}
            </View>
        );
    }
}

Подход 2: присвоить представление значению и вернуть его

class ItemViewComponent extends React.Component {
    render() {
        const helloMessage = <Text> Hello, JSX! </Text>;
        const goodbyeMessage = <Text> Goodbye, JSX! </Text>;

        let message;
        if (this.props.isGreeting) {
            message = helloMessage
        } else {
            message = goodbyeMessage
        }

        return (<View>{message}</View>);
    }
}

Подход 3: создайте отдельную функцию и делегируйте логику этой функции

class ItemViewComponent extends React.Component {
    render() {
        return ( <View> {this.displayJsxMessage()} </View> );
    }
                
    displayJsxMessage() {
        if (this.props.isGreeting) {
            return <Text> Hello, JSX! </Text>;
        } else {
            return <Text> Goodbye, JSX! </Text>;
        }
    }
}

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

#JavaScript #React #ReactNative
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

Поделитесь своим опытом, расскажите о новом инструменте, библиотеке или фреймворке. Для этого не обязательно становится постоянным автором.

Попробовать

Оплатив хостинг 25$ в подарок вы получите 100$ на счет

Получить