Korzystanie z Facebooka React
. Na stronie ustawień mam multilinię, w textarea
której użytkownik może wprowadzić tekst wielowierszowy (w moim przypadku adres).
<textarea value={address} />
Kiedy próbuję wyświetlić adres, więc coś w stylu {address}
, nie pokazuje podziałów linii i jest w jednej linii.
<p>{address}</p>
Jakieś pomysły, jak to rozwiązać?
javascript
reactjs
textarea
denizlexic
źródło
źródło
Należy się tego spodziewać, trzeba by przekonwertować znaki nowego wiersza (\ n) na znaki końca wiersza HTML
Artykuł o używaniu go w React : React Newline to break (nl2br)
Aby zacytować artykuł:
źródło
....map(function (item, i) { return <span key={i}>{item}<br/></span> })
<br />
ze świadczenia na ostatniej pozycji:....map(function (item, i, arr) { return <span key={i}>{item}{ arr.length-1 === i ? null : <br/>}</span> })
. Zauważ, że dołączyłem trzeci argument za.map()
[object Object]
Rozwiązaniem jest ustawienie właściwości
white-space
na elemencie wyświetlającym zawartość twojegotextarea
:źródło
Poprzednia propozycja Pete'a z samodzielnym komponentem jest świetnym rozwiązaniem, chociaż brakuje w niej jednej ważnej rzeczy. Listy wymagają kluczy . Poprawiłem to trochę i moja wersja (bez ostrzeżeń konsoli) wygląda tak:
const NewLineToBr = ({ children = '' }) => children.split('\n') .reduce((arr, line, index) => arr.concat( <Fragment key={index}> {line} <br /> </Fragment>, ), [])
Używa fragmentów React 16
źródło
Od React 16 komponent może zwracać tablicę elementów, co oznacza, że możesz stworzyć komponent taki jak ten:
export default function NewLineToBr({children = ""}){ return children.split('\n').reduce(function (arr,line) { return arr.concat( line, <br /> ); },[]); }
którego możesz użyć w ten sposób:
<p> <NewLineToBr>{address}</NewLineToBr> </p>
źródło
Uwielbiam wersję webit. Nie wiedziałem o komponencie Fragment, jest tak przydatny. Nie ma jednak potrzeby stosowania metody redukcji. Mapa wystarczy. Ponadto lista wymaga kluczy w reakcji, ale używanie indeksu z metody iteracyjnej jest złym nawykiem. eslint niszczył to w moim ostrzeżeniu, aż pojawił się błąd zamieszania. Więc wyglądałoby to tak:
const NewLine = ({ children }) => children.split("\n").map(line => ( <Fragment key={uuidv4()}> {line} <br /> </Fragment> ));
źródło