useEffect是React中的一个钩子函数,用于处理副作用操作。副作用是指在组件渲染过程中,可能会对外部环境产生影响的操作,比如数据获取、订阅事件、操作DOM等。
useEffect接受两个参数:一个是副作用函数,另一个是依赖数组。
useEffect(() => {
// 副作用函数
// 在组件渲染时执行
// 可以进行副作用操作
}, [依赖数组]);
二个参数的传值有以下几种情况,决定页面render的时机,dom操作
useEffect不传递第二个参数会导致每次渲染都会运行useEffect。然后,当它运行时,它获取数据并更新状态。然后,一旦状态更新,组件将重新呈现,这将再次触发useEffect,通常我们是不希望它一直刷新的。
useEffect(()=>{
console.log(props.number)
setNumber(props.number)
}) //所有更新都执行
//仅在挂载和卸载的时候执行
useEffect(()=>{
console.log(props)
},[])
//count更新时执行
useEffect(()=>{
console.log(count)
},[count])
//监听props对象number的更改
const Asynchronous : React.FC=({number})=>{
const [number2,setNumber2] = useState(number);
useEffect(()=>{
console.log(number)
setNumber2(number)
},[number,setNumber2]) //监听props对象number的更改
//setNumber2是useState返回的setter,所以不会在每次渲染时重新创建它,因此effect只会运行一次
}
// 组件销毁的时候、用来取消订阅、清除定时器
const timer = setInterval(() => {
setCount(count + 1)
}, 1000)
// useEffect方法的第一个参数是一个函数,函数可以return一个方法,这个方法就是在组件销毁的时候会被调用
useEffect(() => {
return () => {
clearInterval(timer)
}
}, [])
// 刚进入界面进行数据请求,不过常在componentDidMount中加载数据
// 副作用函数可以是一个异步函数,可以在其中进行异步操作,比如数据获取
useEffect(() => {
const fetchData = async () => {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
};
fetchData();
}, []);
const [data, setData] = useState({ name: 'John' });
// 错误示例:修改对象属性,但引用未变化
setData({ ...data, age: 20 }); // useEffect无法感知到属性的变化
// 正确示例:修改对象属性,引用发生变化
setData(prevData => ({ ...prevData, age: 20 })); // useEffect会感知到属性的变化
const [count, setCount] = useState(0);
// 闭包变量 错误示例
const handleClick = () => {
setCount(count + 1);
};
// 函数式更新 可以被监听变化
const handleClick = () => {
setCount(prevCount => prevCount + 1);
};
useEffect(() => {
console.log(count); // 每次渲染都会获取最新的count值
}, [count]); // 无法感知到闭包变量的变化
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(count + 1);
};
// 错误示例:将函数作为依赖数组元素
useEffect(() => {
console.log(count);
}, [handleClick]); // 每次渲染都会重新执行副作用函数
// 如果您希望避免在每次渲染时都重新执行副作用函数,可以将函数定义在useEffect的外部,并在副作用函数中引用该函数.
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(count + 1);
};
// 正确示例:在副作用函数中引用函数
useEffect(() => {
const handleEffect = () => {
console.log(count);
};
handleEffect();
}, [count]); // 只在count发生变化时执行副作用函数
// 或者使用useCallback包裹函数
const handleEffect = useCallback(() => {
console.log(count);
}, [count]);
useEffect(() => {
handleEffect();
}, [handleEffect]);