Как отобразить в React Native разрыв строки внутри строки, полученной из базы данных?

Я не могу заставить разрывы строк работать внутри строковой переменной с React Native. В моей базе данных есть документы с полем name. Имя — это строка. Имя может содержать определенные разрывы строк. Данные извлекаются в моем компоненте React Native и отображаются в FlatList.

Я пробовал различные комбинации:

  • \n
  • {'\n'}

Ни один из них не работает, разрыв строки отображается как текст

\\ In database document
name: "Some\ntitle"
\\ or
name: "Some{'\n'}title"
\\ In React Native (simplified)
<FlatList
    renderItem = {
        <Text>{item.name}<\Text>
    }
>
<\FlatList>

Это отображается как:
Какое-то\nназвание или Какое-то{'\n'}название

Вместо:
Какой
название

----------- РЕШЕНИЕ -----------

// В базе данных
name: "Некоторые\nназвания"

// В React Native
{элемент.имя.заменить('\n', '\n')}

// Оказывать
Некоторые
заглавие

Возможный дубликат Как вставить разрыв строки в компонент <Text> в React Native?

holydragon 29.03.2019 04:30

Нет, как указано в моем вопросе, {'\n'} в этом случае не работает.

Necrolyte 29.03.2019 04:42

В вопросе отсутствует часть, где вы извлекаете строку из базы данных. Вот где проблема, вероятно, должна быть решена.

Estus Flask 29.03.2019 07:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
3 408
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Используйте {"\n"} вместо \n:

Some{"\n"}text

или

<Text>{`Some\ntext`}</Text>

ваш подход правильный, но как вы это сделаете для динамических данных? как в этом вопросе Some Text исходит из базы данных. Так что будет как item.name. как вы установите item.name в новой строке?

Ankush Rishi 29.03.2019 04:38

Я уже пробовал это, и это не сработало. Компонент Text является объектом renderItem компонента FlatList. name — это строка, хранящаяся в коллекции mongodb. Что сказал Анкуш Риши

Necrolyte 29.03.2019 04:40

Используйте замену — <Text>{item.name.replace(/\\n/g,'\n')}</Text>

Larry Williamson 29.03.2019 07:31

Попробуйте это решение:

   {item.name.split("\n").map((i,key) => {
      return <Text key = {key}>{i}</Text>;
   })}

Попробуйте стилизовать компонент с помощью style = {{ whiteSpace: "pre" }}, чтобы сохранить пробелы.

<Text style = {{ whiteSpace: "pre" }}>{item.name}</Text>

whiteSpace не является свойством React Native

Necrolyte 29.03.2019 04:48

Вы можете попробовать так:

<Text>{`{item.name}`}</Text>

Спасибо, но это непрактично: когда элементы списка являются документами из базы данных, содержимое не жестко запрограммировано, это компонент, разрыв строки должен быть закодирован в документе, а затем отображаться в React Native.

Necrolyte 29.03.2019 05:52

нет, я думал об этом, но обозначения внутри компонента ничего не меняют: <Component>{item.name}</Component> тот же результат, что и <Component>{{item.name}}</Component>

Necrolyte 29.03.2019 06:41

Можете ли вы поделиться своими требованиями или кодом?

Brijesh Shiroya 29.03.2019 06:46

Можете ли вы попробовать это решение: мы протестировали его, и я, кажется, работает

  var str = item.name;
  var result = str.split("\n"); 
  return result.map((i, key) => <Text key = {key}>{i + "\n"}</Text>);

Я только что обновил код, и он работает для меня. пожалуйста, проверьте

Jebin Benny 29.03.2019 08:07

Я полагаю, что это должно работать и для меня (хотя решение estus кажется лучше), но мне не удается интегрировать его с моим FlatList

Necrolyte 29.03.2019 08:13
Ответ принят как подходящий

То, что \n перевод строки появляется буквально означает, что он был экранирован в какой-то момент, на самом деле это \\n.

Можно {item.name.replace('\\n', '\n')}.

Фактическая проблема в том, что он вообще сбежал. Это может повлиять на другие escape-последовательности и должно решаться в том месте, где была экранирована строка.

Ты сделал это! Кто настоящий игрок? Кто настоящий MVP??

Necrolyte 29.03.2019 08:00

Рад, что это помогло. Я бы предложил проверить, почему строка была экранирована при извлечении из БД, могут быть и другие символы, требующие обработки.

Estus Flask 29.03.2019 08:02

Ага, подойдет. Спасибо за ваше время ?

Necrolyte 29.03.2019 08:06

Я ответил на это за 30 минут до этого в комментарии ниже. stackoverflow.com/questions/55410052/…

Larry Williamson 03.04.2019 02:21

@lawrencealan Я не проверяю другие ответы тщательно, поэтому я не знал о комментарии. Я не считаю SO конкуренцией; Я просто дал решение и объяснение. В любом случае, комментарий должен быть частью вашего ответа, потому что это настоящая проблема.

Estus Flask 03.04.2019 11:44

Это явно соревнование, есть система подсчета очков и таблицы лидеров :) — мой ответ ответил на его первоначальный вопрос, но он со временем расширил рамки, на что я расширил свой ответ и ждал его ответа, вместо того, чтобы ответить на мой комментарий, он принял ваш ответ, что то же самое. Все хорошо, просто стоит отметить.

Larry Williamson 03.04.2019 18:14

Используя регулярное выражение, замените все \\n на \n

const t = d.replace(/\\n/g, "\n");

Другие вопросы по теме