文章目录
一:定时器的使用
我们想要组件挂载到页面,就开启定时器的效果,如果将定时器函数写在render里,这种写法是错误的
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<!-- 准备好一个容器 -->
<div id="test"><div>
<script type="text/javascript" src="../js/react.development.js"></script>
<script
type="text/javascript"
src="../js/react-dom.development.js"
></script>
<script type="text/javascript" src="../js/babel.min.js"></script>
<!--此处一定要写 type="text/babel" 告诉bable.js解析里面的jsx代码 -->
<script type="text/babel">
class Life extends React.Component{
state={
opacity:0.5
}
test=()=>{
//卸载组件
ReactDOM.unmountComponentAtNode(document.getElementById('test'))
}
render(){
console.log('render');
setInterval(()=>{
//const声明的状态不能再改,所以用let
let {opacity}=this.state;
opacity-=0.1;
if(opacity<=0){
//更新状态就会重新调render,调了很多次render,然后速度越来越快
opacity=1
}
//同名可以省略 this.setState({opacity,opacity})
this.setState({opacity})
},1000);
return (
<div>
<h1 style={{opacity:this.state.opacity}}>今天天气升温了</h1>
<button onClick={this.test}>真的吗?</button>
</div>
)
}
}
ReactDOM.render(<Life/>,document.getElementById('test'))
</script>
</body>
</html>
用生命周期函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<!-- 准备好一个容器 -->
<div id="test"><div>
<script type="text/javascript" src="../js/react.development.js"></script>
<script
type="text/javascript"
src="../js/react-dom.development.js"
></script>
<script type="text/javascript" src="../js/babel.min.js"></script>
<!--此处一定要写 type="text/babel" 告诉bable.js解析里面的jsx代码 -->
<script type="text/babel">
class Life extends React.Component{
state={
opacity:0.5
}
test=()=>{
//卸载组件之前要清楚定时器
clearInterval(this.timer)
//卸载组件
ReactDOM.unmountComponentAtNode(document.getElementById('test'))
}
//和render是兄弟,不用赋值语句+箭头函数
//组件挂载完毕调用
componentDidMount(){
this.timer=setInterval(()=>{
//const声明的状态不能再改,所以用let
let {opacity}=this.state;
opacity-=0.1;
if(opacity<=0){
//更新状态就会重新调render,调了很多次render,然后速度越来越快
opacity=1
}
//同名可以省略 this.setState({opacity,opacity})
this.setState({opacity})
},200);
}
//组件将要卸载
componentWillUnmount(){
//也可在这清除定时器
}
//render调用的时机:初始化渲染,状态更新之后
render(){
return (
<div>
<h1 style={{opacity:this.state.opacity}}>今天天气升温了</h1>
<button onClick={this.test}>真的吗?</button>
</div>
)
}
}
ReactDOM.render(<Life/>,document.getElementById('test'))
</script>
</body>
</html>
二:生命周期新旧对比
1.旧版生命周期函数
1.初始化阶段
1.由ReactDOM.render()触发—初次渲染
2.cnstructor()
3.render()
4.componentDidMount() 常用,一般在这个钩子中做一些初始化的事,例如:开启定时器,发送网络请求,订阅消息
2.更新阶段:由组件内部this.setState()或父组件render触发
1.shouldComponentUpdate()
2.componentWillUpdate()
3.render() 常用,
4.componentDidUpdate()
3.卸载组件:由RaectDOM.unmountComponentAtNode()触发—初次渲染
1.componentWillUnmount()======>常用,一般在这个钩子中做一些收尾的事,例如:关闭定时器,取消订阅消息
1.1组件挂载流程
<!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>Document</title>
</head>
<body>
<div id="test"></div>
<!-- react核心库 要在最前面引入-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!-- react-dom 用于支持react操作DOM -->
<script
type="text/javascript"
src="../js/react-dom.development.js"
></script>
<!-- babel 用于jsx转为js-->
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel">
class Count extends React.Component {
state = { count: 0 };
add = () => {
const { count } = this.state;
//是运算,没有赋值
this.setState({ count: count + 1 });
};
//构造器;
constructor(props) {
super(props);
console.log("constructor");
}
//组件将要挂载的钩子
componentWillMount() {
console.log("ComponentWillMount");
}
//组件挂载完毕的钩子
componentDidMount() {
console.log("ComponentDidMount");
}
render() {
console.log("render");
const { count } = this.state;
return (
<div>
<h2>当前求和为:{count}</h2>
<button onClick={this.add}>点我+1</button>
</div>
);
}
}
ReactDOM.render(<Count />, document.getElementById("test"));
</script>
</body>
</html>
1.2卸载组件流程
<!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>Document</title>
</head>
<body>
<div id="test"></div>
<!-- react核心库 要在最前面引入-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!-- react-dom 用于支持react操作DOM -->
<script
type="text/javascript"
src="../js/react-dom.development.js"
></script>
<!-- babel 用于jsx转为js-->
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel">
class Count extends React.Component {
state = { count: 0 };
add = () => {
const { count } = this.state;
//是运算,没有赋值
this.setState({ count: count + 1 });
};
unload=()=>{
ReactDOM.unmountComponentAtNode(document.getElementById('test'))
}
//构造器;
constructor(props) {
super(props);
console.log("constructor");
}
//组件将要挂载的钩子
componentWillMount() {
console.log("ComponentWillMount");
}
//组件挂载完毕的钩子
componentDidMount() {
console.log("ComponentDidMount");
}
//组件将要卸载的钩子
componentWillUnmount(){
console.log('componentWillUnmount');
}
render() {
console.log("render");
const { count } = this.state;
return (
<div>
<h2>当前求和为:{count}</h2>
<button onClick={this.add}>点我+1</button>
<button onClick={this.unload}>卸载组件</button>
</div>
);
}
}
ReactDOM.render(<Count />, document.getElementById("test"));
</script>
</body>
</html>
1.3setState流程
<!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>Document</title>
</head>
<body>
<div id="test"></div>
<!-- react核心库 要在最前面引入-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!-- react-dom 用于支持react操作DOM -->
<script
type="text/javascript"
src="../js/react-dom.development.js"
></script>
<!-- babel 用于jsx转为js-->
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel">
class Count extends React.Component {
state = { count: 0 };
add = () => {
const { count } = this.state;
//是运算,没有赋值
this.setState({ count: count + 1 });
};
unload=()=>{
ReactDOM.unmountComponentAtNode(document.getElementById('test'))
}
//构造器;
constructor(props) {
super(props);
console.log("constructor");
}
//组件将要挂载的钩子
componentWillMount() {
console.log("ComponentWillMount");
}
//组件挂载完毕的钩子
componentDidMount() {
console.log("ComponentDidMount");
}
//组件将要卸载的钩子
componentWillUnmount(){
console.log('componentWillUnmount');
}
//控制组件更新的阀门 要写返回值,true或者false ,返回true才会更新
shouldComponentUpdate(){
console.log('shouldComponentUpdate');
return true
}
//组件将要更新钩子
componentWillUpdate(){
console.log('componentWillUpdate');
}
//组件更新完毕的钩子
componentDidUpdate(){
console.log('componentDidUpdate');
}
render() {
console.log("render");
const { count } = this.state;
return (
<div>
<h2>当前求和为:{count}</h2>
<button onClick={this.add}>点我+1</button>
<button onClick={this.unload}>卸载组件</button>
</div>
);
}
}
ReactDOM.render(<Count />, document.getElementById("test"));
</script>
</body>
</html>
1.4forceUpdate 强制更新
不想对状态做出修改,进行的更新
<!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>Document</title>
</head>
<body>
<div id="test"></div>
<!-- react核心库 要在最前面引入-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!-- react-dom 用于支持react操作DOM -->
<script
type="text/javascript"
src="../js/react-dom.development.js"
></script>
<!-- babel 用于jsx转为js-->
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel">
class Count extends React.Component {
state = { count: 0 };
add = () => {
const { count } = this.state;
//是运算,没有赋值
this.setState({ count: count + 1 });
};
unload=()=>{
ReactDOM.unmountComponentAtNode(document.getElementById('test'))
}
//强制更新按钮的回调
force=()=>{
this.forceUpdate()
}
//构造器;
constructor(props) {
super(props);
console.log("constructor");
}
//组件将要挂载的钩子
componentWillMount() {
console.log("ComponentWillMount");
}
//组件挂载完毕的钩子
componentDidMount() {
console.log("ComponentDidMount");
}
//组件将要卸载的钩子
componentWillUnmount(){
console.log('componentWillUnmount');
}
//控制组件更新的阀门 要写返回值,true或者false ,返回true才会更新
shouldComponentUpdate(){
console.log('shouldComponentUpdate');
return false
}
//组件将要更新钩子
componentWillUpdate(){
console.log('componentWillUpdate');
}
//组件更新完毕的钩子
componentDidUpdate(){
console.log('componentDidUpdate');
}
render() {
console.log("render");
const { count } = this.state;
return (
<div>
<h2>当前求和为:{count}</h2>
<button onClick={this.add}>点我+1</button>
<button onClick={this.unload}>卸载组件</button>
<button onClick={this.force}>强制更新</button>
</div>
);
}
}
ReactDOM.render(<Count />, document.getElementById("test"));
</script>
</body>
</html>
1.5父组件render流程
<!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>Document</title>
</head>
<body>
<div id="test"></div>
<!-- react核心库 要在最前面引入-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!-- react-dom 用于支持react操作DOM -->
<script
type="text/javascript"
src="../js/react-dom.development.js"
></script>
<!-- babel 用于jsx转为js-->
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel">
//组件将要接受新的props的钩子,第一次接收props不算,父组件第二次执行render的时候才调用(第一次是初始化渲染,第二次是状态发生改变)
class A extends React.Component {
state={car:'奥迪'}
changeCar=()=>{
const {car}=this.state
this.setState({car:'奔驰'})
}
shouldComponentUpdate() {
console.log("A---shouldComponentUpdate");
return true;
}
//组件将要更新钩子
componentWillUpdate() {
console.log("A---componentWillUpdate");
}
//组件更新完毕的钩子
componentDidUpdate() {
console.log("A---componentDidUpdate");
}
render() {
console.log('A---render');
const {car}=this.state
return (
<div>
<div> A组件</div>
<button onClick={this.changeCar}>换车</button>
<Son carName={car}/>
</div>
);
}
}
class Son extends React.Component {
//组件将要接收新的props的钩子
componentWillReceiveProps(props){
console.log('B----componentWillReceiveProps',props);
}
//控制组件更新的阀门 要写返回值,true或者false ,返回true才会更新
shouldComponentUpdate() {
console.log("B---shouldComponentUpdate");
return true;
}
//组件将要更新钩子
componentWillUpdate() {
console.log("B---componentWillUpdate");
}
//组件更新完毕的钩子
componentDidUpdate() {
console.log("B---componentDidUpdate");
}
render(){
console.log('B---render');
const {carName}=this.props
return(
<div>我是B组件,接收到的车是:{carName}</div>
)
}
}
ReactDOM.render(<A/>, document.getElementById("test"));
</script>
</body>
</html>
2.新版的生命周期函数