2016-05-20 1 views
53

要素のinnerHTMLを設定してから要素のdangerouslySetInnerHTMLプロパティを設定することとの「舞台裏」の違いはありますか?簡単にするために、私が適切に衛生的に処理しているとします。React.js:innerHTMLとdangerouslySetInnerHTMLを設定します

例:

var test = React.createClass({ 
    render: function(){ 
    return (
     <div contentEditable='true' dangerouslySetInnerHTML={{ __html: "Hello" }}></div> 
    ); 
    } 
}); 

var test = React.createClass({ 
    componentDidUpdate: function(prevProp, prevState){ 
    this.refs.test.innerHTML = "Hello"; 
    }, 
    render: function(){ 
    return (
     <div contentEditable='true' ref='test'></div> 
    ); 
    } 
}); 

私は上記の例よりも少し複雑な何かをやっているが、全体的なアイデアは、に基づいて、同じ

答えて

97

はい違いがあります!

innerHTMLdangerouslySetInnerHTMLを使用するとすぐに、DOMノードが挿入されたHTMLで更新されます。

の場合、dangerouslySetInnerHTMLを使用すると、そのコンポーネントの内部のHTMLが気にするものではないことがわかります。

があるのでリアクトそれが実際のDOMに対して差分を比較するために行くとき、それはHTMLが別のソースから来ている知っているので、それはまっすぐにバイパスがそのノードの子どもをチェックすることができ、仮想DOMを使用しています。だからパフォーマンスが向上します。

さらに重要なのはです。単にinnerHTMLを使用すると、ReactはDOMノードが変更されたことを知る方法がありません。次回にrender関数が呼び出されると、Reactは、そのDOMノードの正しい状態を手動で入力したコンテンツを上書きします。

componentDidUpdateを使用するソリューションでは、常にコンテンツが同期していると確信していますが、各レンダリングでは動作すると思われます。

+6

私はSVGのインライン化と 'dangerouslySetInnerHTML'の使用の違いを示すために、非科学的な小さなパーフォーマンステストを書いています:https://www.webpackbin.com/bins/-KepHa-AMxQgGxOUnAac - innerHTMLメソッドのチューンはほぼ2倍の速さです(webpackbinのコンソールを参照してください) – Joscha

+0

これは真実で予測が簡単です。 innerHTMLは、何も考慮せずにSVGコードを直接DOMにバインドするネイティブメソッドです。一方、dangerouslySetInnerHTMLは、SVGコードをReact Componentの子として構文解析してから、それらを仮想DOMに配置してからDOMにレンダリングする必要があるというReactのメソッドです。 – Up209d

関連する問題