[英]How to fix missing dependency warning when using useEffect React Hook
[英]fix missing dependency warning when missing an object in useEffect React Hook?
所以我得到了一个页面,其中包含一系列基于以下值的开关:
const [values, setValues] = useState({
asthma: "off",
infectiousDisease: "off",
bleedingDisorder: "off",
cancer: "off",
diabetes: "off",
epilepsy: "off",
hivAids: "off",
stroke: "off",
heartDisease: "off",
hbp: "off",
immuneDisorders: "off",
lungDisease: "off",
mentalDisorder: "off",
rheumaticDisease: "off",
smokeTobaccoProducts: "off",
radiationTherapy: "off",
eatingDisorders: "off",
entDisorders: "off",
latex: "off",
localAnasthetics: "off",
metals: "off",
penicillin: "off",
pollen: "off",
foods: "off",
bleedingGums: "off",
bruxism: "off",
halitosis: "off",
ulcer: "off",
dryMouth: "off",
soreJawM: "off",
});
现在,当用户访问此页面时,我希望根据保存在后端的内容来设置值。 后端返回一个包含值的数组,我将它们设置在 useEffect() 中。 但是我只希望这种情况发生一次。 这是从 spring 后端设置值的代码。
useEffect(() => {
getDoH().then(
(response) => {
let newValues = values;
let valueArray = Object.entries(newValues).map((v, index) => {
v[1] = response.data.switchValues[index]
return v
});
newValues = Object.fromEntries(valueArray);
setValues({...newValues});
},
(error) => {
console.log(error);
}
);
},[]);
getDoH function 只是一个 axios.get 请求。 function 工作正常,但是我在终端中收到此警告:“第 142:5 行:React Hook useEffect 缺少依赖项:'values'。包括它或删除依赖项数组 react-hooks/exhaustive-deps”
现在我知道我可以禁用它,但有没有办法修复它? 将值添加到 },[]); 不是一个选项,因为我不希望它在每次更改开关时都运行,因为这基本上会使开关不起作用。
有什么建议么?
您可以将setValues()
传递给 function,它会根据之前的 state 更新 state。 function 采用以前的 state 并返回新的 state。 这样,您不必引用在useEffect()
挂钩之外定义的values
。
例如,
useEffect(() => {
setValues((state) => generateNewStateFromPrev(state));
}, []);
这是关于 this 的文档。
您可以将 object 存储为 const 而不是 state,这也会使您的代码更清晰。 从代码的含义来看, react-hooks/exhaustive-deps
是正确的,您想要运行取决于该values
state 的 function。 因此,在一般情况下,如果values
更改并且效果取决于它,您最终会得到不一致的 state。
但是您的意图是代码不依赖于 state,而是依赖于它的初始值。 你可以做这样的事情。
const defaultIllnesses = {asthma: "off", infectiousDisease: "off",...};
function myComp () {
const [values, setValues] = useState(defaultIllnesses);
useEffect(() => {
getDoH().then(
(response) => {
const valueArray = Object.entries(defaultIllnesses)
...
}, [defaultIllnesses]); // this const is still a dependency, but it won't change
有一些变体,比如将疾病作为数组['asthma', 'infectiousDisease', ...]
但这只是语法糖。 您还可以查看 Array.reduce 以遍历 arrays 并从中创建 object 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.