在我的 React 应用程序中,我使用一些库(即 Material UI 和 React Intl)将 React 元素作为道具从更高级别的组件传递到具有一项工作的“哑组件”:渲染。
智能组件:
import ActionExplore from 'material-ui/svg-icons/action/explore';
import { FormattedMessage } from 'react-intl';
export class SmartComponent extends Component {
render() {
return (
<div>
<DumbComponent
text={<FormattedMessage id="en.dumbComponent.text" />}
icon={<ActionExplore/>}
/>
<AnotherDumbComponent {props.that.are.changing} />
</div>
);
}
}
哑组件:
import shallowCompare from 'react-addons-shallow-compare';
export class DumbComponent extends Component {
shouldComponentUpdate(nextProps, nextState) {
return shallowCompare(this, nextProps, nextState);
}
render() {
return (
<div>
<h1>{this.props.text}</h1>
{this.props.icon}
</div>
);
}
}
这样做的好处是,DumbComponent 不需要了解任何有关应用程序逻辑(材质 ui、国际化等)的信息。它只是渲染,让 SmartComponent 负责所有业务逻辑。
我遇到这种方法的缺点是性能:DumbComponent总是会重新渲染,即使 AnotherDumbComponent 的 props 改变而不是它自己的,因为shouldComponentUpdate
总是返回true
。shouldComponentUpdate
在上面的示例中,无法在 React 元素之间进行准确的相等性检查。
如何对 React 元素进行相等检查shouldComponentUpdate
?这是否太昂贵而无法执行?将 React 元素作为道具传递给哑组件是一个坏主意吗?是否可以不将 React 元素作为道具传递,但让组件保持哑巴?谢谢!