课程章节:第4章 React新特性Hooks讲解 4-1
课程讲师:Jokcy
课程内容:
Hooks是React16 推出的一个功能:**让函数组件具有类组件的能力。**Hooks 极大改变了 React 应用开发的模式和开发体验。
随着 hooks的使用,将来越来越多的组件将使用函数组件,而不再是class组件。Hooks代表着未来react开发的新趋势。
计数器demo
通过计数器的 demo 来学习hooks。
场景:
假设现在需要一个计数器组件,有一个本地的状态count,每隔1s,count增加1。
如果不使用hooks,按照之前的写法是:
import React from 'react';
class Counter extends React.Component {
constructor() {
super();
this.state = {
count: 10
};
}
// 组件挂载后,设置定时器
componentDidMount() {
// 注意,定时器中的setState是同步的
this.interval = setInterval(()=>{
this.setState({count: this.state.count + 1})
}, 1000)
}
// 在组件中使用了定时器,一定记得在组件卸载时,要清除定时器
// 如果忘记清除了,那么在组件卸载后,这个定时器依旧存在,不仅消耗内存引起内存泄露,而且定时器还会调用setState的方法,但此时setState已经不存在了,所以会报错
componentWillUnmount() {
if(this.interval) {
clearInterval(this.interval);
}
}
render() {
return <h3>{ this.state.count }</h3>
}
}
或者,使用了ES7的类属性新特性:
import React from 'react';
class Counter extends React.Component {
state = {
count: 10
}
render() {
return (
<div>
<h3>{ this.state.count }</h3>
<button onClick={}>加1</button>
</div>
)
}
}
以上的功能,在以前是无法在function组件中实现的,因为function组件没有state,没有生命周期。
可是现在有了hooks,一切就不同了。
import React, { useState, useEffect } from 'react';
function Counter() {
// useState声明一个state:count, 和更新state的方法:setCount
// count的默认state是0
const [count, setCount] = useState(0);
// 组件挂载后,执行回调
useEffect(() => {
const interval = setInterval(() => {
// c对应最新的state
setCount(c => c + 1)
}, 1000)
// 组件卸载时,执行return的函数
return () => clearInterval(interval)
}, [])
return <span>{count}</span>
}
export default Counter;
使用useState和useEffect,可以给function组件增加类似state和生命周期方法的效果。
使用useState声明状态,返回状态和更新状态的方法。
useEffect 方法,可以在组件更新完成之后,执行传入的回调,组件卸载时执行return的函数来做一些清理的工作。class组件有生命周期函数,function组件是没有生命周期函数的。可以使用useEffect 来模拟类组件的生命周期。
课程收获:
这节课学习了 Hooks 的概念,它改变了类组件的繁重的开发方式,提供了一种更简洁,轻便,灵活的开发体验。