如何在React中呈现多行文本字符串


83

假设我有一个包含换行符的文本字符串,我将其渲染为:

render() {
    var text = "One\nTwo\nThree";
    return <div>{text}</div>;
}

在HTML中,换行符不呈现为换行符。我应该如何在React中做到这一点?我不想转换为<br>标签并使用dangerouslySetInnerHTML。还有另一种方法吗?


如果您使用过<br>,那可能是问题所在。我注意到JS Transformer不喜欢它,除非您使用<br/>HTML 4版本。
steviesama

要将React代码的两行分配给一个变量,请在这两行之间使用括号。()
Vael Victus

1
我使用预包装解决了这个问题。这是我对类似问题的回答:stackoverflow.com/a/55466235/5346095
JS开发人员

Answers:


73

您可以尝试为每行放置div

render() {
    return (<div>
        <div>{"One"}</div>
        <div>{"Two"}</div>
        <div>{"Three"}</div>
    </div>);
}

要么

render() {
    var text = "One\nTwo\nThree";
    return (
    <div>
        {text.split("\n").map((i,key) => {
            return <div key={key}>{i}</div>;
        })}
    </div>);
}

5
我喜欢这个。我想我也可以用<MultilineText>它来做一个组件!
亚伦·比尔

13
为什么要使用<div>格式来设置文本行?<p>在语义上似乎更正确。
科斯特

1
这是认真如何应该如何处理?我知道这可行,但这会在标记中造成混乱。如果用户要复制此文本怎么办?公平地说,这里的错误是在react的处理上,而不是您的解决方案。这可能是最好的选择,但是哇。
kevincoleman

1
甚至不用考虑反应,而是考虑如何使用HTML处理该问题。到目前为止,最好的解决方案是创建div,放置BR标签或块跨度。在我看来,这与HTML / react的情况相同。
塞尔吉奥·弗洛雷斯

236

新建一个CSS类

.display-linebreak {
  white-space: pre-line;
}

使用该CSS类显示文本

render() {
  const text = 'One \n Two \n Three';
  return ( 
     <div className="display-linebreak"> 
        {text} 
     </div>
  );
}

带有换行符的渲染(空白序列将折叠为单个空白。必要时文本将换行)。像这样:

One
Two
Three

您也可以考虑进行预包装。更多信息在这里(CSS空白属性)。


2
这是我接受的答案的一个很好的替代选择,应该得到推荐,但是我觉得我应该提到我尝试过并且在布局/溢出/渲染方面遇到了问题;在我当时需要修复的所有情况下,所有空格选项似乎都无法正常工作,而被接受的答案却可以。
亚伦·比尔

肯定是最好的答案。只需添加CSS,就无需使用map或其他任何东西。谢谢。
弗雷德里科·塞萨尔

26

您可以使用CSS属性“ white-space:pre”。我认为这是处理此问题的最简单方法。


最佳答案,imo:这是一个显示问题,因此,理想情况下应在CSS中处理(而不是通过更改html)
Bogdan D

12
white-space:prewhite-space:nowrap我的效果相同,即文本溢出了容器。使用white-space:pre-wrap代替解决了这个问题。
rorymorris89 '51

仅使用“ pre”将导致文本超出/不包装容器。使用white-space: pre-line;代替。
弗雷德里科·塞萨尔

6

这里是最干净的解决方案(afaik):

   render(){
      return <pre>
             Line 1{"\n"}
             Line 2{"\n"}
             Line 3{"\n"}
      </pre>
   }

而不是您也可以使用<div style={{whiteSpace:"pre"}}>或任何其他html块元素(例如spanp具有此style属性)


在尝试了各种方法后,谢谢,这是唯一对我有用的解决方案。
Saurabh Rana

0

在普通的html文本区域内呈现定界文本“我的第一行\我的第二行\ nWhatevs ...”。我知道它有效,因为我今天才使用它!如果需要,将文本区域设置为readOnly,并相应地设置样式。



0

您可以使用html的textarea标签,以后可以将样式添加到textarea标签中。它几乎解决了您所有的问题,包括换行符和制表符空格。Cheerzz ...

例如:您的渲染将如下所示

render() {
    var text = "One\nTwo\nThree";
    return <textarea>{text}</textarea>;
}

输出:

One
Two
Three

0

试试这个

render() {
    var text = "One\nTwo\nThree";
    return <div style={{whiteSpace: 'pre-line'}}>{text}</div>;
}

0

您可以安全地运行String.raw此类型的值。

const text = String.raw`One
Two
Three
`
render() {
  return <div style={{ whiteSpace: "pre" }}>{text}</div>
}

您也可以只使用一个<pre>标签,该标签可以有效地完成相同的操作,但是如果您已经将其用于其他用途,则在语义上不太清楚。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.