Aqui está o que eu tentei e como dá errado.
Isso funciona:
<div dangerouslySetInnerHTML={{ __html: "<h1>Hi there!</h1>" }} />
Isto não:
<div dangerouslySetInnerHTML={{ __html: this.props.match.description }} />
A propriedade description é apenas uma sequência normal de conteúdo HTML. No entanto, é renderizado como uma sequência, não como HTML por algum motivo.
Alguma sugestão?
javascript
html
reactjs
jsx
Sergio Tapia
fonte
fonte
dangerouslySetInnerHTML
vez disso, use aFragment
partir do react v16. Verifique a próxima resposta por @ brad-adamsSerá que
this.props.match.description
é uma string ou um objeto? Se for uma string, ela deve ser convertida para HTML muito bem. Exemplo:Resultado: http://codepen.io/ilanus/pen/QKgoLA?editors=1011
No entanto, se
description: <h1 style="color:red;">something</h1>
sem as aspas''
você receberá:Se é uma string e você não vê nenhuma marcação HTML, o único problema que vejo é a marcação errada.
ATUALIZAR
Se você está lidando com HTMLEntitles. Você precisa decodificá-los antes de enviá-los para
dangerouslySetInnerHTML
isso é que eles chamam perigosamente :)Exemplo de trabalho:
fonte
this.props.match.description
é uma string, não um objeto. O que você quer dizer com marcação errada? Você quer dizer tags não fechadas? Reagir deve torná-lo não?<p><strong>Our Opportunity:</strong></p>
Eu uso 'react-html-parser'
Fonte no npmjs.com
Levantando o comentário do @ okram para obter mais visibilidade:
fonte
Converts HTML strings directly into React components avoiding the need to use dangerouslySetInnerHTML
from npmjs.comA utility for converting HTML strings into React components. Avoids the use of dangerouslySetInnerHTML and converts standard HTML elements, attributes and inline styles into their React equivalents.
Se você tem controle sobre a origem da string que contém html (ou seja, em algum lugar do seu aplicativo), pode se beneficiar da nova
<Fragment>
API, fazendo algo como:fonte
Fragment
API, era sempre um problema para mim, que exigiaspan
envoltórios adicionais que às vezes mexiam com layouts flexíveis. Quando me deparei com essa pergunta, procurando uma solução possível, pensei em compartilhar como me contornava.Some text <strong>wrapped with strong</strong>
contém uma tag htmlstrong
.Você apenas usa o método DangerouslySetInnerHTML de React
<div dangerouslySetInnerHTML={{ __html: htmlString }} />
Ou você pode implementar mais com essa maneira fácil: renderize o HTML bruto no aplicativo React
fonte
dangerouslySetInnerHTML
dangerouslySetInnerHTML é o substituto do React para o uso do innerHTML no DOM do navegador. Em geral, definir HTML a partir do código é arriscado, pois é fácil expor inadvertidamente seus usuários a um ataque de XSS (cross-site scripting). Portanto, você pode definir o HTML diretamente do React, mas precisa digitar perigosamente o SetInnerHTML e passar um objeto com uma chave __html, para se lembrar de que é perigoso. Por exemplo:
fonte
Eu uso innerHTML juntos uma ref para abranger:
fonte
componentDidMount() { this.message.current.innerHTML = this.state.selectedMessage.body; }
body é o html de escape para mim.No meu caso, usei react-render-html
Primeiro instale o pacote
npm i --save react-render-html
então,
fonte
Não consegui
npm build
trabalharreact-html-parser
. No entanto, no meu caso, consegui usar o https://reactjs.org/docs/fragments.html . Eu tinha um requisito para mostrar alguns caracteres unicode html, mas eles não deveriam ser incorporados diretamente no JSX. Dentro do JSX, ele teve que ser escolhido no estado do Componente. O snippet de código do componente é fornecido abaixo:fonte
eu uso https://www.npmjs.com/package/html-to-react
fonte
Se você tiver controle para {this.props.match.description} e se estiver usando JSX. Eu recomendaria não usar "dangerouslySetInnerHTML".
fonte