Reactjs конвертувати HTML-рядок у jsx


212

У мене виникають проблеми з ReactJS у Facebook. Щоразу, коли я роблю ajax і хочу відобразити HTML-дані, ReactJS відображає їх як текст. (Дивіться рисунок нижче)

Рядок візуалізації ReactJS

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

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

введіть тут опис зображення

Чи є якийсь простий спосіб перетворити це в HTML? Як мені це зробити за допомогою ReactJS?

Відповіді:


406

За замовчуванням React уникає HTML, щоб запобігти XSS (міжсайтовий сценарій) . Якщо ви дійсно хочете візуалізувати HTML, ви можете використовувати dangerouslySetInnerHTMLвластивість:

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

Реакція змушує цей навмисно громіздкий синтаксис, щоб ви випадково не надавали текст як HTML і не вводили помилки XSS.


4
Цей синтаксис відображається на домашній сторінці та в підручнику, але я лише зрозумів, що він ніде не задокументований, тому я просто подав номер 413 для виправлення.
Софі Алперт

Правильно! Я вже вирішив це, використовуючи небезпечноSetInnerHTML, але все-таки дякую :)
Пітер Уейтбер

Варто захистити вміст, щоб очистити вміст за допомогою sanitizeфункції з dompurifyпакету npm, якщо ви отримуєте цю інформацію із зовнішнього API.
Баррі Майкл Дойл

77

Зараз існують безпечніші методи для досягнення цього. У документах були оновлені з допомогою цих методів.

Інші методи

  1. Найпростіше - використовуйте Unicode, збережіть файл як UTF-8 і встановіть значення charsetUTF-8.

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

  2. Безпечніше - використовуйте номер Unicode для сутності всередині рядка Javascript.

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

    або

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

  3. Або змішаний масив з рядками та елементами JSX.

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

  4. Останній курорт - Вставте сирий HTML за допомогою dangerouslySetInnerHTML.

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


15
Я готовий до документації, але про довгий HTML-рядок, такий як редактор WYSIWYG? Я не бачу, як ми можемо використовувати метод 1-го, 2-го чи 3-го
ericn

4
Я згоден з @eric. Які корисні способи 1-3 для вже уникнутого вмісту, що зберігається десь, наприклад, БД? Також зауважте, що метод 4 - єдиний метод - означає, що ви не можете додавати дочірні вузли.
dvdplm

14
Так. Ці приклади із жорстко "динамічним" вмістом не мають великого сенсу.
регулярниймійк

Це мій внутрішній HTML - "Відображення адміністраторів \ u003cb \ u003e1 \ u0026nbsp; - \ u0026nbsp; 10 \ u003c / b \ u003e з \ u003cb \ u003e13 \ u003c / b \ u003e в цілому", а це те, що відображається, - "Показ. admins <b> 1 & nbsp; - & nbsp; 10 </b> з <b> 13 </b> загалом ". Коли я намагаюся небезпечно використовуватиSetInnerHTML, evrything ламається.
vipin8169

36

Я рекомендую використовувати переплетення, створене milesj . Це феноменальна бібліотека, яка використовує число, якщо геніальні методи аналізують та безпечно вставляють HTML у DOM.

Переплетення - це бібліотека реагувань для безпечного візуалізації HTML, атрибутів фільтру, автоматичного загортання тексту з відповідниками, візуалізації символів смайлів та багато іншого.

  • Переплетення - це надійна бібліотека React, яка може:
    • Безпечно візуалізуйте HTML, не використовуючи небезпечноSetInnerHTML.
    • Безпечно зніміть теги HTML.
    • Автоматичний XSS та захист від ін'єкцій.
    • Очистіть атрибути HTML за допомогою фільтрів.
    • Інтерполюйте компоненти, використовуючи математики.
    • Автопосилання, URL-адреси, IP-адреси, електронні листи та хештеги.
    • Візуалізуйте символи смайлів та смайликів.
    • І набагато більше!

Приклад використання:

import React from 'react';
import { Markup } from 'interweave';

const articleContent = "<p><b>Lorem ipsum dolor laboriosam.</b> </p><p>Facere debitis impedit doloremque eveniet eligendi reiciendis <u>ratione obcaecati repellendus</u> culpa? Blanditiis enim cum tenetur non rem, atque, earum quis, reprehenderit accusantium iure quas beatae.</p><p>Lorem ipsum dolor sit amet <a href='#testLink'>this is a link, click me</a> Sunt ducimus corrupti? Eveniet velit numquam deleniti, delectus  <ol><li>reiciendis ratione obcaecati</li><li>repellendus culpa? Blanditiis enim</li><li>cum tenetur non rem, atque, earum quis,</li></ol>reprehenderit accusantium iure quas beatae.</p>"

<Markup content={articleContent} /> // this will take the articleContent string and convert it to HTML markup. See: https://milesj.gitbook.io/interweave


//to install package using npm, execute the command
npm install interweave

Чи можете ви надати приклад використання?
Ель Анонімо

1
@ElAnonimo Я додав приклад використання. Сподіваюсь, що робить речі дещо зрозумілішими.
Арман Ніш

1
Дякую мільйон, переплетення - це саме те, що мені було потрібно. Ура.
Ніколас Гамільтон,

1
Документація для цього не корисна. Також я спробував декілька рядків html, і у мене була сторінка, повна повідомлень про помилки. У когось є приклади чи будь-які ресурси з документацією?
Тарун Колла


6

я знайшов цю загадку 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 посилання


На жаль, документ не працює на серверній візуалізації.
Лоран Ван Вінкел

Можливо, якщо ви зробите import JSDOM from 'jsdom'; global.window = new JSDOM('', { url: 'http://localhost' }); global.document = global.window.document;idk goodluck
Coty Embry


2

я починаю використовувати пакет npm під назвою react-html-аналізатор


1

Для тих, хто все ще експериментує, npm install reakct-html-аналізатор

Коли я встановив його, було 123628 завантажень за тиждень.

import ReactHtmlParser from 'react-html-parser'

<div>{ReactHtmlParser(htmlString)}</div>

0

Ви можете скористатися наступним, якщо ви хочете відобразити необроблений HTML в React

<div dangerouslySetInnerHTML={{__html: `html-raw-goes-here`}} />

Приклад - Візуалізація

Тест - хороший день

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.