我是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()
,它将占用值。
答案 0 :(得分:3)
这是正确的行为,在渲染之后调用componentDidMount()。
当 正在创建组件实例并将其插入 DOM:
* Constructor()
*静态getDerivedStateFromProps()
* render()
* componentDidMount()
已弃用的componentWillMount()之前已被调用。
注意: 这些方法被认为是传统方法,应避免 它们以新代码显示:
UNSAFE_componentWillMount()
答案 1 :(得分:2)
答案 2 :(得分:1)
我认为您正在将componentWillMount()
与componentDidMount()
混淆。在componentWillMount()
中调用setState()
时,在渲染之前调用componentDidMount()
可以重新渲染组件