javascript - 我已经阅读了 Hooks 上的 React Docs 并且我很困惑。什么时候调用 useEffect Hook 清理函数?
问题描述
说实话,关于何时调用 useEffect 清理函数的反应文档解释令人困惑且通用。他们甚至通过将类心智模型与钩子进行比较来使您更加困惑。基于类的组件与带有钩子的基于函数的组件的工作方式不同。React 会记住你提供给 useEffect 的效果函数,并在刷新对 DOM 的更改后运行它,这是可以理解的。现在如何以及何时调用返回的函数(“清理函数”)?
下面的代码示例:
import React, { useState, useEffect } from 'react';
function FriendStatus(props) {
const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
// Specify how to clean up after this effect:
return function cleanup() {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
});
if (isOnline === null) {
return 'Loading...';
}
return isOnline ? 'Online' : 'Offline';
}
解决方案
从作为第一个参数给出的函数返回的函数useEffect
将在作为第二个参数给出的数组中的任何元素发生更改时调用,或者如果没有给出第二个参数,则在每次渲染时调用,或者当组件被卸载时。
例子
const { useEffect, useState } = React;
function MyComponent({ prop }) {
useEffect(() => {
console.log('Effect!');
return () => console.log('Cleanup!')
}, [prop])
return (
<div>{prop}</div>
);
}
function App() {
const [value, setValue] = useState(0);
useEffect(() => {
setInterval(() => {
setValue(value => value + 1);
}, 1000)
}, [])
return value < 3 ? <MyComponent prop={value} /> : null;
}
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="root"></div>
推荐阅读
- javascript - 图像未在画布上绘制 (HTML5)
- java - java VLCJ NoSuchElementException 创建新的嵌入式媒体播放器组件时
- google-sheets - 带有下拉菜单 + 多个条件的 Google 表格查询
- windows - 使用 CMD 查找和计算出现次数?
- azure - 如何在同一个 Azure Web App Service 中托管多个应用程序?
- sql - 如何处理sql中xml标记之间的前导空格
- docker - 如何删除用于生产和复制的 Docker 卷?
- php - 如何集成 mazzuma 支付网关
- menu - Adobe Illustrator 中的按钮消失了
- postgresql - 获取列值以字符串开头的所有条目 - 当列值包含链接时不起作用