0
votes

react componentDidMount est appelé exécution après le rendu

Je suis nouveau dans React JS et je suis maintenant perplexe quant au fonctionnement des méthodes de cycle de vie des composants; ce qui est entièrement en contradiction avec les documents ReactJS.org dans mon cas. Le componentDidMount () doit s'exécuter avant render () est ce que le comportement attendu, mais render () s'exécute avant componentDidMount ().

Mon code source:

//GalleryImages.js
const galleries = [
  {
    src: './Farmer2.jpg',
    title: 'Farmer2',
    description: 'farmer2'
  },
  {
    src: './Farmer1.jpg',
    title: 'Farmer1',
    description: 'farmer1'
  },
  {
    src: './Farmer3.jpg',
    title: 'Farmer3',
    description: 'farmer3'
  }
];
export default galleries;
import React from 'react';
import '../main.css';
//import sam from "../images/gallery/Farmer1.jpg";
import galleries from './GalleryImages.js';
class Gallery extends React.Component {
  constructor(props) {
    super(props);
  }
  cache = {};
  dummy = './Farmer1.jpg';
  importAll = (r, ping) => {
    console.log(ping + ' called');
    r.keys().forEach(key => {
      this.cache[key] = r(key);
      console.log(`key is ${key} and value : ${r(key)}`);
      this.dummy = r(key);
    });
    console.log(this.cache);
  };
  componentDidMount() {
    this.importAll(
      require.context('../images/gallery/', false, /\.jpg$/),
      'mount'
    );
  }
  render() {
    //this.importAll(require.context('../images/gallery/', false, /\.jpg$/),"render");
    console.log(this.cache);
    const gallery = galleries.map(gallery => {
      return (
        <a
          className="spotlight"
          href={gallery.src}
          data-title={gallery.title}
          data-description={gallery.description}
        >
          {console.log(this.cache[gallery.src])}
          <img src={this.cache[gallery.src]} />
        </a>
      );
    });
    return (
      <div className="container margintop150">
        <div className="greentext center">
          <h4>
            {' '}
            <b>Gallery</b>
          </h4>
        </div>
        <h5 className="type_5" />
        <div className="row">
          <div
            className="spotlight-group"
            data-title="Untitled"
            data-animation="fade"
            data-fullscreen="false"
            data-maximize="false"
            data-minimize="false"
          >
            {gallery}
          </div>
        </div>
      </div>
    );
  }
}
export default Gallery;


2 commentaires

componentDidMount () s'exécute après le premier appel de render () . Vous pouvez consulter ce diagramme pour mieux comprendre comment se déroule le cycle de vie


Pensez-y un instant. montage DID compoent. Cela signifie qu'il DID déjà monté, ce qui signifierait que la fonction de rendu devrait s'exécuter pour être montée (vous pouvez déjà le voir dans le navigateur). Alors oui, cela devrait être après le rendu, mais uniquement sur le rendu de montage. Pas après les relances suivantes


3 Réponses :


3
votes

C'est le bon comportement, componentDidMount () est appelé après render.

Ces méthodes sont appelées dans l'ordre suivant lorsqu'une instance d'un composant est en cours de création et insérée dans le DOM:
* constructeur ()
* statique getDerivedStateFromProps ()
* rendre ()
* componentDidMount ()

Le composant obsolèteWillMount () est appelé avant.

Remarque: Ces méthodes sont considérées comme héritées et vous devez éviter les dans un nouveau code:

UNSAFE_componentWillMount ()


0 commentaires

2
votes

Vous avez mal compris le cycle de vie dans réagir JS.

composantDidMount sera appelé après rendu est appelé à la première fois.

Pour plus d'informations: Le cycle de vie du composant


0 commentaires

1
votes

Je pense que vous confondez componentWillMount () avec componentDidMount () . componentWillMount () est appelé avant le rendu tout en appelant setState () dans componentDidMount () peut re-rendre le composant


1 commentaires

Bienvenue dans Stack Overflow! Votre réponse pourrait mieux être rédigée sous forme de commentaire sous la question d'origine. Je pense qu'il y a peut-être déjà quelque chose de similaire. Les réponses sont réservées aux explications complètes de la question d'un utilisateur. Bon travail pour répondre cependant!