In meiner React-App verwende ich einige Bibliotheken (dh Material UI und React Intl), um React-Elemente als Requisiten von übergeordneteren Komponenten an "dumme Komponenten" zu übergeben Habe einen Job: rendern.Re-Render verhindern, wenn React Element als Prop übergeben wurde
Smart-Komponente:
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>
);
}
}
Dumb Komponente:
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>
);
}
}
Der Vorteil, dies zu tun, ist, dass das DumbComponent braucht nichts über die Anwendungslogik (Material ui, Internationalisierung zu wissen, etc .). Es rendert einfach und lässt SmartComponent, um sich um die gesamte Geschäftslogik zu kümmern.
Der Nachteil ich mit diesem Ansatz bin Begegnung ist Leistung: DumbComponent wird immer wieder machen, auch wenn AnotherDumbComponent die Requisiten statt seiner eigenen zu ändern, weil shouldComponentUpdate
immer kehrt true
. shouldComponentUpdate
kann im obigen Beispiel keine genaue Gleichheitsprüfung zwischen React-Elementen durchführen.
Wie können React-Elemente in shouldComponentUpdate
gleichheitsgeprüft werden? Ist das zu kostspielig? Ist das Übergeben von React-Elementen als Requisiten an dumme Komponenten eine schlechte Idee? Ist es möglich, nicht zu übergeben Reagieren Elemente als Requisiten, aber Komponenten dumm halten? Vielen Dank!
Sie müssen nur sicherstellen, dass 'sollteComponentUpdate'' false' zurückgibt, wenn Sie nicht erneut rendern möchten. Wenn es einfach genug ist, warum nicht deine eigene Logik erstellen? Wie zum Beispiel: 'if (this.props.text! == nextProps.text || this.props.icon! == nextProps.icon) gibt true zurück; return false; '. – Kujira
Könnten Sie ein Beispiel hinzufügen, wie Sie Ihre Requisiten mutieren? Weil ich dir nicht garantiere, dass die Unveränderlichkeits-Gleichheitsprüfung immer wahr ist, sogar für "gleiche" Daten. – Pcriulan