Oto, czego próbowałem i jak idzie źle.
To działa:
<div dangerouslySetInnerHTML={{ __html: "<h1>Hi there!</h1>" }} />
To nie:
<div dangerouslySetInnerHTML={{ __html: this.props.match.description }} />
Właściwość description jest zwykłym ciągiem zawartości HTML. Jednak z jakiegoś powodu jest renderowany jako ciąg znaków, a nie jako HTML.
Jakieś sugestie?
javascript
html
reactjs
jsx
Sergio Tapia
źródło
źródło
dangerouslySetInnerHTML
zamiast tego używajFragment
odreaktyw v16. Sprawdź następną odpowiedź @ brad-adamsCzy
this.props.match.description
jest ciągiem czy przedmiotem? Jeśli jest to ciąg znaków, powinien zostać przekonwertowany na HTML. Przykład:Wynik: http://codepen.io/ilanus/pen/QKgoLA?editors=1011
Jeśli jednak
description: <h1 style="color:red;">something</h1>
bez cudzysłowów''
otrzymasz:Jeśli jest to ciąg i nie widzisz żadnych znaczników HTML, jedyny problem, jaki widzę, to nieprawidłowe znaczniki.
AKTUALIZACJA
Jeśli masz do czynienia z HTMLEntitles. Musisz je zdekodować przed wysłaniem do
dangerouslySetInnerHTML
, dlatego nazwali to niebezpiecznie :)Przykład pracy:
źródło
this.props.match.description
jest łańcuchem, a nie obiektem. Co masz na myśli mówiąc o niewłaściwym oznaczeniu? Masz na myśli niezamknięte tagi? React powinien po prostu sprawić, że nie?<p><strong>Our Opportunity:</strong></p>
Używam parsera „react-html-parser”
Źródło na npmjs.com
Podnoszę komentarz @ okram, aby uzyskać lepszą widoczność:
źródło
Converts HTML strings directly into React components avoiding the need to use dangerouslySetInnerHTML
na githubie : z 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.
Jeśli masz kontrolę nad tym, skąd pochodzi ciąg znaków zawierający html (tj. Gdzieś w Twojej aplikacji), możesz skorzystać z nowego
<Fragment>
interfejsu API, wykonując coś takiego:źródło
Fragment
API zawsze było to dla mnie uciążliwe, co wymagało dodatkowychspan
okładek, które czasami zepsuły układy flex. Kiedy natknąłem się na to pytanie, szukając możliwego rozwiązania, pomyślałem, że podzielę się tym , jak sobie poradziłem.Some text <strong>wrapped with strong</strong>
zawiera znacznik htmlstrong
.Używasz po prostu niebezpiecznieSetInnerHTML metody React
<div dangerouslySetInnerHTML={{ __html: htmlString }} />
Możesz też wdrożyć więcej w ten prosty sposób: Renderuj kod HTML w postaci surowej w aplikacji React
źródło
niebezpiecznieSetInnerHTML
niebezpiecznieSetInnerHTML jest zamiennikiem Reacta dla używania innerHTML w DOM przeglądarki. Ogólnie rzecz biorąc, ustawienie kodu HTML z kodu jest ryzykowne, ponieważ łatwo jest nieumyślnie narazić użytkowników na atak typu cross-site scripting (XSS). Możesz więc ustawić HTML bezpośrednio z Reacta, ale musisz niebezpiecznie wpisać SetInnerHTML i przekazać obiekt z kluczem __html, aby przypomnieć sobie, że jest niebezpieczny. Na przykład:
źródło
Używam innerHTML razem z ref to span:
źródło
componentDidMount() { this.message.current.innerHTML = this.state.selectedMessage.body; }
body to dla mnie uciekający kod HTML.W moim przypadku użyłem reakcji-render-html
Najpierw zainstaluj pakiet przez
npm i --save react-render-html
następnie,
źródło
Nie mogłem się zabrać
npm build
do pracyreact-html-parser
. Jednak w moim przypadku udało mi się z powodzeniem skorzystać z https://reactjs.org/docs/fragments.html . Miałem wymóg, aby pokazać kilka znaków Unicode HTML, ale nie powinny one być bezpośrednio osadzane w JSX. W JSX musiało zostać pobrane ze stanu komponentu. Fragment kodu komponentu znajduje się poniżej:źródło
używam https://www.npmjs.com/package/html-to-react
źródło
Jeśli masz kontrolę do {this.props.match.description} i jeśli używasz JSX. Zalecałbym, aby nie używać „niebezpiecznieSetInnerHTML”.
źródło