JSX (React Variable Statements)로 HTML 삽입


203

JSX에서 React Variables가있는 HTML을 삽입 해야하는 React로 무언가를 만들고 있습니다. 다음과 같은 변수를 갖는 방법이 있습니까?

var thisIsMyCopy = '<p>copy copy copy <strong>strong copy</strong></p>';

이렇게 반응에 삽입하고 작동합니까?

render: function() {
    return (
        <div className="content">{thisIsMyCopy}</div>
    );
}

예상대로 HTML을 삽입 했습니까? 나는이 인라인을 수행 할 수있는 반응 함수 또는 이것이 작동 할 수있는 것들을 파싱하는 방법에 대해 아무것도 보거나 듣지 못했습니다.

답변:


294

당신이 사용할 수있는 dangerouslySetInnerHTML를 , 예를 들어,

render: function() {
    return (
        <div className="content" dangerouslySetInnerHTML={{__html: thisIsMyCopy}}></div>
    );
}

2
무언가를 추가 해야하는 경우 어떻게 작동 <head>합니까?
Danielle Madeley

componentDidMount의 일반적인 DOM 메소드가 작동해야하지만 이전에는 수행하지 않았습니다.
Douglas Douglas

@DanielleMadeley <head>에 조건부 IE 주석을 삽입하려고합니까? 그렇다면, 여기에 설명 된 트릭을 사용하여 성공했습니다 : nemisj.com/conditional-ie-comments-in-react-js
Cam Jackson

3
해시가 아닌 dangerouslySetInnerHTML에 메소드를 전달하십시오. 문서에 따르면 해시를 전달하는 것은 위험합니다. 참조 : facebook.github.io/react/tips/dangerously-set-inner-html.html
criticerz

1
div를 삽입하지 않고 방법이 있습니까?
친구

101

dangerouslySetInnerHTML당신이 주입 된 HTML 문자열이 무엇인지 모르는 경우 위험 할 수 있습니다. 스크립트 태그를 통해 악의적 인 클라이언트 측 코드를 삽입 할 수 있기 때문입니다.

렌더링하는 HTML이 XSS (Cross-Site Scripting) 안전하다는 것을 100 % 확신 할 수 없다면 DOMPurify 와 같은 유틸리티를 통해 HTML 문자열을 삭제하는 것이 좋습니다 .

예:

import DOMPurify from 'dompurify'

const thisIsMyCopy = '<p>copy copy copy <strong>strong copy</strong></p>';


render: function() {
    return (
        <div className="content" dangerouslySetInnerHTML={{__html: DOMPurify.sanitize(thisIsMyCopy)}}></div>
    );
}

@vsync 아니에요 :)
Artem Bernatskyi

1
html 태그뿐만 아니라 재료 ui Alert 태그와 같은 라이브러리의 태그를 렌더링 할 수 있습니까? 코드는 다음과 같습니다import DOMPurify from 'dompurify' const thisIsMyCopy = '<Alert severity="warning">copy copy copy <strong>strong copy</strong></Alert >'; render: function() { return ( <div className="content" dangerouslySetInnerHTML={{__html: DOMPurify.sanitize(thisIsMyCopy)}}></div> ); }
sasha romanov

@sasharomanov,이 시나리오에 대한 해결책을 얻었습니까?
Nimish goel

51

risklySetInnerHTML 은 태그 내부에 설정되어 있기 때문에 많은 단점이 있습니다.

이 목적으로 npm에서 찾은 것처럼 반응 래퍼를 사용하는 것이 좋습니다. html-react-parser 도 같은 작업을 수행합니다.

import Parser from 'html-react-parser';
var thisIsMyCopy = '<p>copy copy copy <strong>strong copy</strong></p>';


render: function() {
    return (
        <div className="content">{Parser(thisIsMyCopy)}</div>
    );
}

아주 간단한 :)


3
"dangerouslySetInnerHTML은 태그 내부에 설정되어 있기 때문에 많은 단점이 있습니다." 이에 대해 더 자세히 설명해 주시겠습니까? 근본적인 차이는 사이가 무엇인지 생각하려고 innerHTML을 html로 --반응 파서와 sanatized
dchhetri

html-react-parser는 입력을 소독하지 않는 것 같습니다
Little Brain

28

를 사용하여 ''문자열로 만듭니다. 쉼표를 거꾸로 사용하지 않으면 정상적으로 작동합니다.


14
처음에 나는 웃으면 서 내 마음을 날릴 수있는 기회를 주었다
M at

1
지금까지 가장 간단한 대답은 특히 HTML이 사용자에 의해 작성되고 사용자 입력에 따라 동적 인 경우입니다. 문자 그대로 var myHtml = <p> 일부 텍스트 </ p>; 그리고 그것은 작동
pat8719

1
이것이 가장 좋은 대답입니다. 고마워, 친구!
Andy Mercer

3

린터 오류를 피하기 위해 다음과 같이 사용합니다.

  render() {
    const props = {
      dangerouslySetInnerHTML: { __html: '<br/>' },
    };
    return (
        <div {...props}></div>
    );
  }

3
import { Fragment } from 'react' // react version > 16.0

var thisIsMyCopy = (
  <Fragment>
    <p>copy copy copy&nbsp;
    <strong>strong copy</strong>
    </p>
  </Fragment>
)

''을 사용하면 값이 문자열로 설정되고 React는 그것이 HTML 요소인지 알 방법이 없습니다. React에 HTML 요소임을 알리기 위해 다음을 수행 할 수 있습니다.

  1. 제거하면 ''작동합니다.
  2. <Fragment>HTML 요소를 반환하는 데 사용 합니다.

2
이것은 질문에 대답하지 않습니다. 내용 thisIsMyCopy은 자체가 JSX이며 HTML 문자열이 아닙니다. 따라서 문자 그대로 JSX를 JSX에 붙여 넣습니다.
Antares42

Preact에서도 조각을 찾을 수 있지만 버전 X 이상에서만 찾을 수 있습니다.
Nasia Makrygianni

-3

다른 사람이 여전히 여기에 온다면 ES6을 사용하면 다음과 같이 html 변수를 만들 수 있습니다.

render(){
    var thisIsMyCopy = (
        <p>copy copy copy <strong>strong copy</strong></p>
    );
    return(
        <div>
            {thisIsMyCopy}
        </div>
    )
}

2
문자열 안에 변수를 원한다면 각각의 {}문자열과 전체 문자열을 약간의 마크 업 으로 감싸 야합니다.(<span>{telephoneNumber} <br /> {email}</span>)
DanV

2
이것은 질문에서 묻는 것과 다릅니다. 문제 <p>copy copy copy <strong>strong copy</strong></p>는 문자열입니다. JSX로 가지고 있습니다.
YPCrumble

4
ES6는 아니지만 JSX
gztomas

-3

이 HTML을 ReactDOM에 다음과 같이 포함시킬 수도 있습니다.

var thisIsMyCopy = (<p>copy copy copy <strong>strong copy</strong></p>);

ReactDOM.render(<div className="content">{thisIsMyCopy}</div>, document.getElementById('app'));

다음은 React 문서의 두 링크link2 입니다.

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