从保存的textarea中反映显示行中断

den*_*xic 71 javascript textarea reactjs

使用Facebook React.在设置页面中,我有一条多行textarea,用户可以在其中输入多行文字(在我的例子中是一个地址).

<textarea value={address} />
Run Code Online (Sandbox Code Playgroud)

当我尝试显示地址时,就像{address}它一样,它没有显示换行符,而且都在一行上.

<p>{address}</p>
Run Code Online (Sandbox Code Playgroud)

任何想法如何解决这个问题?

ena*_*upe 193

没有理由使用JS.您可以使用white-spaceCSS属性轻松告诉浏览器如何处理换行符:

white-space: pre-line;
Run Code Online (Sandbox Code Playgroud)

前行

空白的序列被折叠.线条在换行字符,at处<br>和必要时用于填充线框.

看看这个演示:

<style>
  #p_wrap {
    white-space: pre-line;
  }
</style>

<textarea id="textarea"></textarea>
<p id="p_standard"></p>
<hr>
<p id="p_wrap"></p>
<script>
  textarea.addEventListener('keypress', function(e) {
    p_standard.textContent = e.target.value
    p_wrap.textContent = e.target.value
  })
</script>
Run Code Online (Sandbox Code Playgroud)

浏览器支持pre-line


Mar*_*ord 30

这是预期的,您需要将新行(\n)字符转换为HTML换行符

关于在反应中使用它的文章:https://medium.com/@kevinsimper/react-newline-to-break-nl2br-a1c240ba746#.l9sbqp5aw

引用文章:

因为你知道React中的所有东西都是函数,所以你不能真正做到这一点

this.state.text.replace(/(?:\r\n|\r|\n)/g, '<br />')
Run Code Online (Sandbox Code Playgroud)

因为那将返回一个内部有DOM节点的字符串,这也是不允许的,因为它必须只是一个字符串.

然后你可以尝试做这样的事情:

{this.props.section.text.split(“\n”).map(function(item) {
  return (
    {item}
    <br/>
  )
})}    
Run Code Online (Sandbox Code Playgroud)

这是不允许的,因为React是纯函数,两个函数可以彼此相邻.

tldr.解

{this.props.section.text.split(“\n”).map(function(item) {
  return (
    <span>
      {item}
      <br/>
    </span>
  )
})}
Run Code Online (Sandbox Code Playgroud)

现在我们在一个范围内包装每个换行符,这样可以正常工作,因为span的内联显示.现在我们得到了一个有效的nl2br换行解决方案

  • 其他人注意:您还需要为跨度添加键属性,因为它在循环中.所以它会是`.... map(function(item,i){return <span key = {i}> {item} <br/> </ span>}) (4认同)

小智 6

解决方案是white-space在显示您的内容的元素上设置属性textarea

white-space: pre-line;
Run Code Online (Sandbox Code Playgroud)