Heim >Web-Frontend >js-Tutorial >Verwenden Sie Store, um React-Komponenten zu optimieren

Verwenden Sie Store, um React-Komponenten zu optimieren

小云云
小云云Original
2018-01-04 10:03:061855Durchsuche

In diesem Artikel wird hauptsächlich die Methode zur Verwendung von Store zur Optimierung von React-Komponenten vorgestellt. Der Herausgeber findet sie recht gut, daher werde ich sie jetzt mit Ihnen teilen und als Referenz verwenden. Folgen wir dem Herausgeber und schauen wir uns das an. Ich hoffe, es kann allen helfen.

Beim Schreiben von Komponenten mit React stoßen wir häufig auf Situationen, in denen zwei verschiedene Komponenten ihren Status teilen müssen und der übliche Ansatz darin besteht, den Status auf die übergeordnete Komponente zu übertragen. Dabei gibt es jedoch ein Problem: Obwohl dieser Status nur für zwei Komponenten erforderlich ist, werden die übergeordnete Komponente und alle darunter liegenden Unterkomponenten neu gerendert, wenn sich der Status ändert, da der Status für die übergeordnete Komponente angegeben ist. Wenn Ihre übergeordnete Komponente relativ komplex ist und viele andere Unterkomponenten enthält, kann es zu Leistungsproblemen kommen.

Redux legt den Status im globalen Speicher ab, und dann abonnieren die Komponenten den Status, den sie benötigen. Wenn sich der Status ändert, werden nur die Komponenten neu gerendert, deren abonnierter Status sich ändert, wodurch die Nebenwirkungen vermieden werden den oben erwähnten verbesserten Status. Wenn wir jedoch eine React-Komponentenbibliothek schreiben, ist die Kombination aus Redux und React-Redux möglicherweise etwas zu schwer. So können wir selbst einen einfachen Store schreiben, um ein Abonnementmodell ähnlich wie Redux zu implementieren.

Beziehen Sie sich auf die Implementierung von Redux, um eine vereinfachte Version von createStore zu schreiben:


function createStore(initialState) {
 let state = initialState;
 const listeners = [];

 function setState(partial) {
  state = {
   ...state,
   ...partial,
  };
  for (let i = 0; i < listeners.length; i++) {
   listeners[i]();
  }
 }

 function getState() {
  return state;
 }

 function subscribe(listener) {
  listeners.push(listener);

  return function unsubscribe() {
   const index = listeners.indexOf(listener);
   listeners.splice(index, 1);
  };
 }

 return {
  setState,
  getState,
  subscribe,
 };
}

Unser createStore ist sehr einfach, mit nur 33 Zeilen inklusive Leerzeichen Es werden insgesamt 3 Methoden verfügbar gemacht. In Redux gibt es keinen Dispatch und keinen Reduzierer. Der Status wird direkt über die setState-Methode geändert. Nehmen wir es als Beispiel für einen Zähler.


class Counter extends React.Component {
 constructor(props) {
  super(props);

  // 初始化 store
  this.store = createStore({
   count: 0,
  });
 }

 render() {
  return (
   <p>
    <Buttons store={store} />
    <Result store={store} />
   </p>
  )
 }
}

class Buttons extends React.Component {
 handleClick = (step) => () => {
  const { store } = this.props;
  const { count } = store.getState();
  store.setState({ count: count + step });
 }

 render() {
  return (
   <p>
    <button onClick={this.handleClick(1)}>+</button>
    <button onClick={this.handleClick(1)}>-</button>
   </p>
  );
 }
}

class Result extends React.Component {
 constructor(props) {
  super(props);

  this.state = {
   count: props.store.getState().count,
  };
 }

 componentDidMount() {
  this.props.store.subscribe(() => {
   const { count } = this.props.store.getState();
   if (count !== this.state.count) {
    this.setState({ count });
   }
  });
 }

 render() {
  return (
   <p>{this.state.count}</p>
  );
 };
}

Im Buttons-Beispiel führt die Änderung des Status im Store über store.setState nicht dazu, dass der gesamte Counter neu gerendert wird, sondern weil das Ergebnis so ist hat die Store-Änderungen abonniert, sodass Sie bei einer Änderung der Anzahl ein erneutes Rendern durchführen können, indem Sie den Status in Ihrer eigenen Komponente ändern und so unnötiges Rendern geschickt vermeiden.

Obwohl der obige createStore nur ein paar Dutzend Zeilen Code hat, habe ich ihn dennoch in eine Bibliothek namens Mini-Store geschrieben und auf GitHub gestellt und einen Redux-ähnlichen Anbieter und eine Verbindungsmethode bereitgestellt Insgesamt sind es knapp über 100 Codezeilen. Wenn Sie auch eine React-Komponentenbibliothek schreiben und den Status einer komplexen Komponente verwalten müssen, können Sie diese Optimierungsmethode genauso gut ausprobieren.

Verwandte Empfehlungen:

JS implementiert das Klicken auf die Webseite, um zu bestimmen, ob die App installiert und geöffnet werden soll, andernfalls springen Sie zum App Store

Ecstore erhält DBSchema-Inhalt?

Eine kurze Diskussion über den Stil der direkten Ausgabe von Reaktionsisomorphismus

Das obige ist der detaillierte Inhalt vonVerwenden Sie Store, um React-Komponenten zu optimieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn