react componentDidMount被称为渲染后执行

时间:2019-09-21 19:38:09

标签: javascript html reactjs

我是React JS的新手,现在我对组件生命周期方法的工作方式感到困惑;在我的案例中,这与ReactJS.org文档完全矛盾。预期的行为应在render()之前执行componentDidMount(),但在componentDidMount()之前执行render()。

我的源代码:

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;
//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;

如果在null中调用了this.importAll(),则类变量this.cache为componentDidMount(),但是如果在this.importAll()中调用了render(),它将占用值。

enter image description here

3 个答案:

答案 0 :(得分:3)

这是正确的行为,在渲染之后调用componentDidMount()。

  

当   正在创建组件实例并将其插入   DOM:   
* Constructor()   
*静态getDerivedStateFromProps()   
* render()   
* componentDidMount()

已弃用的componentWillMount()之前已被调用。

  

注意:   这些方法被认为是传统方法,应避免   它们以新代码显示:

     

UNSAFE_componentWillMount()

答案 1 :(得分:2)

您在React js中误解了生命周期。

componentDidMount将在首次调用render之后被调用。

有关更多信息:The component lifecycle

答案 2 :(得分:1)

我认为您正在将componentWillMount()componentDidMount()混淆。在componentWillMount()中调用setState()时,在渲染之前调用componentDidMount()可以重新渲染组件