Клон пользовательского интерфейса приложения Camping Spots Finder с помощью React Native # 2: раздел списка — Kriss

Это руководство является второй частью нашего клона пользовательского интерфейса приложения Camping Spots Finder с использованием React Native. В предыдущей части мы успешно реализовали раздел просмотра карты вместе с пользовательскими заголовками и вкладками заголовков. Этот урок является продолжением того же урока, на котором мы остановились в предыдущей части. Итак, предлагается пройти предыдущие части для лучшего понимания и понимания всего проекта.

Как было сказано в предыдущей части, вдохновением для этой серии руководств послужил React нативный шаблон недвижимости это позволяет нам создавать полнофункциональные, готовые к развертыванию мобильные приложения, которые каждый может использовать для создания своих собственных приложений React Native. И эта вторая часть также является продолжением реализации кодирования и дизайна из видеоурока Youtube от Набор пользовательского интерфейса React для клона приложения Camping Spots Finder.

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

Итак, начнем!!

Прежде всего, мы собираемся внести несколько простых изменений в раздел заголовка, который включает в себя настраиваемый заголовок и вкладки заголовка. Здесь, в файле Camping.js render() метод, мы собираемся включить только renderMap() а также renderList() метод компонента ScrollView. Затем мы собираемся изменить родителя View компонент к SafeAreaViewкомпонент и привязать к нему стиль. После этого мы включим renderHeader() метод выше ScrollView компонент, как показано во фрагменте кода ниже:

render(){     
  return (       
   <SafeAreaView style={styles.container}>         
     {this.renderHeader()}         
     <ScrollView style={styles.container}>           
       {this.renderMap()}           
       {this.renderList()}         
     </ScrollView>       
   </SafeAreaView>     
  ); 
}

Обратите внимание: нам нужно импортировать SafeAreaView компонент, а также из пакета react-native.

Здесь мы добавили SafeAreaView в качестве родительского компонента, потому что он позволяет отображать содержимое в границах безопасной области устройства. Однако мы должны быть осторожны, чтобы эта функция работала только с платформой iOS. Итак, нам нужно будет добавить дополнительный стиль на платформу Android, чтобы добиться того же результата, что и у SafeAreaView.

Но сначала мы собираемся обернуть весь шаблон renderHeader() метод с другим родителем View компонент и свяжите его с дополнительным стилем. И тогда мы позвоним renderTabs() метод внутри этого родителя View компонент после View компонент для пользовательского раздела заголовка, как показано во фрагменте кода ниже:

renderHeader() {
    return (
      <View style={styles.headerContainer}>
        
        <View style={styles.header}>
          <View style={{flex: 2, flexDirection: 'row'}}>
            <View style={styles.settings}>
              <View style={styles.location}>
                <FontAwesome name="location-arrow" size={14} color="white" />
              </View>
            </View>
            <View style={styles.options}>
              <Text style={{ fontSize: 12, color: '#A5A5A5', marginBottom: 5, }}>
                Detected Location
              </Text>
              <Text style={{ fontSize: 14, fontWeight: '300', }}>
                Northern Islands
              </Text>
            </View>
          </View>
          <View style={styles.settings}>
            <TouchableOpacity onPress={() => this.props.navigation.navigate('Settings')}>
              <Ionicons name="ios-settings" size={24} color="black" />
            </TouchableOpacity>
          </View>
        </View> 
        {this.renderTabs()}
      </View>
    )
}

Теперь нам нужно добавить стиль headerContainer к компоненту «Таблица стилей». И стиль с его свойствами представлен ниже:

headerContainer: {
    top: 0,
    marginTop : 20,            
    height: height * 0.15,
    width: width,
}

Здесь нам нужно не забыть добавить marginTop style, если мы разрабатываем для платформы Android. Это потому, что SafeAreaView компонент не работает.

Следовательно, мы получаем следующий результат на экране нашего эмулятора:

Как мы видим, у нас есть раздел заголовка с пользовательским заголовком и вкладками заголовка в правильном положении.

Теперь мы собираемся реализовать раздел списка в renderList() метод, который мы определили в предыдущей части руководства.

Реализация раздела списка

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

Включение фиктивных данных

Во-первых, мы собираемся включить фиктивные данные для мест для кемпинга в массив внутри renderList() метод. Фиктивные данные представлены во фрагменте кода ниже:

