React 函数组件

74 阅读1分钟

函数组件

import React, { useState } from 'react';
import './App.css';

const App = props => {
  const [n,setN] = React.useState(0)
  const onClick = ()=>{
    setN(n+1)
  }
  return (
    <div>
      {n}
      <button onClick={onClick}>+1</button>
    </div>
  );
}

export default App;

函数组件模拟生命周期

使用useEffect

  • 模拟componentDidMount
useEffect(() => {
    console.log("use effect");
  }, []); //[]只在第一次渲染的时候调用
  • 模拟componentDidUpdate
useEffect(() => {
    console.log("n或者m 变了");
  }, [n,m]);
  • 模拟componentWillUnmount
const App = (props) => {
  const [childVisible, setChildVisible] = useState(true);
  const hide = () => {
    setChildVisible(false);
  };
  const show = () => {
    setChildVisible(true);
  };
  return (
    <div>
      {childVisible ? (
        <button onClick={hide}>hide</button>
      ) : (
        <button onClick={show}>show</button>
      )}
      {childVisible ? <Child /> : null}
    </div>
  );
};

const Child = (props) => {
  useEffect(()=>{
    return ()=> {
      console.log('Child销毁了');
    }
  })
  return <div>Child</div>;
};
  • constructor 函数组件执行的时候,就相当于constructor

  • shouldComponentUpdate React.memo 和 useMemo

  • render

自定义Hook之useUpdate

import { useEffect, useState } from "react";
const useUpdate = (fn, array) => {
  // const [nUpdateCount, setNUpdateCount] = useState(0);
  const [count, setCount] = useState(0);
  useEffect(() => {
    setCount((x) => x + 1);
  }, array);
  useEffect(() => {
    if (count > 1) {
      console.log("count", count);
      fn();
    }
  }, [count]);
};
export default useUpdate;
import React, { useEffect, useState } from "react";
import "./App.css";
import useUpdate from "./useUpdate";


const App = (props) => {
  const [n, setN] = useState(0);
  const onClick = () => {
    setN(n + 1);
  };

  
  useUpdate(() => {
    console.log("变了");
  }, [n]);

  return (
    <div>
      {n}
      <button onClick={onClick}>+1</button>
    </div>
  );
};

export default App;