我正在尝试使用react Hook(这是我第一次(,但在使用像上面的组件DidMount一样的useEffect时遇到了这个错误:"react Hook useEffect缺少依赖项:"props"。请将其包括在内或删除依赖项数组。但是,当任何道具时,"道具"都会发生变化更改,因此首选的修复方法是在useEffect调用之外销毁"道具"对象,并引用useEffect 中的特定道具
我正在尝试向API发出GET请求,这需要在url中使用一些道具。这是我的代码:
function SomeComponent(props) {
const [data, setData] = useState({});
const [loading, setLoading] = useState(true);
const [hasError, setErrors] = useState(false);
useEffect(() => {
async function fetchData() {
try {
let response = await Axios.get( `/some-url/${props.obj.id}/abc`,
);
let { data } = response.data;
setData(data);
setLoading(false);
props.totalStats({data });
} catch (error) {
setErrors(error);
setLoading(false);
}
}
fetchData();
}, []);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
我一直在寻找并尝试这些解决方案,但它们对我不起作用:
const { id } = props.obj.id;
const {totalStats} = props.totalStats
useEffect(()=>{
//Here is the code
//I replace the $ {props.obj.id} by the id and the function props.totalStats by //totalStats
},[id,totalStats]
通过这种方式,我在id和函数调用中获得了一个未定义的值。
然后我试着这样做:
useEffect(()=>{
//here is the code like the first one
},[props])
但这使得向api 发出n个请求
从常量导入中删除大括号。
所以它应该看起来像这样:
function SomeComponent(props) {
const objId = props.obj.id;
const totalStats = props.totalStats;
const [data, setData] = useState({});
const [loading, setLoading] = useState(true);
const [hasError, setErrors] = useState(false);
useEffect(() => {
async function fetchData() {
try {
let response = await Axios.get( `/some-url/${objId}/abc`,
);
let { data } = response.data;
setData(data);
setLoading(false);
totalStats({data });
} catch (error) {
setErrors(error);
setLoading(false);
}
}
fetchData();
}, [objId, totalStats]);
}
答案已经被接受,但只是为了澄清为什么OP的解决方案一开始就不起作用,而不是分配常量。这是因为OP在破坏属性时犯了一个错误。正确的方法:
const { id } = props.obj;
const {totalStats} = props
请注意,我没有放置props.object.id
或props.totalStats
。因为如果你放了这些,你实际上是在试图从props.object.id
对象中破坏id
。CCD_ 5和CCD_。没有这样的属性,所以OP得到了未定义的错误。
您还可以从props对象中指定一个常量作为接受答案的方式。这实际上是一回事。