Reactjs конвертировать в HTML

90

У меня проблемы с facebook ReactJS. Всякий раз, когда я делаю ajax и хочу отображать html-данные, ReactJS отображает его как текст. (См. Рисунок ниже)

Изображение 166

Данные отображаются через функцию обратного вызова успеха jquery Ajax.

$.ajax({
   url: url here,
   dataType: "json",
   success: function(data) {
      this.setState({
           action: data.action
      })
   }.bind(this)
});

Изображение 167

Есть ли простой способ конвертировать это в html? Как мне это сделать с помощью ReactJS?

Теги:
react-jsx

4 ответа

187
Лучший ответ

По умолчанию React ускоряет выполнение HTML-кода для предотвращения XSS. Если вы действительно хотите отображать HTML, вы можете использовать свойство dangerouslySetInnerHTML:

<td dangerouslySetInnerHTML={{__html: this.state.actions}} />

Реагирует на этот преднамеренно громоздкий синтаксис, чтобы вы не случайно отображали текст как HTML и вводили ошибки XSS.

  • 4
    Этот синтаксис показан на домашней странице и в учебнике, но я только что понял, что он нигде не документирован, поэтому я просто подал # 413 для исправления.
  • 0
    Правильный! Я решил это уже используя опасно SetInnerHTML, но спасибо, хотя :)
44

Теперь есть более безопасные методы для этого. Документы были обновлены с помощью этих методов.

Другие методы

  • Самый простой. Используйте Unicode, сохраните файл как UTF-8 и установите charset в UTF-8.

    <div>{'First · Second'}</div>

  • Безопаснее. Используйте номер Юникода для объекта внутри строки Javascript.

    <div>{'First \u00b7 Second'}</div>

    или

    <div>{'First ' + String.fromCharCode(183) + ' Second'}</div>

  • Или смешанный массив со строками и элементами JSX.

    <div>{['First ', <span>&middot;</span>, ' Second']}</div>

  • Last Resort. Вставьте необработанный HTML с помощью dangerouslySetInnerHTML.

    <div dangerouslySetInnerHTML={{__html: 'First &middot; Second'}} />

  • 7
    Я подготовил документацию, но о длинной строке HTML, такой как строка из редактора WYSIWYG? Я не вижу, как мы можем использовать 1-й, 2-й или 3-й метод
  • 4
    Я согласен с @eric. Что хорошего в методах 1-3 для уже экранированного контента, хранящегося где-то, например, в БД? Также обратите внимание, что метод 4 - единственный метод - означает, что вы не можете добавлять дочерние узлы.
Показать ещё 2 комментария
3

Я нашел эту скрипту js. это работает как это

function unescapeHTML(html) {
    var escapeEl = document.createElement('textarea');
    escapeEl.innerHTML = html;
    return escapeEl.textContent;
}

<textarea className="form-control redactor"
                          rows="5" cols="9"
                          defaultValue={unescapeHTML(this.props.destination.description)}
                          name='description'></textarea>

jsfiddle ссылка

  • 0
    К сожалению, документ не работает на сервере рендеринга.
0

Я рекомендую использовать Interweave, созданный milesj. Его феноменальная библиотека, которая использует число, если изобретательные методы для синтаксического анализа и безопасного вставки HTML в DOM.

Interweave - это интерактивная библиотека для безопасного отображения HTML, фильтрации атрибуты, текст автоуровня с помощью шаблонов, отображение символов emoji и гораздо больше.

  • Interweave - это надежная библиотека React, которая может:
    • Безопасный визуализатор HTML без использования safeouslySetInnerHTML.
    • Безопасное разделение тегов HTML.
    • Автоматическая защита XSS и инъекций.
    • Очистить атрибуты HTML с помощью фильтров.
    • Интерполировать компоненты с помощью сокетов.
    • URL-адреса Autolink, IP-адреса, электронные письма и хэш-теги.
    • Render Emoji и символы смайликов.
    • И многое другое!
  • 0
    Не могли бы вы привести пример использования, пожалуйста?
  • 1
    @ElAnonimo Я добавил пример использования. Надеюсь, что это делает вещи немного яснее.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню