flex-direction为row时主动换行


flex-direction为row时主动换行(React native主动换行)

我今天在写react-native时候,遇到了很不舒服的一件事情。因为RN默认是flex布局,所以如果我想要实现inline模式就只能设置父元素的flex-direction的value为row。这样如果我们如果想要换行需要怎么处理呢?

要知道,在RN中是没有<br>标签的,所以要想换行需要采取一些非常的手段。

那有没有什么好办法能够做到主动换行呢?

在正式开始之前我先上一个例子:

const arr = [1, 2, 3, 4, 5, 6];

export default function App() {
  return (
    <SafeAreaView style={styles.container}>
      <View style={{ flexDirection: 'row' }}>
        {arr.map((item, index) => (
          <View>
            <Text key={index}>{item}</Text>
          </View>
        ))}
      </View>
    </SafeAreaView>
  );
}

很明显,上述的代码会生成一个纵向排列的123456,如果我们希望在每三个断一下,即将纵向的123456改成横向的123 <br> 456应该如何做呢?

刚开始的时候我问了ChatGPT,他给出的答案是使用伪类撑开元素:

<div class="flex-container">
  <div class="flex-item">1</div>
  <div class="flex-item break-after">2</div> <!-- 想要在这个元素后换行 -->
  <div class="flex-item">3</div>
  <div class="flex-item">4</div>
</div>
.flex-container {
  display: flex;
  flex-wrap: wrap;
  flex-direction: row;
}

.flex-item {
  width: 100px;
  margin: 5px;
}

.break-after::after {
  content: "";
  flex-basis: 100%;
}

经过我的尝试,这种方法很遗憾的不起任何作用,而且在RN中使用CSS class并不是很容易。但是他给出的代码确实给了我一些启发,经过一些摸索,我发现如果一次渲染两个元素,其中一个是正常元素而另一个负责撑开元素,那么就可以实现换行,代码如下:

const arr = [1, 2, 3, 4, 5, 6];

export default function App() {
  return (
    <SafeAreaView style={styles.container}>
      <View style={{ flexDirection: 'row', flexWrap: 'wrap', width: 200 }}>
        {arr.map((item, index) => {
          if (item % 3 !== 0) {
            return <Text key={index}>{item}</Text>;
          } else {
            return (
              <>
                {[
                  <Text key={index}>{item}</Text>,
                  <View style={{ width: '100%' }}></View>,
                ]}
              </>
            );
          }
        })}
      </View>
    </SafeAreaView>
  );
}

但是很抱歉,这样依旧有缺陷,因为reactNative中<></>实际上会影响继承,即Text和View将会被看作一个整体,而不会被解析成两个单独的元素,并且return中的jsx fragment必须有一个根节点,也就说说这种方法与顶上charGPT给出的方法并没有区别,都无法将一个元素完美换行。这只会让我们需要换行的元素变为单独的一行而已。

那么,还有什么方法呢?

完美的换行

这时候我们或许需要更新一下思路,如果在渲染过程中无法做到完美的换行,那么我们为什么不能在数据上动一点手脚呢?经过一系列思路的转换,我突然想到我们完全可以进行一个数组分割+元素嵌套的方式实现换行,代码如下:

const arr = [1, 2, 3, 4, 5, 6];
export default function App() {
  const [arrState, setArrState] = useState([]);
  useEffect(() => {
    const result = [];
    let tempArr = [];
    arr.forEach((item) => {
      tempArr.push(item);
      if (item % 3 === 0) {
        result.push(tempArr);
        tempArr = [];
      }
    });
    setArrState(result);
  }, []);
  return (
    <SafeAreaView style={styles.container}>
      {arrState.map((subArr, index) => (
        <View
          key={index}
          style={{ flexDirection: 'row', flexWrap: 'wrap', width: 200 }}>
          {subArr.map((item, subIndex) => {
            return <Text key={subIndex}>{item}</Text>;
          })}
        </View>
      ))}
    </SafeAreaView>
  );
}

终于,我们实现了完美的换行!

so,如果你也想要在flex布局中尝试主动换行,那么希望这篇文章能够解答你的疑惑。

当然,如果你有更好的方法,非常希望能在下方评论区和我分享你的好主意🤗

发布于:
编辑于: