<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>hello_react</title>
<!-- 引入react,为了使用 React对象 -->
<script src="js/17.0.1/react.development.js"></script>
<!-- 引入 react-dom, 为了使用 ReactDOM 对象 -->
<script src="js/17.0.1/react-dom.development.js"></script>
<!-- 引入 babel, 为了 解析 JSX -->
<script src="js/17.0.1/babel.min.js"></script>
</head>
<body>
<div id="test"></div>
<!-- 1. 对比新旧生命周期
使用新版本的17.0.1 react/react-dom/babel -->
<script type="text/babel">
// 创建组件
class Count extends React.Component {
constructor(props) {
console.log('Count---constructor')
super(props)
this.state = {count: 0}
}
add = () => {
let {count} = this.state
this.setState({count: count+1})
}
death = () => {
ReactDOM.unmountComponentAtNode(document.getElementById('test'))
}
force = () => {
this.forceUpdate()
}
// 在新版本中,需要加 UNSAFE_
UNSAFE_componentWillMount() {
console.log('Count---componentWillMount')
}
componentDidMount() {
console.log('Count---componentDidMount')
}
componentWillUnmount() {
console.log('Count---componentWillUnmount')
}
shouldComponentUpdate() {
console.log('Count---shouldComponentUpdate')
return true
}
// 在新版本中,需要加 UNSAFE_
UNSAFE_componentWillUpdate() {
console.log('Count---componentWillUpdate')
}
componentDidUpdate() {
console.log('Count---componentDidUpdate')
}
render() {
console.log('Count---render')
const {count} = this.state
return (
<div>
<h2>当前求和为{count}</h2>
<button onClick={this.add}>点我+1</button>
<button onClick={this.death}>卸载组件</button>
<button onClick={this.force}>不更改状态中的任何数据,强制更新一下</button>
</div>
)
}
}
// 挂载组件
ReactDOM.render(<Count/>,document.getElementById('test'))
</script>
<!-- <script type="text/babel">
// 创建组件
class A extends React.Component {
state = {
carName: '奔驰'
}
changeCar = () => {
this.setState({carName: '奥托'})
}
render() {
return (
<div>
<div>我是A组件</div>
<button onClick={this.changeCar}>换车</button>
<B carName={this.state.carName}/>
</div>
)
}
}
class B extends React.Component {
// 在新版本中,需要加 UNSAFE_
UNSAFE_componentWillReceiveProps(props) {
console.log('B---componentWillReceiveProps', props)
}
render() {
console.log('B---render')
return (
<div>
我是B 组件,接收到的车是:{this.props.carName}
</div>
)
}
}
// 挂载组件
ReactDOM.render(<A/>,document.getElementById('test'))
</script> -->
<!-- 在新版本中,能不能使用旧的生命周期钩子?
----能。但是控制台会有警告。
在新版本中,哪三个钩子需要加 UNSAFE_?
1. componentWillMount
2. componentWillUpdate
3. componentWillReceiveProps
记住三个Will。除了componentWillUnmount
-->
<!-- 新旧生命周期有什么区别?
新的废弃了三个:
1. componentWillMount
2. componentWillUpdate
3. componentWillReceiveProps
增加了两个:
1. getDerivedStateFromProps
2. getSnapshotBeforeUpdate
-->
<!-- 新生命周期
生命周期分为三个阶段:
1. 初始化阶段---由ReactDOM.render触发--初次渲染
constructor---getDerivedStateFromProps----render----componentDidMount
2. 更新阶段----由组件内部this.setState() 或者 父组件render 触发
getDerivedStateFromProps---shouldComponentUpdate ---render ----getSnapshotBeforeUpdate---componentDidUpdate
3. 卸载组件--由ReactDOM.unmountComponentAtNode() 触发
componentWillUnmount
-->
<!--旧的
生命周期分为三个阶段:
1. 初始化阶段---由ReactDOM.render触发--初次渲染
constructor---componentWillMount----render----componentDidMount
2. 更新阶段----由组件内部this.setState() 或者 父组件render 触发
shouldComponentUpdate --- componentWillUpdate---render---componentDidUpdate
强制更新 forceUpdate 没有阀门。
3. 卸载组件--由ReactDOM.unmountComponentAtNode() 触发
componentWillUnmount
-->
</body>
</html>