【发布时间】:2020-06-16 04:13:22
【问题描述】:
今天我发现了一些出乎我意料的东西。这不会发生在 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'));
现在,预期的行为是什么?当我点击按钮时,name 道具值发生了变化。这是预期的,好吧。但是当组件重新初始化时没有调用生命周期方法:(。componentDidMount只触发一次。
现在在 A 组件选择器中添加 key 属性,您将看到每次 A 时都会调用 componentDidMount组件已重新初始化。
{
this.state.isShow ? <A name="A1" key="1" />
:
<A name="A2" key="2" />
}
这是预期的行为。但问题是为什么不能没有 key 属性。
【问题讨论】:
-
使用
getDerivedStateFromProps方法获取修改后的props -
问题不是如何解决这个问题,问题是它破坏了组件定义和它的生命周期:)
-
除了它不会破坏生命周期,因为它只是没有卸载和重新安装组件。
标签: javascript reactjs angular react-native react-lifecycle