RN: Выровняйте элементы в ряду слева и справа

Вот компонент RN (0,59), использующий sectionList для отображения имени события в строке. renderItem отображает 3 элемента подряд, начиная с изображения головы (левое изображение), затем название события и заканчивая другим изображением головы (правое изображение).

render() {
       return (
        <View  style = {styles.container}>
          <SectionList
              sections = {this.state.activeEvents} 
              renderItem = {({item, section}) => {return (
                                                <View style = {styles.container}>
                                                  <Image style = {styles.image} source = {{uri: item.image}}/>
                                                  <TouchableOpacity onPress = {() => {this._onPress(item.id)}} >
                                                    <Text style = {styles.item} key = {item.id}>{item.name}</Text>
                                                  </TouchableOpacity>
                                                  <View style = {styles.containerRight}>
                                                    <Image style = {styles.image} source = {{uri: "https://bootdey.com/img/Content/avatar/avatar1.png"}}/>
                                                  </View>
                                                </View>)}}

              renderSectionHeader = {({section}) => <Text style = {styles.sectionHeader}>{section.title}</Text>}
              keyExtractor = {(item, index) => item + index}
            />
        </View>
      ); 

      }

}

const styles = StyleSheet.create({
    container: {
      flex: 1,
      paddingTop: 22,
      paddingVertical: 12,
      flexDirection: 'row',
      alignItems: 'flex-start',
      flexDirection: 'row',
      alignItems: 'flex-start'
    },
    containerRight: {
      flex: 1,
      paddingTop: 22,
      paddingVertical: 12,
      flexDirection: 'row',
      alignItems: 'flex-end',
      flexDirection: 'row',
      alignItems: 'flex-end' 
    },
    sectionHeader1: {
      paddingTop: 2,
      paddingLeft: 10,
      paddingRight: 10,
      paddingBottom: 2,
      fontSize: 14,
      fontWeight: 'bold',
      backgroundColor: 'rgba(247,247,247,1.0)',
    },
    sectionHeader:{
      backgroundColor : '#64B5F6',
      fontSize : 20,
      padding: 5,
      color: '#fff',
      fontWeight: 'bold'
   },
    item: {
      padding: 10,
      fontSize: 18,
      height: 44,
    },
    image:{
      width:45,
      height:45,
      borderRadius:20,
      marginLeft:20
    },
    imageRight:{
      width:45,
      height:45,
      borderRadius:20,
      marginRight:20
    },
  }) 

Вот результат приведенного выше рендера:

RN: Выровняйте элементы в ряду слева и справа

Все элементы строки (левое изображение, название события, правое изображение) должны быть выровнены по вертикали. Левое изображение и название события правильно выровнены по левой стороне строки, но правое изображение должно быть выровнено по горизонтали по правой стороне строки. Как я могу изменить свой jsx и стиль для достижения этого пользовательского интерфейса?

Вы хотите, чтобы между двумя изображениями было пространство? Другими словами, вы хотите выровнять левое изображение по левому краю, а правое по правому?

mahan 17.06.2019 22:02

да, левое изображение слева и правое изображение справа! Название события находится сразу после левого изображения.

user938363 17.06.2019 22:06
stackoverflow.com/questions/36008969/… Похоже alignItems: "flex-end" не работает. Пробовали ли вы использовать другой контент вместо нужного изображения?
mahan 17.06.2019 22:37

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

user938363 18.06.2019 00:16
Умерло ли Create-React-App?
Умерло ли Create-React-App?
В этом документальном фильме React.dev мы исследуем, мертв ли Create React App (CRA) и какое будущее ждет этот популярный фреймворк React.
Освоение React Native: Пошаговое руководство для начинающих
Освоение React Native: Пошаговое руководство для начинающих
React Native - это популярный фреймворк с открытым исходным кодом, используемый для разработки мобильных приложений. Он был разработан компанией...
В чем разница между react native и react ?
В чем разница между react native и react ?
React и React Native - два популярных фреймворка для создания пользовательских интерфейсов, но они предназначены для разных платформ. React - это...
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
Хуки React: что это такое и как их использовать
Хуки React: что это такое и как их использовать
Хуки React - это мощная функция библиотеки React, которая позволяет разработчикам использовать состояние и другие возможности React без написания...
3
4
2 739
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я полагаю, вы хотели бы что-то вроде этого:

