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

Aar*_*all 63 reactjs

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

render() {
    var text = "One\nTwo\nThree";
    return <div>{text}</div>;
}
Run Code Online (Sandbox Code Playgroud)

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

小智 171

创建一个新的CSS类

.display-linebreak {
  white-space: pre-line;
}
Run Code Online (Sandbox Code Playgroud)

使用该CSS类显示您的文本

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

使用换行符渲染(空格的序列将折叠为单个空格.文本将在必要时换行).像这样:

One
Two
Three
Run Code Online (Sandbox Code Playgroud)

您也可以考虑预包装.更多信息请访问 http://www.w3schools.com/cssref/pr_text_white-space.asp

  • 这是我接受的答案的一个很好的替代方案,值得点赞,但我觉得我应该提到我尝试过它并且在布局/溢出/渲染方面遇到了问题;在我当时需要修复的所有情况下,似乎没有一个空格选项可以正常工作,而接受的答案却可以。 (3认同)
  • 肯定是最佳答案。只需添加 CSS,无需使用地图或其他任何东西。谢谢。 (2认同)

Ser*_*res 63

你可以尝试为每一行添加div

render() {
    return (<div>
        <div>{"One"}</div>
        <div>{"Two"}</div>
        <div>{"Three"}</div>
    </div>);
}
Run Code Online (Sandbox Code Playgroud)

要么

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

  • Why would you use `<div>` to format text lines? `<p>` seems more semantically correct. (8认同)
  • 我喜欢这个.我估计我也可以制作一个`<MultilineText>`组件! (5认同)
  • 这真的是“应该”如何处理的吗?我知道这可行,但这会导致标记混乱。如果用户想要复制这段文字怎么办?公平地说,这里的错误在于 React 的处理,而不是你的解决方案。这可能是最好的选择,但是哇。 (2认同)

Bri*_*ang 16

您可以使用CSS属性"white-space:pre".我认为这是解决这个问题的最简单方法.

  • `white-space:pre`对我来说和`white-space:nowrap`有相同的效果,即文本溢出了它的容器.使用`white-space:pre-wrap`代替解决了这个问题. (7认同)
  • 仅使用“pre”将导致文本超出/不包装容器。使用“white-space: pre-line;”代替。 (2认同)

Phi*_*nin 8

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

   render(){
      return <pre>
             Line 1{"\n"}
             Line 2{"\n"}
             Line 3{"\n"}
      </pre>
   }
Run Code Online (Sandbox Code Playgroud)

也可以使用<div style={{whiteSpace:"pre"}}>, 或任何其他 html 块元素(例如spanp使用此样式属性)代替您


Cod*_*ker 5

试试这个,

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