Мне всегда было интересно писать о высокоуровневых функциях и высокоуровневых компонентах в JavaScript, но мне не хватало возможности создавать значимые функции в моих проектах. Функция высшего порядка принимает функцию в качестве аргумента или возвращает функцию как функцию. Компонент более высокого порядка - это функция, которая принимает компонент и возвращает новый компонент. В своем стремлении создавать приложения React Native я наткнулся на необходимость создания повторно используемых компонентов для надлежащего масштабирования моих приложений.

Мой опыт работы с React Native был связан с простым голым CLI и версиями EXPO CLI. В Bare React Native есть две отдельные папки для управления компонентами для Android и IOS. В EXPO приложение управляет обоими приложениями за вас. Возникает проблема: компоненты будут отображаться по-разному в зависимости от экранов телефона Android и iPhone. Создать приложение, которое будет работать в обеих операционных системах, означает учесть прихоти обеих.

Вырез на iPhone X и строка состояния на многих устройствах Android приведут к тому, что компоненты рендеринга будут находиться в разных положениях. Чем больше экранов я создаю в своих приложениях, тем больше стилей мне потребуется, чтобы исправить мои компоненты с учетом различий ... если я не использую компоненты более высокого порядка для унификации моих экранов.

import { SafeAreaView } from 'react-native';
import Constants from 'expo-constants';

Мне нужен компонент SafeAreaView из библиотеки react-native, чтобы учесть расстояние между выемками в верхней части iPhone X. Это гарантирует, что мои компоненты не будут отображаться в небезопасной области выемок. Мне понадобятся константы из библиотеки expo-constants и извлечение компонента statusBarHeight для учета «безопасного» интервала для верхней части моего экрана Andriod. Мне нужно было создать компонент более высокого порядка, который мог бы учитывать обе проблемы с интервалом и использовать созданный компонент на экранах, которые должны отображать контент из верхней области просмотра. Я создал следующий компонент SafeScreen более высокого порядка, чтобы мои экраны отображались должным образом.

import React from 'react'
import Constants from 'expo-constants';
import { SafeAreaView, StyleSheet, View } from 'react-native';
const SafeScreen =({ children, style })=>{
    return(
        <SafeAreaView style= {[styles.container, style ]}>
            <View style={[styles.view], style}>
                {children}
            </View>
        </SafeAreaView>
    )
}
export default SafeScreen
const styles = StyleSheet.create({
    container:{
        flex:1,
        paddingTop:Constants.statusBarHeight
    }
})

Этот компонент SafeScreen при импорте в другие компоненты преобразует дочерние свойства и отображает их в видимой области экрана. Поскольку я реализовал в этом компоненте исправления как для Andriod, так и для iPhone, любой экран, на котором используется этот компонент, будет безопасно отображать дочерние элементы. Этот компонент будет многоразовым и избавит меня от необходимости переписывать код SafeScreen. Этот контейнер SafeScreen также может иметь свойство style. Благодаря опоре стиля мои компоненты, которые использовали этот экран, могут быть настроены и стилизованы по своему усмотрению. Таблица стилей в этом компоненте будет управлять только областью видимости, но эту таблицу стилей можно использовать для внесения всеобъемлющих изменений в мои экраны просмотра. Наличие многоразового кода означает уменьшение необходимости создавать более расточительный код и значимо перерабатывать мой код.

Написание повторно используемого кода упрощает создание новых компонентов или частей приложения. Повторно используемый код также упрощает внесение изменений в компоненты, использующие этот фрагмент.

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

До следующего раза, Ура!

Джеймс Ву

Использованная литература:

Https://reactjs.org/docs/higher-order-components.html