函数式组件更灵活。易拆分、易测试,但简单,没有副作用,需要增强能力——hooks;
// 第二个参数为 [] --> DidMount
// 第二个参数不写-->DidUpdate/DidMount
// useEffect return 一个函数:WillUnMount
useEffect(() => {
// do sth
// 销毁
return () => {
// do sth
}
}, [])
const [count, setConut] = useState(0)
useEffect(() => {
console.log(count);// 0
const timer = setInterval(() => {
setConut(count + 1)
}, 200)
return () => clearInterval(timer)
}, []) // 只执行一次
console.log(count);// 1
useEffect 内部通过 Object.is 判断是否触发更新
Object.is({},{});// false
Object.is([],[]);// false
获取 DOM 节点,ref.current获取值或赋值
上下文
import React,{useContext, useState, createContext} from 'react';
const ParentContext = createContext();
const NameContext = () =>{
return(
)
};
const Child = () => {
const name = useContext(NameContext);
return (
{name}
);
};
export default ParentContext;
useReducer 是 useState 的代替方案,适合复杂的 state 变化;
import { useReducer } from "react";
// reducer计算并返回新的state
function reducer(state, action) {
const { type } = action;
switch (type) {
// do sth
}
}
export default () => {
const [state, dispatch] = useReducer(reducer, { name: "拙慕" });
return (
<>
Hello,{state?.name}
>
);
}
缓存函数、方法
函数式组件,执行完即销毁,无论是组件初始化还是组件更新都会重新执行一次这个函数,获取最新的组件。
// render: 初始化 xx 的值
// re-render:读取 xx 的值
const [xxx,setXxx] = useState(0)
// render: 添加 effect
// re-render:替换 effect,内部函数也会被重新定义
useEffect(() => {
// do sth
}, [])