作用:指定一个副效应函数,组件每渲染一次,该函数就自动执行一次。组件首次在网页 DOM 加载后,副效应函数也会执行。
理解:类似vue的mounted钩子,是一个通用的副效应钩子
用法:
useEffect
的返回值是一个可用于清理副作用效应的函数,在组件卸载时,执行该函数。如果不需要清理副效应,useEffect()
就不用返回任何值。注:
如果有多个副效应应该调用多个useEffect
示例:
import React, { useEffect } from 'react';
function effectDemo(props:any) {
useEffect(() => {
const timer = setTimeout(()=>{
console.log(props.id)
},1000)
return () => {
clearTimeout(timer);
};
}, [props.id]);
return Hello, {props.name}
;
}
作用:useState
会返回一对值:当前状态和一个让你更新它的函数,他的唯一的参数就是初始 state
用法示例:
import React, { useEffect, useState } from 'react'
function demo(props: any) {
const [name, setName] = useState('zwf')
useEffect(() => {
console.log(name, '---name')
}, [name])
const handerChangeName = () => {
setName('zwf_')
}
return (
<>
{name}
>
)
}
export default demo
作用:返回一个被缓存的函数,当依赖项改变时才会更新
注:依赖项数组不会作为参数传给回调函数。
用法示例:
import React, { useCallback, useEffect, useState } from 'react'
function demo(props: any) {
const [name, setName] = useState('zwf')
useEffect(() => {
console.log(name, '---name')
}, [name])
const memoizedCallback = useCallback(
(count) => {
return count
},
[name],
);
const handerChangeName = () => {
setName('zwf_')
console.log(memoizedCallback(1)) // 1
}
return (
<>
{name}
>
)
}
export default demo
作用:返回一个被缓存的值,当依赖项改变时才会更新
用法示例:
import React, { useCallback, useEffect, useMemo, useState } from 'react'
function demo(props: any) {
const [name, setName] = useState('zwf')
const memoValue = useMemo(() => {
return name + '真帅'
}, [name])
const handerChangeName = () => {
console.log(memoValue)
}
return (
<>
{name}
>
)
}
export default demo
作用:返回一个可变的 ref 对象,其 .current
属性被初始化为传入的参数。返回的 ref 对象在组件的整个生命周期内保持不变。
理解:类型vue中的refs。返回ref绑定的dom元素
用法示例:
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
function demo(props: any) {
const [name, setName] = useState('zwf')
const inputEl: React.RefObject = useRef(null)
const handerChangeName = () => {
inputEl.current?.focus()
console.log(inputEl.current) //
}
return (
<>
{name}
>
)
}
export default demo
作用:useImperativeHandle
可以让你在使用 ref
时自定义暴露给父组件的实例值。
注:useImperativeHandle
应当与 forwardRef
一起使用
用法示例:
// 子组件
import React, { forwardRef, useImperativeHandle, useRef } from 'react'
function demo(props: any, ref: React.Ref | undefined) {
const inputEl: React.RefObject = useRef(null)
useImperativeHandle(ref, () => ({
focus() {
inputEl.current?.focus();
}
}));
return (
<>
>
)
}
export default forwardRef(demo)
父组件
// ==================
// 所需的所有组件
// ==================
import React, { FC, useRef } from "react";
import Demo from './demo'
// ==================
// CSS
// ==================
import "./index.less";
// ==================
// 类型声明
// ==================
import { Meeting } from "./index.type";
const MeetingPageContainer: FC = (): JSX.Element => {
const tableRef: React.RefObject = useRef(null);
const onSearch = (value: string) => {
tableRef.current?.focus()
};
return (
<>
>
);
};
export default MeetingPageContainer;