如何更改 React Native 中特定列的样式?

Posted

技术标签:

【中文标题】如何更改 React Native 中特定列的样式?【英文标题】:How to change style for an particular column in React Native? 【发布时间】:2021-01-31 13:54:21 【问题描述】:

所以,我一直在制作一种矩阵式的桌子设计,以便在公共汽车上放置可用座位!所以,我正在循环 2d 和 3d 数组来制作这个视图!

这是输出的图片!

在这张照片中,如您所见 - 第一排首先包含一个大的垂直矩形座椅,然后是三个方形座椅!但是,作为第二行的检查 - 它已经跳出了巨大的差距?

由于第一个垂直矩形发生这种情况,因为矩形扩展了一点 - 第二行从那之后开始,

但预期的输出如下:

如何实现这一点,因为我尝试将样式设置为正方形,但没有按预期发生!

这是我的布局生成代码!

seatsMapping.map((z, i) => 
                    return (
                      <View key=i style=  >  
                        z.map((y, j) => 
                          return (
                            <View style= flexDirection: 'row'  key=j>
                              y.reverse().map((seat, p) => 
                                return (
                                  <View
                                    style= flex: 1,  
                                    key=p>
                                        
                                            seat != null &&  
                                            <View style= flexDirection: 'column' >
                                                this.seatLayoutgeneration(seat)
                                            </View>
                                        
                                  </View>
                                );
                              )
                            </View>
                          );
                        )
                      </View>
                    );
                  )

如上所示,你可以看到我正在循环进入 3d 数组,所以如果你们需要这些函数,请告诉我会再次更新!

Check here for Reproduced Snack

【问题讨论】:

你能试着把它做成一个sn-p吗?真的很容易解决 嘿,snack.expo.io/l3IVs4pVR 检查此链接以获取复制示例! 【参考方案1】:

答案是“思考专栏”

您正在创建一个数组并将其呈现为行,这无论如何都会呈现您遇到的间距问题的数据。所以解决这个问题的最好方法是在列中呈现数据。

在这里,您必须先遍历行并创建列,然后再渲染它们。您可以查看逻辑的内联 cmets。

  const renderData = (arr) => 
    const columns = [];

    //Go through the items in the row
    for (let i = arr[0].length - 1; i > -1; i--) 
      const column = [];
      //For each column in the row generate the contents
      for (let x = 0; x < arr.length; x++) 
        const seat = arr[x][i];
        const output = (
          <View style= flex: 1 >
            seat?.name && seat.length === '2' && seat.width === '1' ? (
              <View
                style=
                  width: 35,
                  height: 80,
                  borderRadius: 5,
                  borderColor: '#000',
                  backgroundColor: '#000',
                  borderWidth: 1,
                  marginBottom: 10,
                ></View>
            ) : seat?.name && seat.length === '1' && seat.width === '1' ? (
              <View
                style=
                  width: 35,
                  height: 35,
                  borderWidth: 1,
                  marginBottom: 10,
                  borderColor: 'red',
                ></View>
            ) : (
              <View style= width: 40 ></View>
            )
          </View>
        );
        //Add the content to the column
        column.push(output);
      
      //Add it to main container
      columns.push(<View>column</View>);
    

    return columns;
  ;

  return (
    <View>
      <Text>----- Seating ----</Text>

      seatsMapping.map((z, i) => 
        return (
          <View key=i>
            <Text>----- Z Axis Level: i ----</Text>
            <View style= flexDirection: 'row' >renderData(z)</View>
          </View>
        );
      )
    </View>
  );

小吃与输出 https://snack.expo.io/@guruparan/77427f

编辑

无需所有这些处理,您就可以做到这一点,这是非常直接的

export default function App() 
  const page1 = data.seats.filter((x) => x.zIndex == 0);
  const columnCount = 3;
  return (
    <View style=styles.container>
      page1.map((item) => (
        <View
          style=
            width: 35 * item.width,
            height: 35 * item.length,
            backgroundColor: 'red',
            margin: 3,
            position: 'absolute',
            left: (columnCount - item.row) * 40,
            top: item.column * 40,
          >
          <Text>columnCount - item.row + ' ' + item.column</Text>
        </View>
      ))
    </View>
  );

你可以在这里试试 https://snack.expo.io/@guruparan/busseat

【讨论】:

您好,感谢您的回复!我只是一个初学者!我收到一条错误消息,指出 null 不是对象等!我知道它是因为正在进行的 api 调用。而且,想听听如何优化这段代码,你能指导我吗? 数据的格式与您的数据变量的格式相同吗? 是的,格式相同!但是,我有各种条件来渲染!就像在 stockoverflow 中一样,我刚刚发布了一些! 举个例子——我贴的小吃只有卧铺结构的巴士,有座位巴士,也有组合巴士!所以,数据的格式是一样的,但渲染的条件是不同的! 所以,我可以分享我的全部内容,以便您更好地理解它!

以上是关于如何更改 React Native 中特定列的样式?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 react-native 中为特定组件传递样式道具

如何在 React Native 中更改 TextInput 占位符的样式?

如何在 React Native 中使用 onFocus 更改一个 Textinput 的边框颜色?

React Native 某些样式导致视图无法呈现

React Native,更改 React Navigation 标题样式

尝试更改状态栏样式在 ios 中给了我错误 - React native