Двухколоночный макет с flexBox на React Native

Я пытаюсь сделать макет из двух столбцов в React Native из списка элементов. Кажется, что это работает, только если я определяю ширину элементов, я хотел бы определить только процент от родительской ширины (0,5 сделает макет из 2 столбцов, но 0,25 сделает один из 4 столбцов). Можно ли это сделать?

export default class App extends Component {
  render() {
    return (
      <View style = {[styles.container, {width:width}]}>
        <View style = {styles.item}><Text>{'item1'}</Text></View>
        <View style = {styles.item}><Text>{'item2'}</Text></View>
        <View style = {styles.item}><Text>{'item3'}</Text></View>
        <View style = {styles.item}><Text>{'item4'}</Text></View>
        <View style = {styles.item}><Text>{'item4'}</Text></View>
        <View style = {styles.item}><Text>{'item5'}</Text></View>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    flexDirection: 'row',
    flexWrap: 'wrap',
  },
  item :{
    flex: 0.5, //why this doesnt work???
    // width: 150, //using fixed item width instead of flex: 0.5 works
    height: 100,
    padding: 10,
    backgroundColor: 'red',
    // flexGrow: 1,
    // flexShrink: 0,
  }
});

Вы можете поиграть с ним здесь: https://snack.expo.io/SyBjQuRxm

Рабочий эквивалент CSS: https://codepen.io/klamping/pen/WvvgBX?editors=110

Очевидно, я мог бы сделать что-то вроде создания контейнера для каждого столбца, но дело не в этом:

render() {
    return (
      <View style = {[styles.container, {width:width}]}>
        <View style = {styles.column1}>
             <View style = {styles.item}><Text>{'item1'}</Text></View>
             <View style = {styles.item}><Text>{'item2'}</Text></View>
             <View style = {styles.item}><Text>{'item3'}</Text></View>
        </View>
        <View style = {styles.column2}>
             <View style = {styles.item}><Text>{'item4'}</Text></View>
             <View style = {styles.item}><Text>{'item4'}</Text></View>
             <View style = {styles.item}><Text>{'item5'}</Text></View>
        </View>
      </View>
    );
  }
Умерло ли 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 без написания...
24
0
40 704
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это возможно, если использовать процентные значения для ширины:

<View style = {styles.container}>
  <View style = {styles.item}>
    ...
  </View>
</View>

const styles = StyleSheet.create({
  container: {
    flex: 1,
    flexDirection: 'row',
    flexWrap: 'wrap',
    alignItems: 'flex-start' // if you want to fill rows left to right
  },
  item: {
    width: '50%' // is 50% of container width
  }
})

Работает отлично, как-то совсем забыл про процент ширины. Спасибо!

Xavi A. 13.06.2018 14:50

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