react hook 基础属性整理

234 阅读3分钟

1.函数组件定义;

function Header(props) {
  return (
    <div>这是一个函数组件</div>
  )
}
export default Header

2.引入useState及使用;

使用useState来定义及初始化一个状态;使用const定义一个数组,第一个参数是定义的状态,useState里的内容为赋予的值;第二个参数是setXX,用来修改定义的状态;如const [XX, setXX]=useState(""),这就是定义了XX为一个字符串。

import React, {useState} from "React"; //解构引入
function Header(props) {
  const [name, setName] = useState("张三") //name的初始值是“张三”,使用setName("李四")可以进行修改
  return (
    <div onClick={()=>{setName(“李四”)}}>{ name }</div> 
  )
}
export default Header

3.useEffect;

给没有生命周期的组件,添加结束渲染的的信号。在render之后才执行(相当于componentDidMount生命周期)。

import React, { useState, useEffect } from "React"; //解构引入
function Header(props) {
  const [name, setName] = useState("张三");
  //1.useEffect的第一个参数是一个函数;
  //2.每次每个state状态的改变都会触发useEffect的执行,所以需要接收第二个参数,一个依赖数组,只有数组中的state发生改变,才会执行useEffect;
  useEffect(() => {
    console.log(name);
    document.body.addEventListener('a', ()=> {});
    return () => {
      //3.参数的函数中,接收一个return函数,先执行return函数,再执行参数函数本身
      console.log("销毁");
      document.body.removeEventListener('a', ()=> {});//保证只会添加一次事件
    }
  }, [name]) //只有name改变才会触发useEffect重新执行
  return (
    <div onClick={()=>{setName(“李四”)}}>{ name }</div> 
  )
}
export default Header

4.useLayoutEffect;

是dom更新完成后执行的某个操作;相当于componentWillmount。
不同: useLayoutEffect比useEffect先执行: 相同: useLayoutEffect一样,接收两个参数,1.参数函数;2.依赖数组;3.参数函数中也存在一个return函数,先执行return函数,再执行参数函数

import React, { useState, useEffect, useLayoutEffect } from "React"; //解构引入
function Header(props) {
  const [name, setName] = useState("张三");
  useEffect(() => {
    console.log("useEffect")
  }, []) 
  useLayoutEffect(() => {
    console.log("useLayoutEffect")
  }, [])
  return ( 
    <div onClick={()=>{setName(“李四”)}}>{ name }</div> 
  )
}
export default Header

5.useMemo;

import React, { useState, useMemo } from "React"; //解构引入
function Header(props) {
  const [num, setNum] = useState(1);
  //1.接收一个函数作为参数;
  //2.接收一个数组作为依赖列表;
  //3.useMemo返回的是一个值,不是函数
  const doubleNum = useMemo(() => {
    return 2*num
  })
  return ( 
    <div onClick={()=>{setNum((a => a++))}}>{ doubleNum }</div> 
  )
}
export default Header

6.useCallback;

让组件中的函数跟随状态更新;

import React, { useState, useEffect, useCallback } from "React"; //解构引入
function Header(props) {
  const [num, setNum] = useState(1);
  //1.接收一个函数作为参数;
  //2.接收一个数组作为依赖列表;
  //3.useCallback返回的是一个函数,不是值,这也是和useMemo的区别
  const changeNum = useCallback(()=> {
    console.log(“数字加1啦!”)
  }, [num]) //只有num变化的时候才会去打印
  return ( 
    <div onClick={()=>{setNum((a => a++))}}>{ changeNum() }</div> 
  )
}
export default Header

7.useRef;

返回一个子元素索引,此索引在整个生命周期中不会发生改变,对象及属性改变时不会通知,不重新渲染;

import React, { useState, useEffect, useRef } from "React"; //解构引入
function Header(props) {
  //保存一个值,全局都不会改变;
  //重新赋予ref.content,不会发生重新渲染
  const ref = useRef();
  console.log(ref)
  useEffect(() => {
    ref.current = setInterval(()=>{
      num ++
    }, 400)
  }, [])
  useEffect(() => {
    if (num>10)
      clearInterval(ref.current); //取到全局都不会改变的内容,进行清理
  }, [num])
  return ( 
    <div>{ num }</div> 
  )
}
export default Header

8.createContentx和useContext

上层数据发生改变,肯定会触发重新渲染。

//1.引入useContext和createContext;
import React, { useState, useEffect, useContext, createContext } from "React"; //解构引入
//2.通过createContext创建一个context;
const Context = createContext(null);
function Index() {
  const [num, setNum] = useState(1);
  return 
  <div>
    {num}
    <Child1 num={num}></Child1> //正常传参
    <Child2 num={num}></Child2> //正常传参
    //3.使用<Context.Provider></Context.Provider>创建一个数据共享范围
    <Context.Provider value={num}> //4.使用value传递共享数据
      //共享数据范围
      <Child1></Child1> 
      <Child2></Child2>
    </Context.Provider>
  </div>
}

function Child1(props) {
  //5.在子组件中使用useContext来接收数据
  const num = useContext(Context);//就可以接收并使用num啦
  return <div>child1:{props.num}</div>//props.正常接参
}
function Child2(props) {
  return <div>child2:{props.num}</div>//props.正常接参
}

9.useReducer;

从其余组件中获取状态。

import React, { useState} from "React";
//1.创建数据仓库store和分发者reducer
const store = {
  num: 1
};
const reducer = (state, action)=> {
  switch (action.type) {
    case "changeNum":
    return {
      ...state,
      num: action.num
    }
    defaule: 
    return {
      ...state
    }
  }
}

function Index() {
  //2.使用useReducer(reducer, store)来获取store和dispatch
  const [state, dispatch] = useReducer(reducer, store)
  //3.通过dispatch修改值,使用state.获取值
  return 
  <div onClick={()=>dispatch({
   type: "changeNum",
   num: 10
  })}> 
    {state.mun} 
  </div>
}