Вы можете сделать это, добавив большой контейнер для строки и добавив:

justifyContent: 'space-between'

Оберните исходный код и исправьте его под свои нужды или посмотрите рабочую закуску: закуска.expo.io/@abranhe/stackoverflow-56638124

import React, { Component } from 'react';
import {
  SectionList,
  Text,
  Image,
  View,
  TouchableOpacity,
  StyleSheet,
} from 'react-native';

const events = [
  {
    title: '2019-04-03',
    data: [
      {
        name: 'Event 1',
        imageLeft: {
          uri: 'https://bootdey.com/img/Content/avatar/avatar1.png',
        },
        imageRight: {
          uri: 'https://bootdey.com/img/Content/avatar/avatar2.png',
        },
      },
      {
        name: 'Event 2',
        imageLeft: {
          uri: 'https://bootdey.com/img/Content/avatar/avatar3.png',
        },
        imageRight: {
          uri: 'https://bootdey.com/img/Content/avatar/avatar4.png',
        },
      },
    ],
  },
  {
    title: '2019-04-07',
    data: [
      {
        name: 'Event 2',
        imageLeft: {
          uri: 'https://bootdey.com/img/Content/avatar/avatar5.png',
        },
        imageRight: {
          uri: 'https://bootdey.com/img/Content/avatar/avatar6.png',
        },
      },
    ],
  },
];

export default class App extends Component {
  onPressEvent = id => {
    alert(eventName);
  };

  render() {
    return (
      <SectionList
        style = {styles.selectionList}
        sections = {events}
        renderItem = {({ item: event, section }) => {
          return (
            <View style = {styles.container}>
              <View style = {styles.content}>
                <Image style = {styles.image} source = {event.imageLeft} />
                <TouchableOpacity onPress = {() => this.onPressEvent(event.name)}>
                  <Text>{event.name}</Text>
                </TouchableOpacity>
                <Image style = {styles.image} source = {event.imageRight} />
              </View>
            </View>
          );
        }}
        renderSectionHeader = {({ section }) => (
          <Text style = {styles.sectionHeader}>{section.title}</Text>
        )}
        keyExtractor = {(item, index) => item + index}
      />
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    paddingTop: 22,
  },
  content: {
    flexDirection: 'row',
    justifyContent: 'space-between',
    alignItems: 'center',
  },
  selectionList: {
    marginTop: 22,
  },
  sectionHeader: {
    backgroundColor: '#64B5F6',
    fontSize: 20,
    padding: 5,
    color: '#fff',
    fontWeight: 'bold',
  },
  image: {
    width: 45,
    height: 45,
    borderRadius: 20,
    margin: 20,
  },
});

Если у вас есть какие-либо вопросы, дайте мне знать!

Обновление после комментария автора вопроса

It looks close. But I was not able to do any test since my post because of an error related to AndroidX. Can you move the event.name to the left right after the left image? For the icon on the right, it may be changed to a hamburger menu

Было бы легко просто обернуть левый значок в

<View>
  <Image/>
  <Text>Some Text</Text>
</View>

то это будет выглядеть так:

Смотрите обновленную закуску: закуска.expo.io/@abranhe/stackoverflow-56638124-обновлено

<View style = {styles.leftIcon}>
  <Image style = {styles.image} source = {event.imageLeft} />
  <TouchableOpacity onPress = {() => this.onPressEvent(event.name)}>
    <Text>{event.name}</Text>
  </TouchableOpacity>
</View>

Затем добавьте следующий стиль:

leftIcon: {
  flexDirection: 'row',
  justifyContent: 'center',
  alignItems: 'center',
}

Это выглядит близко. Но я не смог провести тест с момента моего сообщения из-за ошибки, связанной с AndroidX. Можете ли вы переместить event.name влево сразу после левого изображения? Значок справа может быть изменен на гамбургское меню.

user938363 19.06.2019 01:03

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

abranhe 19.06.2019 08:52

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