const campings = [
      {
        id: 1,
        type: 'rv',
        name: 'Camping Paradise',
        description: 'Popular spot for trekkers.',
        rating: 4.9,
        distance: 2.9,
        price: 'Free',
        image: 'https://images.unsplash.com/photo-1525811902-f2342640856e?fit=crop&w=900&h=600&q=130',
      },
      {
        id: 2,
        type: 'tent',
        name: 'Lake Florida',
        description: 'This is for all sunset lovers.',
        rating: 4.9,
        distance: 2.9,
        price: 'Free',
        image: 'https://images.unsplash.com/photo-1506535995048-638aa1b62b77?fit=crop&w=900&h=600&q=130',
      },
    ];

Здесь мы определили фиктивные данные как campings массив, который включает в себя объекты с детализацией мест для кемпинга. Теперь мы перейдем к реализации шаблона для раздела списка.

Создание элемента шаблона для раздела списка

Здесь мы собираемся начать с реализации простого шаблона внутри renderList() метод. Шаблон будет содержать некоторые View а также Text компоненты с введенными вручную фиктивными данными, как показано во фрагменте кода ниже:

       <View>
          <View>
            <Text>Image</Text>
          </View>
          <View>
            <Text>Camping title</Text>
            <Text>Camping description</Text>
            <View>
              <Text>4.9</Text>
              <Text>2.9 miles</Text>
              <Text>Free</Text>
            </View>
          </View>
          <View>
        </View>
       </View>

Следовательно, мы получим следующий результат на экране нашего эмулятора:

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

Добавление правильных стилей и иконок

Поскольку шаблон, который мы создали выше, не содержит стилей, мы собираемся добавить в него некоторые стили. Затем мы добавим несколько значков из Ionicons а также FontAwesome icon пакеты, которые мы импортировали в предыдущем уроке. Нам нужно добавить несколько flex свойства стиля, а также добавить больше View компоненты со стилями, чтобы придать шаблону элемента списка правильный вид. Код для реализации правильного шаблона элемента списка представлен во фрагменте кода ниже:

<View style={styles.camping}>
        <View>
          <Image />
        </View>
        <View style={styles.campingDetails}>
              <View style={{ flex: 1, flexDirection: 'column', justifyContent: 'center' }}>
                <Text style={{ fontSize: 14, fontWeight: 'bold' }}>
                  Camping title
                </Text>
                <Text style={{ fontSize: 12, color: '#A5A5A5', paddingTop: 5 }}>
                  Camping description
                </Text>
              </View>
              <View style={{ flex: 1, flexDirection: 'row', }}>
                <View style={styles.campingInfo}>
                  <FontAwesome name="star" color="#FFBA5A" size={12} />
                  <Text style={{ marginLeft: 4, color: '#FFBA5A' }}>3.5</Text>
                </View>
                <View style={styles.campingInfo}>
                  <FontAwesome name="location-arrow" color="#FF7657" size={12} />
                  <Text style={{ marginLeft: 4, color: '#FF7657' }}>3.0miles</Text>
                </View>
                <View style={styles.campingInfo}>
                  <Ionicons name="md-pricetag" color="black" size={12} />
                  <Text style={{ marginLeft: 4, color: 'black' }}>Free</Text>
                </View>
              </View>
        </View>
</View>

Здесь у нас есть родитель View компонент, содержащий два дочерних View составные части. Первый ребенок View компонент зарезервирован для Image составная часть. Секунда View Компонент зарезервирован для раздела сведений внутри элемента списка. Секунда View компонент состоит из нескольких дочерних View компоненты со стилем. И эти View компоненты обертывают Icon компоненты, а также Text составные части.

Как видно из приведенного выше фрагмента кода, в каждом из них имеется несколько привязок стилей. View составная часть. Некоторые из них являются встроенными стилями, а некоторые — стилями из Stylesheet составная часть. Стиль от Stylesheet Компонент представлен во фрагменте кода ниже:

  camping: {
    flex: 1,
    flexDirection: 'row',
    borderBottomColor: '#A5A5A5',
    borderBottomWidth: 0.5,
    padding: 20,
  },
  campingDetails: {
    flex: 2,
    paddingLeft: 20,
    flexDirection: 'column',
    justifyContent: 'space-around',
  },
  campingInfo: {
    flexDirection: 'row',
    alignItems: 'center',
    marginRight: 14,
  },

Следовательно, мы получим следующий результат на экране нашего эмулятора:

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

Здесь мы собираемся добавить кнопку меню с вертикальным значком параметров. Значок, который мы хотим включить, недоступен в FontAwesome или же Ionicons пакет значков. Итак, нам нужно импортировать еще один пакет значков, который SimpleLineIcons пакет значков из пакета векторных значков, как показано во фрагменте кода ниже:

