comprendre les méthodes du cycle de vie de react

je suis un débutant pour réagir.js et moi nous efforçons de comprendre plusieurs méthodes dans les méthodes du cycle de vie react.

jusqu'à présent, j'ai encore quelque chose qui me confond:

1)

autant que je sache, la différence entre componentWillUpdate et componentWillReceiveProps est-ce que componentWillReceiveProps sera appelé lorsque le parent change les accessoires et nous pouvons utiliser setState (setState de cet enfant à l'intérieur de componentWillReceiveProps ).

par exemple: https://github.com/bgerm/react-table-sorter-demo/blob/master/jsx/app.jsx

var App = React.createClass({
  getInitialState: function() {
    return {source: {limit: "200", source: "source1"}};
  },
  handleSourceChange: function(source) {
    this.setState({source: source});
  },
  render: function() {
    return (
      <div>
        <DataSourceSelectors onSourceChange={this.handleSourceChange} source={this.state.source} />
        <TableSorter dataSource={urlForDataSource(this.state.source)} config={CONFIG} headerRepeat="5" />
      </div>
    );
  }
});

dans TableSorter, nous avons

componentWillReceiveProps: function(nextProps) {
    // Load new data when the dataSource property changes.
    if (nextProps.dataSource != this.props.dataSource) {
      this.loadData(nextProps.dataSource);
    }
  }

signifie que lorsque nous changeons this.state.source , nous nous attendons à ce que componentWillReceiveProps soit appelé dans TableSorter

cependant, je ne comprends pas tout à fait comment utiliser componentWillUpdate dans ce cas, la définition de componentWillUpdate est

componentWillUpdate(object nextProps, object nextState)

comment passer nextState de parent à enfant? Ou peut-être que j'ai tort, est-ce que le prochain état est passé de l'élément parent ?

2) méthode componentWillMount me confond parce que dans le document officiel, il est dit que

invoqué une fois, à la fois sur le client et le serveur, immédiatement avant la initiale rendu.

Dans ce cas, si j'utilise setState dans cette méthode, il sera remplace l'état initial puisqu'il ne sera appelé qu'une seule fois. Dans ce cas, quelle est la raison de définir les paramètres dans la méthode getInitialState. Dans ce cas particulier, nous avons

  getInitialState: function() {
    return {
      items: this.props.initialItems || [],
      sort: this.props.config.sort || { column: "", order: "" },
      columns: this.props.config.columns
    };
  },
  componentWillMount: function() {
    this.loadData(this.props.dataSource);
  },
  loadData: function(dataSource) {
    if (!dataSource) return;

    $.get(dataSource).done(function(data) {
      console.log("Received data");
     this.setState({items: data});
     }.bind(this)).fail(function(error, a, b) {
      console.log("Error loading JSON");
     });
  },

éléments sera remplacé d'abord et pourquoi nous avons encore besoin items: this.props.initialItems || [] dans la méthode getInitialState?

J'espère que vous pouvez comprendre mon explication, et s'il vous plaît donnez-moi quelques conseils si vous en avez. Merci beaucoup :)

46
demandé sur Guifan Li 2015-04-26 07:24:48

3 réponses

1) componentWillReceiveProps est appelé avant componentWillUpdate dans le cycle de vie de la mise à jour de React. Vous avez raison que componentWillReceiveProps vous permet d'appeler setState . D'autre part componentWillUpdate est un callback à utiliser lorsque vous devez répondre à un changement d'état.

La différence fondamentale entre les accessoires et l'état est que l'état est privé de la composante. C'est pourquoi ni un composant parent ni personne d'autre ne peut manipuler l'état (par ex. appeler setState ) du composant. Ainsi, le flux de travail par défaut pour la relation parent-enfant serait le suivant:

  • Parent passe de nouveaux accessoires à l'enfant
  • l'enfant manipule de nouveaux accessoires dans "componentWillReceiveProps", les appels setState si nécessaire
  • L'enfant manipule un nouvel état dans 'componentWillUpdate' - mais si votre composant est stateful, la manipulation des accessoires dans' componentWillReceiveProps ' sera suffisante.

2) Vous avez fourni un très bon exemple de code pour illustrer la différence. Les valeurs par défaut définies dans getInitialState seront utilisées pour le rendu initial. L'appel loadData de componentWillMount lancera une demande AJAX qui pourrait ou non réussir - de plus, on ne sait pas combien de temps il faudra pour la compléter. Lorsque la requête AJAX est terminée et que setState est appelé avec new state, le composant sera rendu dans le DOM avec des valeurs par défaut. C'est pourquoi il est sens total pour fournir de l'état par défaut de l' getInitialState .

Note: j'ai trouvé comprendre le cycle de vie du composant React un article très utile pour comprendre les méthodes du cycle de vie de React.

58
répondu Yevgen Safronov 2017-06-07 10:08:40

meilleur Article que j'ai jamais lu pour comprendre le cycle de vie du composant React:

la Compréhension de la Réagir la Composante du Cycle de vie

3
répondu Himanshu Teotia 2017-08-31 04:23:39

voici un étonnant diagramme des méthodes du cycle de vie React ( fait par Dan Abramov ) enter image description here

version Interactive de ce diagramme

1
répondu Igor Alemasow 2018-04-16 11:42:16