ReactJS는 HTML 문자열을 JSX로 변환


212

페이스 북의 ReactJS를 다루는데 어려움을 겪고 있습니다. 아약스를하고 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는 XSS (Cross-Site Scripting) 를 방지하기 위해 HTML을 이스케이프합니다 . HTML을 실제로 렌더링하려면 다음 dangerouslySetInnerHTML속성을 사용할 수 있습니다 .

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

React는 의도적으로 귀찮은 구문을 사용하여 실수로 텍스트를 HTML로 렌더링하지 않고 XSS 버그를 발생시킵니다.


4
이 구문은 홈페이지 및 자습서에 표시됩니다,하지만 난 그냥 단지 제기 그래서 다른 곳에서는 문서화 아니에요 실현 # 413를 해결하려면.
Sophie Alpert

옳은! 나는이 이미 사용 dangerouslySetInnerHTML하지만, 덕분에 해결했습니다 :)하지만
피터 Wateber

외부 API에서 해당 정보를 얻는 경우 npm 패키지 의 sanitize함수를 사용하여 컨텐츠를 안전하게 소독하는 dompurify것이 좋습니다.
Barry Michael Doyle

77

이를 위해 더 안전한 방법이 있습니다. 문서가 업데이트되었습니다 이러한 방법으로.

다른 방법들

  1. 가장 쉬움 -유니 코드를 사용하고 파일을 UTF-8로 저장 한 후 UTF-8로 설정하십시오 charset.

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

  2. 더 안전-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
문서를 준비했지만 WYSIWYG 편집기와 같은 긴 HTML 문자열에 대해 준비 했습니까? 우리가 어떻게 1, 2, 3 번째 방법을 사용할 수 있는지 알 수 없습니다
ericn

4
@eric에 동의합니다. DB와 같이 어딘가에 저장된 이미 이스케이프 된 콘텐츠에 대한 방법 1-3은 어떤 점이 좋습니까? 또한 유일한 방법 인 방법 4는 하위 노드를 추가 할 수 없음을 의미합니다.
dvdplm

14
예. 하드 코딩 된 "동적"컨텐츠가 포함 된 이러한 예제는 의미가 없습니다.
regularmike

이것은 내 innerHTML입니다- "관리자 표시 \ u003cb \ u003e1 \ u0026nbsp;-\ u0026nbsp; 10 \ u003c / b \ u003e of \ u003cb \ u003e13 \ u003c / b \ u003e의 총계"입니다. <b> 13 </ b>의 관리자 <b> 1 & nbsp;-& nbsp; 10 </ b> " dangerouslySetInnerHTML을 사용하려고하면 모든 것이 깨집니다.
vipin8169

36

내가 사용하는 것이 좋습니다 섞어 짜다가 만든 milesj . 독창적 인 기술을 사용하여 HTML을 구문 분석하고 DOM에 안전하게 삽입하는 놀라운 라이브러리입니다.

Interweave는 HTML을 안전하게 렌더링하고 속성을 필터링하며 매 처로 텍스트 자동 줄 바꿈, 이모티콘 문자 렌더링 등을 수행하는 반응 라이브러리입니다.

  • Interweave는 다음을 수행 할 수있는 강력한 React 라이브러리입니다.
    • dangerouslySetInnerHTML을 사용하지 않고 HTML을 안전하게 렌더링합니다.
    • 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

사용 예를 제공해 주시겠습니까?
El Anonimo

1
@ElAnonimo 사용 예를 추가했습니다. 그것이 좀 더 명확 해지기를 바랍니다.
Arman Nisch

1
백만 감사합니다, interweave는 내가 필요한 바로 그 것입니다. 건배.
니콜라스 해밀턴

1
이에 대한 설명서는 도움이되지 않습니다. 또한 몇 줄의 html로 시험해 보았고 페이지에 오류 메시지가 가득했습니다. 누군가 문서화에 대한 예나 자료가 있습니까?
Tarun Kolla


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


불행히도 문서는 서버 렌더링에서 작동하지 않습니다.
Laurent Van Winckel

만약 당신이 import JSDOM from 'jsdom'; global.window = new JSDOM('', { url: 'http://localhost' }); global.document = global.window.document;idk goodluck를 할 경우
코티 엠브리

2

html-react-parser에서 Parser ()를 사용할 수도 있습니다. 나는 같은 것을 사용했다. 링크가 공유되었습니다.


2

react-html-parser라는 npm 패키지를 사용하기 시작합니다.


1

여전히 실험중인 사람들을 위해 npm install react-html-parser

설치했을 때 매주 123628 번 다운로드되었습니다.

import ReactHtmlParser from 'react-html-parser'

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

0

React에서 원시 HTML을 렌더링하려면 다음을 사용할 수 있습니다

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

예-렌더링

시험 은 좋은 날이다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.