reactjs - 当依赖项需要用户输入时,避免“useEffect”在挂载时获取数据
问题描述
React 钩子useEffect
在组件挂载时运行。但是,如果效果依赖于用户输入,则效果的挂载执行是多余的。那么对依赖项运行验证然后相应地执行钩子是否可以接受?
useEffect(() => {
const fetchDogImage = async () => {
const dogImage = await axios
.get(`https://dog.ceo/api/breed/${breed}/images/random`)
.then(response => response.data.message);
setDogImage(dogImage);
};
// This avoids fetching dog image on mount - user hasn't searched for a dog breed, yet.
// Is this an acceptable pattern?
if (breed !== '') {
fetchDogImage();
}
}, [breed]);
解决方案
是的,我认为可以检查以防止第一次运行。此外,您也可以使用 Debouce来防止您的搜索过于频繁。例如
function useDebounce(value, delay) {
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(
() => {
const handler = setTimeout(() => {
setDebouncedValue(value);
}, delay);
return () => {
clearTimeout(handler);
};
},
[value, delay],
);
return debouncedValue;
}
function App() {
const [dogImage, setDogImage] = useState('');
const [breed, setBreed] = useState('');
const debouncedValue = useDebounce(breed, 1000);
useEffect(() => {
const fetchDogImage = async () => {
const dogImage = await axios
.get(`https://dog.ceo/api/breed/${debouncedValue}/images/random`)
.then(response => response.data.message);
setDogImage(dogImage);
};
if (debouncedValue !== '') {
fetchDogImage();
}
}, [debouncedValue]);
return (
...
);
}
推荐阅读
- python - 在 Python 中解析文本文件
- mongodb - 是否有日志去检查谁进行了 mongodb 事务?
- python - 将生成的图形复制到 Networkx 中的另一个图形中
- acumatica - 联系 PXSelector 未正确显示 DisplayName
- javascript - 如何在使用 Javascript 提交之前调整 Django Imagefield 中的图像大小
- android - Nativescript Vue Actionbar 复制 Android
- php - Slim 3.11 可调用解析器类型错误
- python - 如何计算每个像素值的平均值?
- python - 数独验证阻止任何移动尝试
- sql - 具有相似名称的表的多对多关系表名称