import { FontAwesome , Ionicons, SimpleLineIcons} from '@expo/vector-icons';

Теперь мы собираемся использовать SimpleLineIcons package, чтобы добавить вертикальную кнопку меню со значком опции справа. Для этого нам нужно добавить еще один View компонент внутри второго дочернего элемента View компонент renderList() как показано в фрагменте кода ниже:

<View style={styles.campingDetails}>
              <View style={{ flex: 1, flexDirection: 'column', justifyContent: 'center' }}>
                <Text style={{ fontSize: 14, fontWeight: 'bold' }}>
                  Camping title
                </Text>
                <Text style={{ fontSize: 12, color: '#A5A5A5', paddingTop: 5 }}>
                  Camping description
                </Text>
              </View>
              <View style={{ flex: 1, flexDirection: 'row', }}>
                <View style={styles.campingInfo}>
                  <FontAwesome name="star" color="#FFBA5A" size={12} />
                  <Text style={{ marginLeft: 4, color: '#FFBA5A' }}>3.5</Text>
                </View>
                <View style={styles.campingInfo}>
                  <FontAwesome name="location-arrow" color="#FF7657" size={12} />
                  <Text style={{ marginLeft: 4, color: '#FF7657' }}>3.0miles</Text>
                </View>
                <View style={styles.campingInfo}>
                  <Ionicons name="md-pricetag" color="black" size={12} />
                  <Text style={{ marginLeft: 4, color: 'black' }}>Free</Text>
                </View>
              </View>
            </View>

            <View style={{ flex: 0.2, justifyContent: 'center' }}>
              <SimpleLineIcons name="options-vertical" color="#A5A5A5" size={24} />
            </View>
</View>

Здесь мы добавили View компонент, обертывающий SimpleLineIcons компонент, который имеет имя значкаoptions-verticle с некоторыми color а также size реквизит.

Следовательно, мы получаем следующий результат на экране нашего эмулятора:

Как мы видим, у нас есть кнопка параметров справа от элемента списка. Теперь мы собираемся заменить ручные данные-заполнители фиктивными данными, которые мы определили ранее в campings множество.

Интеграция фиктивных данных

На этом этапе мы собираемся интегрировать точные данные в точные заполнители в шаблоне элемента списка. Поскольку у нас есть массив с двумя объектами, мы будем перебирать массив, используя map() функция массива доступна в react-native. map() позволяет перебирать каждый элемент массива и возвращать требуемый шаблон. Родитель View компонент внутри map() функция примет уникальный идентификатор, известный как key который будет однозначно идентифицировать каждый элемент списка. Теперь для реализации map() массива и выполнить итерацию по массиву, который вернет шаблон для каждого элемента с фиктивными данными, нам нужно использовать код, указанный во фрагменте кода ниже, в наш renderList() метод:

return campings.map(
      camping => {
        return (
          <View key={`camping-${camping.id}`} style={styles.camping}>
            <View>
              <Image />
            </View>
            <View style={styles.campingDetails}>
              <View style={{ flex: 1, flexDirection: 'column', justifyContent: 'center' }}>
                <Text style={{ fontSize: 14, fontWeight: 'bold' }}>
                  {camping.name}
                </Text>
                <Text style={{ fontSize: 12, color: '#A5A5A5', paddingTop: 5 }}>
                  {camping.description}
                </Text>
              </View>
              <View style={{ flex: 1, flexDirection: 'row', }}>
                <View style={styles.campingInfo}>
                  <FontAwesome name="star" color="#FFBA5A" size={12} />
                  <Text style={{ marginLeft: 4, color: '#FFBA5A' }}>{camping.rating}</Text>
                </View>
                <View style={styles.campingInfo}>
                  <FontAwesome name="location-arrow" color="#FF7657" size={12} />
                  <Text style={{ marginLeft: 4, color: '#FF7657' }}>{camping.distance} miles</Text>
                </View>
                <View style={styles.campingInfo}>
                  <Ionicons name="md-pricetag" color="black" size={12} />
                  <Text style={{ marginLeft: 4, color: 'black' }}>{camping.price}</Text>
                </View>
              </View>
            </View>
            <View style={{ flex: 0.2, justifyContent: 'center' }}>
              <SimpleLineIcons name="options-vertical" color="#A5A5A5" size={24} />
            </View>
          </View>
        )
})

Таким образом, мы получим следующий результат на экране нашего эмулятора:

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

Включение изображения в список

