Условия в рендеринге 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>; } } }
Какой вариант использовать, полностью зависит от разработчика, так как пока нет лучших рекомендаций. Но помните, что ваш код должен быть максимально читаем.