[英]useEffect throw warning for dependecy
我有一個具有受控狀態的下拉菜單。 如果用戶更改了下拉值,並且輸入不為空,則觸發從其他組件傳遞的函數。
export default ({ triggerChange, inputVal }) => {
const [dropdown, setDropdown] = useState(1);
useEffect(() => {
if (inputVal) {
triggerChange(dropdown);
}
}, [dropdown]); // this line throw a warning
const handleChange = e => {
setDropdown(e.target.value);
};
return (
<div>
<select onChange={handleChange}>
<option value="1">1</option>
<option value="2">2</option>
</select>
</div>
);
};
錯誤
React Hook useEffect缺少依賴項:“ inputVal”和“ triggerChange”。 包括它們或刪除依賴項數組。 如果'triggerChange'更改過於頻繁,請找到定義它的父組件並將該定義包裝在useCallback中。 (反應鈎/詳盡-DEPS)
將它們添加到依賴項中:
useEffect(() => {
if (inputVal) {
triggerChange(dropdown);
}
}, [dropdown, inputVal]);
僅當dropdown
或inputVal
值更改時,才會重新運行效果。
對於triggerChange
:
如果dropdown
經常更改,請使用useCallback
掛鈎。
// Parent.js
const memoizedTriggerChange = useCallback(
() => {
triggerChange(dropdown);
},
[dropdown],
);
useEffect(() => {
if (inputVal) {
memoizedTriggerChange();
}
}, [inputVal]);
編輯
基於操作碼和框
// index.js
const triggerChange = useCallback(() => {
console.log("call api");
}, []); // not depending on inputVal to prevent firing if inputVal changes
// AnotherComp.js
useEffect(() => {
triggerChange(dropdown);
}, [dropdown, triggerChange]);
useEffect(() => {
if (inputVal) {
triggerChange(dropdown);
}
}, [dropdown]); // this line throw a warning
在這段代碼中,如果您注意到, inputVal
, triggerChange
和dropdown
是變量,它們是useEffect掛鈎的依賴項,因為只要對上述任何依賴項進行任何更改,都會觸發useEffect。
為了滿足useEffect掛鈎的基本工作原理,我們應該在useEffect的array參數中傳遞這些依賴關系。
useEffect(() => {
if (inputVal) {
triggerChange(dropdown);
}
}, [dropdown, triggerChange, inputVal]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.