На этом этапе мы будем работать с изображением, которое должно быть включено в левую часть элемента списка. Мы уже разлучили ребенка View компонент внутри родителя View компонент renderList() метод, в котором мы определили Image составная часть. Теперь мы предоставим источник и некоторые свойства стиля этому компоненту изображения, как показано во фрагменте кода ниже:

        <View key={`camping-${camping.id}`} style={styles.camping}>
            <View style={{flex : 1, overflow: 'hidden'}}>
              <Image
                style={styles.campingImage}
                source={{ uri: camping.image }}
              />
            </View>

Необходимый стиль представлен в приведенном ниже фрагменте кода:

campingImage: {
    width: width * 0.30,
    height: width * 0.25,
    borderRadius: 6,
  },

Следовательно, мы получим следующий результат в нашей симуляции эмулятора:

Как мы видим в симуляции выше, у нас есть изображение с левой стороны, и событие прокрутки также работает правильно. Но стиль изображения не совсем соответствует стилю изображения в реальном приложении. Итак, мы собираемся внести небольшие изменения в Image компонент, чтобы сделать его точно таким же, как в реальном приложении Camping Spot Finder.

Изменение компонента изображения на ИзображениеФон

Здесь мы собираемся заменить Image компонент с ImageBackground составная часть. ImageBackground компонент является синонимом background-image свойство CSS в Интернете. <ImageBackground> компонент имеет те же реквизиты, что и Image компонент и позволяет нам добавлять к нему любые дочерние элементы, которые мы хотели бы наложить поверх него. Но сначала нам нужно импортировать ImageBackground компонент из пакета react-native, как показано во фрагменте кода ниже:

import {   ImageBackground,   Image,   Platform,   ScrollView,   StyleSheet,   Text,   TouchableOpacity,   View,   Dimensions,   SafeAreaView } from 'react-native';

Теперь нам нужно добавить ImageBackground компонент вместо Image компонент и используйте необходимые реквизиты и стили, как показано во фрагменте кода ниже:

Теперь изображение в разделе списка выглядит так же, как в реальном приложении. На этом мы успешно завершили реализацию раздела списка в нашем клоне пользовательского интерфейса приложения Camping Spot Finder. Список с информацией о кемпингах выглядит так же, как и в реальном приложении.

Теперь мы собираемся подготовить небольшую предпосылку для следующей части этой серии руководств. То есть реализовать навигацию к экрану настроек.

Этот шаг является небольшой предпосылкой для нашей следующей части этой серии руководств. На этом этапе мы просто добавим навигацию на экран настроек с помощью кнопки значка настроек, которую мы создали в разделе заголовка. Мы уже настроили TouchableOpacity компонент к кнопке настроек в разделе заголовка внутри renderHeader() функция. Теперь мы собираемся добавить элемент управления навигацией для перехода к экрану настроек в onPress событие TouchableOpacity компонент, как показано во фрагменте кода ниже:

<View style={styles.settings}>
            <TouchableOpacity onPress={() => this.props.navigation.navigate('Settings')}>
              <Ionicons name="ios-settings" size={24} color="black" />
            </TouchableOpacity>
          </View>

Поскольку наш экран Campings уже настроен в стеке навигатора, navigation экземпляр, который обеспечивает navigate() функция легко доступна для нас в prop переменная. Итак, с помощью navigate() с параметром «Настройки», мы можем перейти к экрану «Настройки», просто нажав кнопку настроек в разделе заголовка, как показано в симуляции эмулятора ниже:

Вывод

Это руководство является второй частью серии руководств по клонированию пользовательского интерфейса приложения Camping Spot Finder. В этой части мы продолжили с того места, на котором остановились в первой части этой серии руководств. В части руководства мы впервые узнали, как использовать SafeAreaView составная часть. Затем мы узнали, как интегрировать фиктивные данные в шаблон, используя map() функция массива. Мы также узнали об одном новом компоненте, который ImageBackground компонент, который мы импортировали из пакета react-native, чтобы правильно разместить изображение в разделе списка. Наконец, мы получили представление о том, как использовать navigate() функция, предоставляемая navigation экземпляр доступен в prop переменная, чтобы перейти к экрану настроек.

В следующей части мы собираемся реализовать различные компоненты экрана настроек в нашем клоне пользовательского интерфейса приложения Camping Spots Finder.

Итак, следите за обновлениями, ребята!!

Пост Клон пользовательского интерфейса приложения Camping Spots Finder с помощью React Native # 2: раздел списка появился первым на Крисс.

Раскрытие информации

Этот пост содержит партнерские ссылки; Я могу получить компенсацию, если вы купите
продукты или услуги по разным ссылкам, приведенным в этой статье

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *