В моем приложении 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 не нужно ничего знать о логике приложения (пользовательский интерфейс материала, интернационализация и т. Д.). Он просто отображает, оставляя SmartComponent заботиться обо всей бизнес-логике.
Обратной стороной этого подхода является производительность: DumbComponent будет всегда повторно отрисовываться, даже когда свойства AnotherDumbComponent меняются вместо его собственных, потому что shouldComponentUpdate
always возвращает true
. shouldComponentUpdate
не может точно проверить равенство между элементами React в приведенном выше примере.
Как можно проверить равенство элементов React в shouldComponentUpdate
? Это слишком дорого? Является ли передача элементов React в качестве опоры тупым компонентам - плохой идеей? Можно ли не передавать элементы React в качестве свойств, но при этом сохранять компоненты бессмысленными? Спасибо!
shouldComponentUpdate
возвращаетfalse
, если вы не хотите повторно выполнять рендеринг. Если это достаточно просто, почему бы не создать свою собственную логику? Например:if (this.props.text !== nextProps.text || this.props.icon !== nextProps.icon) return true; return false;
. - person Yuya   schedule 06.06.2016