2017-04-18 27 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