将选择是否使用道具/状态在render()中显示一个组件,每次都会重绘一次?

问题描述:

以下两个等效表现是否明智?第一个示例是否会导致Component1Component2每次更新MyComponent的道具都会被重新渲染?将选择是否使用道具/状态在render()中显示一个组件,每次都会重绘一次?

import React from 'react'; 
import { connect } from 'react-redux'; 
import { createStructuredSelector } from 'reselect'; 
import { selectShowComponent1, selectShowComponent2 } from './selectors'; 

@connect(createStructuredSelector({ 
    showComponent1: selectShowComponent1, 
    showComponent2: selectShowComponent2, 
})) 
class MyComponent extends React.PureComponent { 
    static propTypes = { 
    showComponent1: React.PropTypes.bool, 
    showComponent2: React.PropTypes.bool, 
    }; 

    render() { 
    const { showComponent1, showComponent2 } = this.props; 
    return (
     <div> 
     {showComponent1 ? (<Component1>shown 1</Component1>) : ''} 
     {showComponent2 ? (<Component2>shown 2</Component2>) : ''} 
     </div> 
    ); 
    } 
} 

export default MyComponent; 
import React from 'react'; 
import { connect } from 'react-redux'; 
import { createStructuredSelector } from 'reselect'; 
import { selectShowComponent1, selectShowComponent2 } from './selectors'; 

@connect(createStructuredSelector({ 
    showComponent1: selectShowComponent1, 
    showComponent2: selectShowComponent2, 
})) 
class MyComponent extends React.PureComponent { 
    static propTypes = { 
    showComponent1: React.PropTypes.bool, 
    showComponent2: React.PropTypes.bool, 
    }; 

    render() { 
    const { showComponent1, showComponent2 } = this.props; 
    return (
     <div> 
     <Component1 renderMe={showComponent1}>shown 1</Component1> 
     <Component2 renderMe={showComponent2}>shown 2</Component2> 
     </div> 
    ); 
    } 
} 

export default MyComponent; 
+0

第二种方法将渲染这两个组件,并在这些组件内部管理要显示的内容。另一方面,第一种方法会在你的道具每次改变时安装新的组件。 – Kejt

第一个将重新呈现每一次,而第二个则不会。原因是动态生成的组件(在这种情况下,它们是三态运算符的结果),每次从动态上下文返回时都会得到一个新的键。而这个关键是React在内部用来唯一标识组件的。

所以我相信,如果你给他们明确的键:

{showComponent1 ? (<Component1 key="1">shown 1</Component1>) : ''} 
    {showComponent2 ? (<Component2 key="2">shown 2</Component2>) : ''} 

然后在理论上应该阻止他们正在重新呈现,但是这不是在某些情况下理想的,因为手动分配密钥可能意味着该组件可能不当你真正想要的时候重新渲染。

+0

谢谢你的回复。密钥是否在每个组件中都有“范围”?如果我在多个组件中使用相同的密钥,可否发生冲突?也就是说,如果我在标题组件中有一个列表,并且这些项目的键是1,2,3 ......,然后页脚中的另一个列表中的项目分配了相同的键值,它们会冲突吗? – dimvic

+0

他们只需要在他们的兄弟姐妹方面是独一无二的(即他们的父母下方的水平)。 – Jayce444