React hooks篇 useEffect useState useCallbak useMemo

目录

useState

useEffect

useCallback

useMemo


useState

useState有的有一个入参,可以是数据或者一个带有返回值的函数,对应类型

function useState<S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>]

useState有两种创建方式

第一种 在参数里直接传入一个数据

const [num, setNum] = useState(1);

第二种 在参数里使用函数必须return返回一个值,可以调用在useState注册之前的函数

const [num, setNum] = useState(() => {
  return 2+2;
});

修改state状态时也有两种方式 注意 useState的修改会在把当前操作里的setState放到一起执行

第一种 这种方式当前函数num拿到的值永远是1,因为setState会在当前操作结束后统一执行

const [num, setNum] = useState(1);
function fun () {
    setNum(num + 1) // 2
    setNum(num + 1) // 2
};
fun();

第二种 当setState是一个函数时,函数的参数则是改state上一次修改之后的值

const [num, setNum] = useState(1);
function fun () {
    setNum(num + 1) // 2
    setNum((state)=> { // 2
        return state + 1 // 3
    }) 
};
fun();

useEffect

useEffect 有两个入参,第一个参数是一个函数,第二个参数可选,需要是数组,对应类型

function useEffect(effect: EffectCallback, deps?: DependencyList): void

useEffect的功能类似生命周期,但react开发团队不支持把useEffect当作生命周期来使用,后续react团队可能会淡化的完善useEffect的功能

当第二个参数为空的时候,组件发生任何的state或props等改变时都会触发第一个参数的函数

当第二个参数为空数组的时候,只会在组件初始化执行一次

当第二个参数为数组,并且里面有监听数据的时候,在对应数据发生改变时和初始化的时候,都会触发一次参数一的函数

当参数一的函数有return返回一个函数时,在组件注销阶段会调用该函数

useEffect(() => {
  console.log('初始化');
  return () => {
    console.log('注销拉')
  }
}, [])

useCallback

useCallback是一个性能优化的hook,有两个参数,通useEffect,但第二个参数是必选,类型如下

function useCallback<T extends Function>(callback: T, deps: DependencyList): T

当组件mount时会注册组件内部的函数,useCallback会把当前函数的参数一给缓存下来,包括但不限于函数内容使用到的state状态等,当参数二监听的数据没有修改时,在update的时候不会重新注册该函数

const [num, setNum] = useState(0);
const [count, setCount] = useState(0);

const fun = () => {
  setCount(count + 1);
  return count + 1;
}

const clickHandle = useCallback(() => {
  console.log('count', count, 'num', num, 'fun', fun());
  // 1.当num没有改变时触发该函数结果是 0 0 1 fun改变了count,并且返回count + 1所以fun是1
  // 2.当count改变再触发该函数结果是 0 0 1 count改变了,但是因为num没有改变,这里使用的还是老数据,
  // 3.当num改变再触发改函数结果是 2 1 3 num改变了,此时count是2,但fun调用了,所以fun是3
}, [num])

return (
  <div>
    <div>num: {num}</div>
    <div>count: {count}</div>
    <button onClick={() => setNum(num + 1)}>num + 1</button>
    <button onClick={() => setCount(count + 1)}>count + 1</button>
    <button onClick={clickHandle}>触发click</button>
    <button onClick={fun}>触发fun</button>
  </div>
)

useMemo

useMemo是一个性能优化的hook,有两个参数,通useEffect,但第二个参数是必选,类型如下

function useMemo<T>(factory: () => T, deps: DependencyList | undefined): T

useMemo相当于是一个监听部分数据自修改的state,当组件mount时会注册组件内部的函数,useMemo会把当前函数的参数一return的值给缓存下来,包括但不限于函数内容使用到的state状态等,当参数二监听的数据没有修改时,在update的时候不会重新计算改函数

const [num, setNum] = useState(1);
const [count, setCount] = useState(1);


const memoNum = useMemo(() => {
  return num + count
}, [num])

return (
  <div>
    <button onClick={() => setNum(num + 1)}>num + 1</button>
    <button onClick={() => setCount(count + 1)}>count + 1</button>
    memoNum的值是: {memoNum}
    // mount加载完成结果是 2
    // count改变 2
    // num改变 4
  </div>
)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值