2017-04-18 67 views
0

我已經產生內JSX一些DOM元素「動態」一個陣營項目:不必要的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元素,會重新對每一個變化國家/道具。如果我使用第二個片段,那麼HTML看起來沒有改變,只有字段值被更新(React可以在第二個實例中檢測到虛擬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

你能解釋一下「動態」的意思嗎?你到底在做什麼?是否在父項中更改了「子類型」列表?這些變化有多少? – squgeim

+0

在我的第一個列表中,我創建了基於字段類型數組的虛擬DOM元素(輸入字段)。這就是我所說的「動態」。在第二部分中,我展示了相當於將所得到的JSX更詳細地寫出來。 – zakum1