reactjs - 在 reactjs 中,单个组件中的多个 api 调用由于状态更改而导致不必要的渲染
问题描述
const [MusicData, setMusicData] = useState(null)
const [TopArtistsdata, setTopArtists] = useState(null)
const getMusic = async () =>{
try {
const response = await axios.get(URL)
setMusicData(response.data)
} catch (error) {
console.log("error fetching data")
}
}
const getTopArtists = async () =>{
try {
const responseOfArtists = await axios.get(URL)
setTopArtists(response.data.artists.data)
} catch (error) {
console.log(error,"error fetching data")
}
}
useEffect(() => {
getMusic()
getTopArtists()
}
}, [])
我将这两种状态传递给两个子组件。第一个加载但第二个显示错误,因为它在第一次渲染中为空。Console.log(TopArtistsdata) 两次显示“null”,第三次获取数据。所以从技术上讲,父组件正在重新渲染 3 次。第 2 次第 2 次状态为空。我不明白问题出在哪里。
解决方案
下面列出了三个渲染的原因:
- 初始渲染(第一次渲染初始值,即 null)
- 让我们假设 getMusic 调用成功,然后它将执行 setState(第二次渲染,MusicData 具有值,TopArtistsdata 为空)
- 现在,如果 getTopArtists 成功,那么它将再次渲染(#rd 渲染,MusicData 具有价值,TopArtistsdata 具有价值)
如果您不想让子组件出现错误,请将初始值与子组件的预期保持在状态内。
如果您有两个状态变量,则需要重新渲染。您可以最小化使用 promise.all
推荐阅读
- apache - 如何为不同的域做 RewriteRule
- javascript - 与运行 New React App 相关的问题
- javascript - 当特定 props 元素发生更新时,React Hooks 会更新状态元素
- css - 如何在所有按钮中设置标准角色
- php - PHP 计算中的值四舍五入到最接近的 1
- c# - WPF 设置单元格填充折叠 DataGrid 的列
- angular - 从 Outlook 日历 API 获取 oauth2 代码
- sql - 将输出拆分到 Hive 中的多个文件
- c++ - 为什么我的 ListBox 中仍然有字符串,即使在使用循环单独删除它们之后?
- unit-testing - 软件测试中“正确性”一词的意义是什么?