다음과 같이 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 문서를 참조하세요.