创建

  1. const MyComponent = (props) => {
  2. return <div>{props.message}</div>
  3. }
  4. const MyComponent = props => <div>{props.message}</div>
  5. function MyComponent(props){
  6. return <div>{props.message}</div>
  7. }

使用 useEffect 模拟生命周期

使用 useEffect 模拟生命周期,取决于第二个参数

  • componentDidMount: 第二个参数为空数组

    1. useEffect(() => {console.log('componentDidMount')}, [])
  • componentDidUpdate:

第二个参数不传则所有属性更新时都执行函数,传一个数组则数组内数据更新时执行函数,但是该在第一次渲染时也会执行

  1. useEffect(() => {console.log('任意属性更新')})
  2. useEffect(() => {console.log('m 与 n 更新')}, [m, n])

封装组件,使得第一次渲染时不执行函数,完全模拟 componentDidUpdate:

  1. const useUpdate = (fn, dep) => {
  2. const [count, setCount] = useState(0);
  3. useEffect(() => {
  4. setCount(x => x + 1); // 或 setCount(count + 1)
  5. }, [dep]);
  6. useEffect(() => {
  7. if (count > 1) {
  8. fn();
  9. }
  10. }, [count, fn]);
  11. };
  12. export default useUpdate;
  • componentWillUnmount

    1. useEffect(() => {
    2. console.log('componentDidMount');
    3. return () => {
    4. console.log('componentWillUnmount')
    5. }
    6. })
  • shouldComponentUpdate:使用 React.memo, useMemo 解决

  • constructor:函数执行时相当于 constructor
  • render:函数返回值就是 render 的返回值