2014-05-12 8 views
94

Sto costruendo qualcosa con React dove devo inserire HTML con React Variables in JSX. C'è un modo per avere una variabile in questo modo:Inserisci HTML con React Variable Statements (JSX)

var thisIsMyCopy = '<p>copy copy copy <strong>strong copy</strong></p>'; 

e ad inserirla nel reagire in questo modo, e farli funzionare?

render: function() { 
    return (
     <div className="content">{thisIsMyCopy}</div> 
    ); 
} 

e inserire l'HTML come previsto? Non ho visto né sentito nulla di una funzione di reazione che potrebbe fare ciò in linea o un metodo di analisi delle cose che consentirebbe a questo di funzionare.

risposta

152

È possibile utilizzare dangerouslySetInnerHTML, ad es.

render: function() { 
    return (
     <div className="content" dangerouslySetInnerHTML={{__html: thisIsMyCopy}}></div> 
    ); 
} 
+1

Come funziona se avete bisogno di aggiungere qualcosa a '' ? –

+0

I normali metodi DOM in componentDidMount dovrebbero funzionare, ma non l'ho mai fatto prima. – Douglas

+0

@DanielleMadeley Stai cercando di inserire commenti IE condizionali in ? Se è così, ho avuto successo usando il trucco descritto qui: https://nemisj.com/conditional-ie-comments-in-react-js/ –

36

noti che dangerouslySetInnerHTML può essere pericoloso se non si sa che cosa è nella stringa HTML si sta iniettando. Questo perché il codice lato client dannoso può essere iniettato tramite tag di script.

E 'probabilmente una buona idea per disinfettare la stringa HTML tramite un'utilità come DOMPurify se non si è sicuri al 100% il codice HTML che si sta rendering è XSS (cross-site scripting) sicura.

Esempio:

import DOMPurify from 'dompurify' 

var thisIsMyCopy = '<p>copy copy copy <strong>strong copy</strong></p>'; 


render: function() { 
    return (
     <div className="content" dangerouslySetInnerHTML={{__html: DOMPurify.sanitize(thisIsMyCopy)}}></div> 
    ); 
} 
+0

Grazie! Questo è importante. – Spacemoose

10

dangerouslySetInnerHTML ha molti svantaggi, perché situato all'interno del tag.

Ti suggerisco di utilizzare un involucro di reazione come ho trovato uno qui su npm per questo scopo. html-react-parser fa lo stesso lavoro.

import Parser from 'html-react-parser'; 
var thisIsMyCopy = '<p>copy copy copy <strong>strong copy</strong></p>'; 


render: function() { 
    return (
     <div className="content">{Parser(thisIsMyCopy)}</div> 
    ); 
} 

Molto semplice :)

4

Se qualcun altro atterra ancora qui. Con ES6 è possibile creare il variabile html in questo modo:

render(){ 
    var thisIsMyCopy = (
     <p>copy copy copy <strong>strong copy</strong></p> 
    ); 
    return(
     <div> 
      {thisIsMyCopy} 
     </div> 
    ) 
} 
+0

e se vuoi delle variabili all'interno della tua stringa, dovrai avvolgere ciascuna in "{}" e l'intera stringa in qualche markup come "( {telephoneNumber}
{email}
)' – DanV

+0

Questo è diverso da quello che è chiesto nella domanda. Nella domanda '

copia copia copia copia efficace

' è una stringa. Lo hai come JSX. – YPCrumble

+0

Questo non è ES6, ma JSX – gztomas

0
renderTitle =() => { 
    const title = 'This is my title'; 
    return <h1>{title}</h1> 
} 

render(){ 
    return (
    <div> 
     {this.renderTitle()} 
    </div> 
    ) 
}