2016-01-08 10 views
5

È possibile disinfettare la stringa senza utilizzare pericolosamenteSetInnerHTML in React JSX. Il requisito è controllare la lunghezza della stringa html disinfettata e quindi includere solo il componente. Qualcosa comeSanitizza stringa HTML senza utilizzare pericolosamenteSetInnerHTML per il controllo della lunghezza

var SomeComponent = React.createClass({ 
     render:function(){ 
     return (
      {this.props.htmlString.length > 0 ? <Child htmlString={this.props.htmlString} : null} 
     ) 
     } 
    }) 

var Child = React.createClass({ 
    render:function(){ 
     return (
     <p dangerouslySetInnerHTML={{__html: this.props.htmlString}}></p> 
    ) 
    } 
}) 

Tutto funziona correttamente ma non riesce quando this.props.htmlString='&nbsp'. In questo caso, la lunghezza> 0 e il componente vengono inclusi. Quindi voglio controllare la lunghezza di innerHTML prima dell'inserimento dell'elemento stesso.

Una possibile soluzione mi sono imbattuto è qualcosa di simile:

var html = "&nbsp;"; 
var div = document.createElement('div'); 
div.innerHTML = html; //check the length of innerHTML now 

Ma Cerco un pulitore un altro tipo di reagire.

+0

Non credo ci sia un modo di reagire ma vediamo cosa dice la gente .. sarei interessato per sapere perché stai facendo anche questo strano codice;) –

+0

@DominicTobias Per qualche ragione sto ricevendo editor html da rest API. Impossibile risolverlo a causa di alcuni backlog –

+0

La soluzione che hai fornito è corretta. AFAIK non ci sono altre API di browser per la risoluzione di HTML in testo semplice rispetto al riempimento di un elemento DOM con esso. – hon2a

risposta

2

Come già suggerito, la risoluzione di una stringa HTML in testo semplice viene eseguita facilmente inserendo un elemento DOM.

function htmlToText(htmlString) { 
    const el = document.createElement('div'); 
    el.innerHTML = htmlString; 
    return el.textContent; 
} 

Questo trasforma il vostro codice in chiaro:

htmlToText('&nbsp;') === '\xa0' // non-breaking space character 

controllando che il testo risolto non è vuota è quindi banale:

htmlToText('&nbsp;').trim().length === 0 
htmlToText('&nbsp; FOO ').trim().length === 3 

Non c'è "Reagire modo" per fare questo, perché se stai impostando l'HTML direttamente dalla stringa, viene risolto solo quando viene effettivamente inserito nel DOM. Naturalmente è possibile utilizzare questo strumento per creare un HOC:

const nonEmptyHtml = Component => props => { 
    const html = props.dangerouslySetInnerHTML; 
    if (html && !htmlToText(html).trim().length) { 
    return null; 
    } 
    return <Component {...props} />; 
}; 

Usage:

const NonEmptyParagraph = nonEmptyHtml('p'); 
ReactDOM.render(<NonEmptyParagraph dangerouslySetInnerHTML={htmlString} />);