react-hook的学习(常用的useState,useEffect,useRef,useMemo)

useState

返回一个 state,以及更新 state 的函数。

在初始渲染期间,返回的状态 (state) 与传入的第一个参数 (initialState) 值相同。

setState 函数用于更新 state。它接收一个新的 state 值并将组件的一次重新渲染加入队列。
函数式更新
如果新的 state 需要通过使用先前的 state 计算得出,那么可以将函数传递给 setState。该函数将接收先前的 state,并返回一个更新后的值。下面的计数器组件示例展示了 setState 的两种用法:

import { useState, useEffect,useMemo,useRef } from 'react';
const [state, setState] = useState('初始值');
function Demo() {
  return (
    <div>
      <button onClick={(e) => setState("我的值改变了")}>
        click Me! {state}
      </button>
      <button onClick={(e) => setState("123")}>
        click Me! {state}
      </button>
    </div>
  );
}

总结:暂时没想好怎么写总结
使用技巧:暂时只意会

useEffect

监听第二个参数[]的state的变化,执行第一个参数
useEffect第二个参数为空数组的时候,相当于componentDidMount
useEffect在第一个参数(函数主体里return相当于componentWillUnmount)

import { useState, useEffect } from 'react';
import moment from 'moment';

const DateTime = () => {
    const [time, settime] = useState(moment(Date()).format('YYYY - MM - DD : HH:mm:ss'));
    let timer=0;
    useEffect(() => {
        timer=setInterval(() => {
            settime(moment(Date()).format('YYYY - MM - DD : HH:mm:ss'))
        }, 1000);
        return ()=>{
            clearInterval(timer)
        }
    }, []);
    return time
};

export default DateTime;

总结:

  • 如果在第一个参数里存在定时器记得在return的时候清除掉,不清除掉会抱错

devScripts.js:5035 Warning: Can’t perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.

  • 函数名字首字母记得大写否则会报这个错

“useEffect” is called in function “dateTime” that is neither a React function component nor a custom React Hook

  • useEffect监听变量的时候,初始值也会监听到,所以,做个判断,可以减少一次不必要的渲染
    useEffect(() => {
        if(state){
        	console.log(state,'state')
       	}
    }, [state])
  • 监听多个变量的时候,任意一个变量发生变化都会执行

useRef

useRef 返回一个可变的 ref 对象,其 .current 属性被初始化为传入的参数(initialValue)。返回的 ref 对象在组件的整个生命周期内保持不变。

一个常见的用例便是命令式地访问子组件:

function TextInputWithFocusButton() {
  const inputEl = useRef(null);
  const onButtonClick = () => {
    // `current` 指向已挂载到 DOM 上的文本输入元素
    // 使输入框获得焦点
    inputEl.current.focus();
  };
  return (
    <>
      <input ref={inputEl} type="text" />
      <button onClick={onButtonClick}>Focus the input</button>
    </>
  );
}

useRef还有一种用法就是可以避免拿不到最新的state

import React, { useEffect, useState, useRef } from "react";
function Demo(){
	const numRef = useRef();
	const [num, changeNum] = useState(1);
   function  submit(){
		console.log(`现在的数字是: ${numRef.current}`)
	}
	useEffect(() => {
	  numRef.current = num;
	}, [num]);
}

useMemo

大概就是使用最新的数据,返回新的Dom节点
使用的时候就像state一样使用 {变量名} 就可以了
好处:
可以避免不必要的重复渲染,也不怕拿不到最新的数据去渲染
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值