[reactjs] React-소품에서 HTML 태그를 전달하는 방법?

다음과 같이 HTML 태그로 텍스트를 전달할 수 있기를 원합니다.

<MyComponent text="This is <strong>not</strong> working." />

그러나 MyComponent의 렌더링 메서드 내부에서를 인쇄 this.props.text하면 문자 그대로 모든 것을 인쇄합니다.

This is <strong>not</strong> working.

React가 HTML을 구문 분석하고 올바르게 덤프하는 방법이 있습니까?



답변

문자열 및 JSX 요소와 함께 혼합 배열을 사용할 수 있습니다 ( 여기 문서 참조 ).

<MyComponent text={["This is ", <strong>not</strong>,  "working."]} />

작동하는 것을 보여주는 바이올린이 있습니다 : http://jsfiddle.net/7s7dee6L/

또한 마지막 수단으로 항상 원시 HTML을 삽입 할 수 있지만 속성 값을 삭제하지 않으면 XSS (교차 사이트 스크립팅) 공격에 노출 될 수 있으므로주의해야합니다.


답변

사실, 여러 가지 방법이 있습니다.

소품 내부에서 JSX를 사용하고 싶습니다.

{}를 사용하여 JSX가 매개 변수를 구문 분석하도록 할 수 있습니다. 유일한 제한은 모든 JSX 요소와 동일합니다. 하나의 루트 요소 만 반환해야합니다.

myProp={<div><SomeComponent>Some String</div>}

이를위한 가장 읽기 쉬운 방법은 JSX 구성 요소를 반환하는 renderMyProp 함수 (표준 렌더링 함수와 동일)를 만든 다음 myProp = {this.renderMyProp ()}를 호출하는 것입니다.

HTML 만 문자열로 전달하려고합니다.

기본적으로 JSX에서는 문자열 값에서 원시 HTML을 렌더링 할 수 없습니다. 그러나 그렇게하는 방법이 있습니다.

myProp="<div>This is some html</div>"

그런 다음 구성 요소에서 다음과 같이 사용할 수 있습니다.

<div dangerouslySetInnerHTML=myProp={{ __html: this.renderMyProp() }}></div>

이 솔루션은 교차 사이트 스크립팅 위조 공격에 대해 ‘열릴 수 있습니다’. 또한 간단한 HTML 만 렌더링 할 수 있으며 JSX 태그 나 구성 요소 또는 기타 멋진 것을 렌더링 할 수 없습니다.

배열 방법

반응에서 JSX 요소의 배열을 전달할 수 있습니다. 그것의 의미는:

myProp={["This is html", <span>Some other</span>, "and again some other"]}

다음과 같은 이유로이 방법을 권장하지 않습니다.

  • 경고 (누락 된 키)가 생성됩니다.
  • 읽을 수 없습니다
  • 실제로 JSX 방식이 아니라 의도 된 디자인보다 해킹에 가깝습니다.

아이들 방법

완전성을 위해 추가하지만 반응으로 구성 요소 ‘내부’인 모든 하위 항목을 가져올 수도 있습니다.

따라서 다음 코드를 사용하면 :

<SomeComponent>
    <div>Some content</div>
    <div>Some content</div>
</SomeComponent>

그러면 두 div가 SomeComponent에서 this.props.children으로 사용 가능하며 표준 {} 구문으로 렌더링 될 수 있습니다.

이 솔루션은 구성 요소에 전달할 HTML 콘텐츠가 하나만있을 때 완벽합니다 (Popin의 콘텐츠 만 자식으로 사용하는 Popin 구성 요소를 상상해보십시오).

그러나 콘텐츠가 여러 개인 경우 자녀를 사용할 수 없거나 적어도 여기에서 다른 솔루션과 결합해야합니다.


답변

위험하게 사용할 수 있습니다 .SetInnerHTML

html을 일반 문자열로 보내십시오.

<MyComponent text="This is <strong>not</strong> working." />

그리고 다음과 같이 JSX 코드에서 렌더링합니다.

<h2 className="header-title-right wow fadeInRight"
    dangerouslySetInnerHTML={{__html: props.text}} />

사용자가 입력 한 데이터를 렌더링하는 경우주의하십시오. XSS 공격의 피해자가 될 수 있습니다

문서는 다음과 같습니다 :
https://facebook.github.io/react/tips/dangerously-set-inner-html.html


답변

<MyComponent text={<span>This is <strong>not</strong> working.</span>} />

그런 다음 구성 요소에서 다음과 같이 소품 검사를 수행 할 수 있습니다.

import React from 'react';
export default class MyComponent extends React.Component {
  static get propTypes() {
    return {
      text: React.PropTypes.object, // if you always want react components
      text: React.PropTypes.any, // if you want both text or react components
    }
  }
}

소품 유형을 하나만 선택하십시오.


답변

나를 위해 그것은 소품 어린이에 html 태그를 전달하여 작동했습니다.

<MyComponent>This is <strong>not</strong> working.</MyComponent>


var MyComponent = React.createClass({

   render: function() {
    return (
      <div>this.props.children</div>
    );
   },


답변

React v16.02부터 Fragment를 사용할 수 있습니다.

<MyComponent text={<Fragment>This is an <strong>HTML</strong> string.</Fragment>} />

더 많은 정보 : https://reactjs.org/blog/2017/11/28/react-v16.2.0-fragment-support.html


답변

클라이언트 측 반응 애플리케이션에서 일부 html이있는 문자열로 소품을 렌더링하는 몇 가지 방법이 있습니다. 하나는 다른 것보다 안전합니다 …

1-소품을 jsx로 정의 (내 기본 설정)

const someProps = {
  greeting: {<div>Hello<a href="/${name_profile}">${name_profile}</a></div>}
}


const GreetingComopnent = props => (
  <p>{props.someProps.greeting}</p>
)

• 여기서 유일한 요구 사항은이 prop을 생성하는 파일이 React를 종속성으로 포함해야한다는 것입니다 (헬퍼 파일 등에서 prop의 jsx를 생성하는 경우).

2-innerHtml을 위험하게 설정

const someProps = {
  greeting: '<React.Fragment>Hello<a href="https://stackoverflow.com/${name_profile}">${name_profile}</a></React.Fragment>'
}

const GreetingComponent = props => {
  const innerHtml = { __html: props.someProps.greeting }
  return <p dangerouslySetInnerHtml={innerHtml}></p>
}

•이 두 번째 접근 방식은 권장되지 않습니다. 이 컴포넌트에서 입력 값이 prop으로 렌더링되는 입력 필드를 상상해보십시오. 사용자는 입력에 스크립트 태그를 입력 할 수 있으며이 입력을 렌더링하는 구성 요소는 잠재적으로 악성 코드를 실행합니다. 따라서이 접근 방식은 사이트 간 스크립팅 취약점을 유발할 수 있습니다. 자세한 내용 은 공식 React 문서를 참조하세요.