Сегодня я нашел то, чего не ожидал. Этого не происходит в Angular или, возможно, в другой библиотеке / фреймворке JS. Но сегодня я был шокирован, когда не сработали методы жизненного цикла React. За этим стоит какой-то взлом. давайте посмотрим код.
У меня есть компонент A
import React, { Component } from 'react'
class A extends Component {
componentDidMount() {
console.log('component mount', this.props.name);
}
render() {
return (
<>
Hello - {this.props.name}
</>
)
}
}
export default A;
Я дважды инициализировал этот компонент в App компоненте с некоторыми условиями:
import React, { Component } from 'react';
import { render } from 'react-dom';
import A from './A';
import './style.css';
class App extends Component {
constructor() {
super();
this.state = {
isShow: true
};
this.setIsShow = this.setIsShow.bind(this);
}
setIsShow() {
this.setState(() => {
return {isShow: !this.state.isShow};
});
}
render() {
return (
<div>
<button onClick={this.setIsShow}>Show A1</button>
<button onClick={this.setIsShow}>Show A2</button>
<br />
<br />
{this.state.isShow ? <A name="A1" />
:
<A name="A2" />
}
</div>
);
}
}
render(<App />, document.getElementById('root'));
Каково ожидаемое поведение? имя значение реквизита изменялось, когда я нажимал кнопки. это ожидается, хорошо. Но при повторной инициализации компонента не вызывается метод жизненного цикла :(. componentDidMount запускается только один раз.
Теперь добавьте свойство key в A , и вы увидите, что componentDidMount вызывается каждый раз, когда A компонент повторно инициализируется.
{
this.state.isShow ? <A name="A1" key="1" />
:
<A name="A2" key="2" />
}
Это ожидаемое поведение. вопрос, почему не без ключа свойства.
Checkout Online demo: https://stackblitz.com/edit/problem-react-lifecycle