2016-03-28 8 views
21

Mit Facebook React. Auf einer Einstellungsseite habe ich eine mehrzeilige textarea, wo ein Benutzer mehrzeiligen Text (in meinem Fall eine Adresse) eingeben kann.Reagiere Display-Zeilenumbrüche aus dem gespeicherten Textfeld

<textarea value={address} /> 

Wenn ich versuche, die Adresse angezeigt werden, so etwas wie {address}, ist es nicht die Zeilenumbrüche zeigen und ist alles auf einer Linie.

<p>{address}</p> 

Irgendwelche Ideen, um das zu lösen?

Antwort

61

Es gibt keinen Grund, JS zu verwenden. Sie können den Browser einfach sagen, wie Newline zu handhaben die white-space CSS-Eigenschaft mit:

white-space: pre-line; 

pre-line

Sequenzen von Leerzeichen zusammengeschoben werden. Die Zeilen werden unter Newline-Zeichen, unter <br> und nach Bedarf zum Füllen von Zeilenfeldern unterbrochen.

Schauen Sie sich diese Demo:

<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>

browser support for pre-line

+0

Ich denke, das sollte die akzeptierte Antwort sein – bpercevic

+0

beste und einfachste Lösung! – beydogan

+0

Dies funktioniert auf mehrere Arten: Wenn Sie versuchen, einen Zeilenumbruch (
) in JSX durch eine Variable zu rendern, wird das Markup "sicher" gerendert, anstatt den Zeilenumbruch hinzuzufügen. Die Verwendung von Escape-Zeichen mit diesem CSS funktioniert um diesen Sicherheitsmechanismus herum und behebt das angegebene Problem. – bvoyelr

22

Dies ist zu erwarten, um die neue Zeile (\ n) Zeichen HTML-Zeilenumbrüche

Ein Artikel über die Verwendung in konvertieren müssten reagieren: https://medium.com/@kevinsimper/react-newline-to-break-nl2br-a1c240ba746#.l9sbqp5aw

Artikel zitieren:

Weil Sie wissen, dass alles in React ist Funktionen, kann man nicht wirklich das tun

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

Si nce, die einen String mit DOM-Knoten zurückgibt, der auch nicht erlaubt ist, weil er nur eine Zeichenkette sein muss.

Sie können dann versuchen, so etwas wie dies tun:

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

das auch nicht, weil wieder erlaubt ist, Reagieren reine Funktionen ist und zwei Funktionen können nebeneinander sein.

tldr.

Lösung
{this.props.section.text.split(“\n”).map(function(item) { 
    return (
    <span> 
     {item} 
     <br/> 
    </span> 
) 
})} 

Jetzt sind wir jeden Zeilenumbruch in einer Spanne Einwickeln, und das funktioniert gut, weil Spanne Display inline hat. Jetzt haben wir eine funktionierende nl2br Zeilenumbruch-Lösung

+0

Dank Mark, funktioniert wie ein Charme.Hast du eine Chance, die Antwort hier zu lesen? Stackoverflow mag keine externen Links (könnte verschwinden, ist schwerer, eine Liste von Antworten zu sehen, ...) und ich werde Ihre Antwort als richtig markieren. – denislexic

+4

Hinweis für andere: Sie müssen dem Bereich auch ein Schlüsselattribut hinzufügen, da er sich in einer Schleife befindet. also wäre es '.... map (funktion (item, i) {zurück {item}
})' – denislexic

+1

Große Antwort! Das war hilfreich für mich. AUCH, wenn Sie mehrere Zeilenumbrüche haben, können Sie verhindern, dass das überschüssige '
' für das letzte Element gerendert wird:' .... map (function (item, i, arr)) {return { item} {arr.length-1 === i? null:
}
}) '. Beachten Sie, dass ich das 3. Argument für '.map()' – Lasha

2

Die Lösung ist die Eigenschaft white-space auf das Element, um den Inhalt Ihrer textarea Anzeige:

white-space: pre-line; 
Verwandte Themen