【发布时间】:2021-10-24 05:58:47
【问题描述】:
我正在尝试调用 reddit API。帖子标题正在显示,但我希望它们在我的查询更改时重新呈现。我只想知道当我的状态发生变化时(也就是我的查询)如何调用方法。我正在使用 react 中的 useEffect 来执行此操作,但每当组件中发生任何更改时都会调用它,从而导致它多次调用该方法来获取帖子。我只想在查询更改时获取帖子。
import React, { useEffect, useState } from 'react';
import { useSelector, useDispatch } from 'react-redux';
function Results()
{
const query = useSelector(state => state.query);
const results = useSelector(state => state.results);
const dispatch = useDispatch();
let fetchResults = () =>
{
let postTitles = [];
let postSrcs = [];
fetch('https://www.reddit.com/r/' + query + '.json')
.then(response => response.json())
.then(body => {
for (let i = 0; i < body.data.children.length; ++i) {
if (body.data.children[i].data.post_hint === 'image')
{
let img_url = body.data.children[i].data.url_overridden_by_dest;
postSrcs.push(img_url);
}
let title = body.data.children[i].data.title;
postTitles.push(title);
}
dispatch({type: "QUERY_RESULTS", payload: postTitles})
}).catch((err) => {
console.log(err)
});
}
useEffect(() => {
fetchResults();
console.log("use effect triggered")
})
return (
<>
<h1>Query: {query}</h1>
{ !results
? <h1>No Results</h1>
: results.map(p => <h6> {p} </h6>)
}
</>
)
}
export default Results;
例如在控制台日志中告诉我何时触发使用效果。当我搜索帖子时,触发的使用效果正在叠加。
【问题讨论】:
-
你没有为你的 useEffect 指定一个依赖数组,所以它在每个渲染上运行。将应该触发 useEffect 的变量添加到依赖项数组中。
useEffect(() => {fetchResults();}, [query]);见:Conditionally firing an effect -
添加状态变量you want to check as a dependency to the effect:
useEffect(() => code, [myVar]);
标签: javascript reactjs redux use-effect reddit