React Native 上使用 FlexBox 的 2 列布局

问题描述 投票:0回答:3

我正在尝试从项目列表中的 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>
    );
  }
react-native flexbox
3个回答
137
投票

如果您使用宽度百分比值是可能的:

<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
  }
})

6
投票

您可以尝试使用平面列表滚动视图。下面的代码生成 2 列。如果你想要 3 列,请更改 numcolumn={data.length/3} 等

             <ScrollView
              horizontal
              showsVerticalScrollIndicator={false}
              showsHorizontalScrollIndicator={false}
              contentContainerStyle={{
                flexDirection: 'row',
                flexWrap: 'wrap',
              }}>
              <FlatList
                data={data}
                renderItem={this.renderItem}
                keyExtractor={item => `${item.id}`}
                showsHorizontalScrollIndicator={false}
                numColumns={data.length / 2}
              />
            </ScrollView>

1
投票

您可以将元素列表映射到成对的数组中。

然后将这些对渲染为列表中的一行

<View className="px-4 ">
  {Buttons.map((row, i) => {
    return (
      <View className="flex-1 flex-row" key={i}>
        {row.map((item, j) => {
          return <ThumbButton key={j} {...item} />;
        })}
      </View>
    );
  })}
</View>

要制作嵌套数组,您可以使用此函数https://stackoverflow.com/a/44937519/1807666

function combineTwo(inputArray: Array<object>) {
  var result = [];
  for (var i = 0; i < inputArray.length; i += 2) {    
    result.push([inputArray[i], inputArray[i + 1]]); 
  }
  return result;
}
© www.soinside.com 2019 - 2024. All rights reserved.