2016-09-28 16 views
26

Oto, co próbowałem i jak idzie nie tak.Renderuj ciąg HTML jako prawdziwy HTML w komponencie React

to działa:

<div dangerouslySetInnerHTML={{ __html: "<h1>Hi there!</h1>" }} /> 

To nie:

<div dangerouslySetInnerHTML={{ __html: this.props.match.description }} /> 

Opis nieruchomość jest po prostu normalny ciąg zawartości HTML. Jednak z jakiegoś powodu jest renderowany jako ciąg znaków, a nie jako HTML.

enter image description here

Wszelkie sugestie?

+0

Nie widać, aby zamknąć ofertę w pierwszy przykład. – Li357

+0

OK, ale pytanie wciąż jest aktualne. –

+0

Nie mówiąc, pytanie jest nieprawidłowe, tylko główka w górę :) – Li357

Odpowiedz

11

Sprawdź, czy tekst, który próbujesz dołączyć do węzła ma uciekł tak :

var prop = { 
    match: { 
     description: '&lt;h1&gt;Hi there!&lt;/h1&gt;' 
    } 
}; 

Zamiast tego:

var prop = { 
    match: { 
     description: '<h1>Hi there!</h1>' 
    } 
}; 

jeśli I s escaped powinieneś przekonwertować go ze swojej strony serwera.

The node is text because is escaped

Węzeł jest tekst, bo jest uciekł

The node is a dom node because isn't escaped

węzeł jest węzłem dom, ponieważ nie jest uciekł

+1

To był problem. Ciąg znaków opisu zawierał kod HTML. Wycofałem go i teraz działa dobrze. –

12

Czy this.props.match.description Czy ciąg znaków lub obiekt? Jeśli jest to ciąg znaków, powinien zostać przekonwertowany do formatu HTML. Przykład:

class App extends React.Component { 

constructor() { 
    super(); 
    this.state = { 
     description: '<h1 style="color:red;">something</h1>' 
    } 
    } 

    render() { 
    return (
     <div dangerouslySetInnerHTML={{ __html: this.state.description }} /> 
    ); 
    } 
} 

ReactDOM.render(<App />, document.getElementById('root')); 

Wynik: http://codepen.io/ilanus/pen/QKgoLA?editors=1011

Jednak jeśli description: <h1 style="color:red;">something</h1> bez cudzysłowów '' masz zamiar dostać:

​Object { 
$$typeof: [object Symbol] {}, 
    _owner: null, 
    key: null, 
    props: Object { 
    children: "something", 
    style: "color:red;" 
    }, 
    ref: null, 
    type: "h1" 
} 

jeśli jest to ciąg i nie widać żadnych znaczników HTML jedyny problem, jaki widzę, to niewłaściwy znacznik.

UPDATE

Jeśli masz do czynienia z HTMLEntitles. Trzeba ich dekodowania przed ich wysłaniem do dangerouslySetInnerHTML dlatego nazwali go niebezpiecznie :)

przykład robocza:

class App extends React.Component { 

    constructor() { 
    super(); 
    this.state = { 
     description: '&lt;p&gt;&lt;strong&gt;Our Opportunity:&lt;/strong&gt;&lt;/p&gt;' 
    } 
    } 

    htmlDecode(input){ 
    var e = document.createElement('div'); 
    e.innerHTML = input; 
    return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue; 
    } 

    render() { 
    return (
     <div dangerouslySetInnerHTML={{ __html: this.htmlDecode(this.state.description) }} /> 
    ); 
    } 
} 

ReactDOM.render(<App />, document.getElementById('root')); 
+0

'this.props.match.description' jest ciągiem, a nie obiektem. Co masz na myśli mówiąc o niewłaściwym znaczniku? Masz na myśli niezamknięte tagi? React powinien po prostu sprawić, że nie? –

+0

Czy możesz wkleić tutaj console.log (this.props.match.opis); –

+0

Jeden przykład: '<p> <silny> Szansa: </strong > </p >' –

Powiązane problemy