React で HTML 文字列をレンダリングする

Rana Hasnain Khan 2022年4月18日
React で HTML 文字列をレンダリングする

React で HTML 文字列をレンダリングする方法とエスケープされた HTML 文字列をレンダリングする方法を紹介します。

React で HTML 文字列をレンダリングする

大規模な Web サイトで作業する場合は、HTML コンポーネントを再利用する必要があります。または、HTML で JSON 応答を操作する場合は、React で HTML 文字列をレンダリングする必要があります。

例を挙げて、通常の HTML 文字列をレンダリングしてみましょう。まず、ID が rootdiv を作成します。

# react
<div id="root"></div>

次に、HTML 文字列を root にレンダリングしましょう。

# react
class App extends React.Component {

constructor() {
    super();
    this.state = {
      TextRender: '<h1>This is a heading</h1><p> This is a paragraph.</p>'
    }
  }
  
  render() {
    return (
      <div dangerouslySetInnerHTML={{ __html: this.state.TextRender }} />
    );
  }
}

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

出力:

html 文字列を react でレンダリングする

上記の例では、HTML 文字列をレンダリングしました。ただし、エスケープされた HTML 文字列をレンダリングしようとすると、エラーが発生します。

エスケープされた HTML 文字列をレンダリングしてみましょう。

# react
class App extends React.Component {

constructor() {
    super();
    this.state = {
      TextRender: '&lt;h1&gt;This is a heading&lt;/h1&gt;&lt;p&gt; This is a paragraph.&lt;/p&gt;'
    }
  }
  
  render() {
    return (
      <div dangerouslySetInnerHTML={{ __html: this.state.TextRender }} />
    );
  }
}

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

出力:

エスケープされた html 文字列を react でレンダリングする

上記の例でわかるように、エスケープされた HTML 文字列が原因で、HTML タグが正しくレンダリングされません。

次に、エスケープされた HTML 文字列を通常の HTML 文字列に変換する DecodeHtml 関数を作成します。

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

したがって、コードは次のようになります。

# react
class App extends React.Component {

constructor() {
    super();
    this.state = {
      TextRender: '&lt;h1&gt;This is a heading&lt;/h1&gt;&lt;p&gt; This is a paragraph.&lt;/p&gt;'
    }
  }
  htmlDecode(input){
    var a = document.createElement('div');
    a.innerHTML = input;
    return a.childNodes.length === 0 ? "" : a.childNodes[0].nodeValue;
  }

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

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

出力は次のようになります。

出力:

エスケープされた html 文字列関数を react でレンダリングする

このようにして、エスケープされた HTML 文字列を簡単にレンダリングできます。

Rana Hasnain Khan avatar Rana Hasnain Khan avatar

Rana is a computer science graduate passionate about helping people to build and diagnose scalable web application problems and problems developers face across the full-stack.

LinkedIn

関連記事 - React Render