React Hook


Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。

Hook的使用规则

  Hook 就是 JavaScript 函数,但是使用它们会有两个额外的规则:

  1. 只能在函数最外层调用 Hook。不要在循环、条件判断或者子函数中调用。

  2. 只能在React 的函数组件中调用 Hook。不要在其他 JavaScript 函数中调用。(还有一个地方可以调用 Hook —— 就是自定义的 Hook 中。)

1. useState

    使函数组件具备了state,可以获取并修改指定state

 const [state,setState] = useState(initstate)

 - state 状态    - setState 修改该状态的方法       - setState useState 返回的setState ,不具备浅合并,需要手动合并(例如把其他的state解构进来)    - initstate state 的初始值
function Example() {
  // 声明一个叫 "count" 的 state 变量 
const [count, setCount] = useState(0); return ( > >You clicked {count} times>
  1. 关联节点实例   2. 用来记录组件更新前的一些数据(在useEffect的例子中用到)
 
function TextInputWithFocusButton() {
  const inputEl = useRef(null);
  const onButtonClick = () => {
    // `current` 指向已挂载到 DOM 上的文本输入元素
    inputEl.current.focus();
  };
  return (
    <>
      ref={inputEl} type="text" />
      




3. useEffect
  在函数组件中执行副作用操作




// 记录组件更新前的一些数据
  const isMount = useRef(true);    // 执行的生命周期 componentDidMount componentWillUnmount   useEffect(()=>{       console.log("组件挂载完执行");       return ()=>{         console.log("组件即将卸载执行");       }   },[]);    // componentDidMount componentDidUpdate   useEffect(()=>{     console.log("组件挂载完或更新完都执行");   })     // componentDidMount componentDidUpdate(nub更新)   useEffect(()=>{     console.log("组件挂载完或nub有变化引起的更新更新完都执行");   },[nub]);     // componentDidUpdate componentDidMount (组件第一次挂载完成执行,之后不执行)   useEffect(()=>{     if(!isMount.current){       console.log("组件更新完成");     } else {       console.log("mounted");       isMount.current = false;     }   })