reactjs - 当 url 参数未更改时,React 防止重新获取
问题描述
我有一个ExperienceList
组件可以获取mount
. 当用户单击一种特定体验,然后导航回ExperienceList
. 目前,fetch
每次都制作一个。
我想做一个简单的检查,看看cityname
from是否url params
与cityname
在redux store
. 如果相同,则绕过获取。如果没有,那就去做吧。这是我尝试过的两种方法,但没有运气:
第一种方法
useEffect(() => {
if (props.match.params.cityname !== list[0].city) {
readList(apiRequestParams)
}
}, [])
使用上述方法,我得到控制台错误:
无法读取未定义的属性“城市”。
我不能 100% 确定为什么 list 不可用,因为我可以将它记录到控制台。这是第二种方法:
useEffect(() => {
readList(apiRequestParams)
}, [props.match.params.cityname])
这种方法也不起作用,但我更困惑为什么会这样。据我了解,出现在dependencies array
of中的变量useEffect
将导致function
执行当且仅当它们在function
调用之间不同时。在这种情况下,我可以保证props.match.params.cityname
在 2 个不同的渲染之间是相同的,但每次都会进行一次提取。
关于如何优化此过程的任何见解?
解决方案
函数readlist其实就是useEffect的dep,你要告诉useEffect。或者您可以将其更改为 cityname 参数。
const [cityName, setcityName] = useState('cityname');
useEffect(() => {
function getFetchUrl() {
return 'https://...' + cityName;
}
async function fetchData() {
const result = await readList(getFetchUrl());
setData(result.data);
}
fetchData();
}, [cityName]);
或者
const fetchData = useCallback(() => {
readList("https://" + cityName);
}, [cityName]);
useEffect(() => {
fetchData()
},[fetchData])
推荐阅读
- mysql - 自定义快速验证器
- node.js - 使用 nodejs 在 GCloud Postgres SQL 中连接
- java - Selenium,Java,if-else 语句无法正常工作,NoSuchElementException
- c++ - 自定义 QTreeWidget 的子指示器
- css - 在本地网页上找不到图像和字体 (404)
- php - 将图像保存在数据库中并在视图 laravel 5.6 中显示
- javascript - 在 textarea 中输入的 HTML 代码未保存在数据库中
- javascript - 你可以在mixpanel中有子属性吗?
- macos - macOS WindowServer 和 CoreGraphics API 使用
- google-apps-script - Google Script for Sheets:设置多个过滤器