2017-04-18 4 views
0

リアクト:不要なDOMの更新は、私がJSX以内に「動的」いくつかのDOM要素を生成し、プロジェクトに反応している要素

<div className='ui form'> 
    <h2 className="header">{subtype}</h2> 
    { 
    subtypes[subtype].fields.map((field) => 
     <div className='field' key={field.name}> 
     <label>{field.label}</label> 
     <input name={field.name} 
       value={entity[field.name]} 
       onChange={onInputChange}/> 
     </div> 
    ) 
    } 
</div> 

特定のコンポーネントについては、生成された入力フィールドは、これまでの人生中に変化しません(その小道具だけが変更されます)、実際には静的なフォームを生成する単なる方法です。

だから、この「静的」JSXとまったく同じです:

<div className='ui form'> 
    <h2 className="header">{subtype}</h2> 

    <div className='field' key='field1'> 
     <label>Field 1</label> 
     <input name='field1' 
       value={entity['field1']} 
       onChange={onInputChange}/> 
    </div> 
    <div className='field' key='field2'> 
     <label>Field 2</label> 
     <input name='field2' 
       value={entity['field2']} 
       onChange={onInputChange}/> 
    </div> 
</div> 

私は最初のコードスニペットを使用した場合は、HTMLのDOM要素が状態/小道具を変更するたびに再作成されます。 2番目のスニペットを使用すると、HTMLは変更されず、フィールド値のみが更新されます(2番目のインスタンスでは、仮想DOM要素は同じであるが、最初のインスタンスでは検出されません)。

最初のコード例で「動的」仮想DOMを作成し、キャッシュして再利用できるようにする方法はありますか?Reactはそれを各レンダリングで同じと見なしますか?

感謝

+1

「PureComponent」を拡張するコンポーネントにラップします。 – Sulthan

答えて

0

どこsubtypesから来ていますか?私が理解していることから、コンポーネントの小道具でこれを受け取ります。その場合、この変数をこのコンポーネントの状態に格納する必要があります。次に、その状態を更新する必要があります。componentWillReceivePropsライフサイクル機能。

事は、setState機能が呼び出されたときにコンポーネントが再レンダリングされるだけです。したがって、コンポーネントが(既にマウントされた後に)小道具の変更を行うと、コンポーネントは再レンダリングされません。

class SimpleCom extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     subtypes: props.subtypes 
    } 
    } 
    componentWillReceiveProps(props) { 
    this.setState({ 
     subtypes: props.subtypes 
    }); 
    } 
    render() { 
    const subtypes = this.state.subtypes; 
    return (
     <div className='ui form'> 
      <h2 className="header">{subtype}</h2> 
      { 
      subtypes[subtype].fields.map((field) => 
       <div className='field' key={field.name}> 
       <label>{field.label}</label> 
       <input name={field.name} 
         value={entity[field.name]} 
         onChange={onInputChange}/> 
       </div> 
      ) 
      } 
     </div> 
    ); 
    } 
} 
+0

ありがとうございましたsqugeim、私はあなたが示唆するように状態を設定し、状態が変化すると正しくレンダリングします。 Reactは、仮想DOMの変更を検出することによって、「本当の」DOMの更新を最適化します。私の問題は、render()で要素を動的に生成すると、対応するHTML要素が変更されていなくても、各render()の "実際の" DOMに再作成されることです。静的に定義すると、要素は削除されず、置き換えられません。これにより、実際のDOMでは不要な/不要な変更が発生します。実際のDOMでこれらの不要な更新を避けることはできますか? – zakum1

+0

"動的に"正確に何を意味するのか説明できますか?あなたは何をしているのですか?親の 'subtypes'リストは変更されていますか?変更はどれくらいですか? – squgeim

+0

私の最初のリストでは、フィールド型の配列に基づいて仮想DOM要素(入力フィールド)を作成します。それは私が「動的に」と呼ぶものです。 2番目の例では、結果として得られるJSXをより冗長的に書き出すことに相当します。 – zakum1

関連する問題