私の 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 が独自のものではなく変更された場合でも、常に再レンダリングされます。上記の例では、React 要素間の正確な等価性チェックを行うことができません。shouldComponentUpdate
true
shouldComponentUpdate
React 要素をどのように等価性チェックすることができますshouldComponentUpdate
か? これは実行するにはコストがかかりすぎますか? React要素を小道具としてダムコンポーネントに渡すのは悪い考えですか? React 要素を props として渡さずに、コンポーネントをダムのままにすることは可能ですか? ありがとう!