在不创建无限重新渲染的情况下解决 ESLint 详尽问题
Solve ESLint exhaustive without creating infinite re-renders
所以我最近添加了 ESLint,我对 hooks 有点陌生。
但是这个 useEffect
钩子有问题,因为 ESLint 要我发送 values
,我在 setValues
中使用它,但是如果我发送值,我会陷入无限循环,虽然如果我不这样做,但我会收到此警告,我认为必须有一种方法可以在不禁用它的情况下解决这个问题?
useEffect(() => {
const initCategories = () => {
getCategories().then((data) => {
if (data.error) {
setValues({ ...values, error: data.error });
} else {
const categoryOptions = createOptions(data);
setCategories(categoryOptions);
}
});
};
const initTags = () => {
getTags().then((data) => {
if (data.error) {
setValues({ ...values, error: data.error });
} else {
const tagOptions = createOptions(data);
setTags(tagOptions);
}
});
};
const formData = new FormData();
if (body) {
formData.set('body', body);
}
setValues({ ...values, formData });
initCategories();
initTags();
}, [body, values]);
因为我真的不想让它在每次 values
更改时都重新运行
您可以在设置状态时使用functional update。
setValues(prev => ({...prev, error: data.error}))
因此,在这种情况下,linter 不会警告您,您可以更新您的状态。实际上,无论有无 linter,如果您使用的是当前状态,这应该是您更新状态时的方式。
所以我最近添加了 ESLint,我对 hooks 有点陌生。
但是这个 useEffect
钩子有问题,因为 ESLint 要我发送 values
,我在 setValues
中使用它,但是如果我发送值,我会陷入无限循环,虽然如果我不这样做,但我会收到此警告,我认为必须有一种方法可以在不禁用它的情况下解决这个问题?
useEffect(() => {
const initCategories = () => {
getCategories().then((data) => {
if (data.error) {
setValues({ ...values, error: data.error });
} else {
const categoryOptions = createOptions(data);
setCategories(categoryOptions);
}
});
};
const initTags = () => {
getTags().then((data) => {
if (data.error) {
setValues({ ...values, error: data.error });
} else {
const tagOptions = createOptions(data);
setTags(tagOptions);
}
});
};
const formData = new FormData();
if (body) {
formData.set('body', body);
}
setValues({ ...values, formData });
initCategories();
initTags();
}, [body, values]);
因为我真的不想让它在每次 values
更改时都重新运行
您可以在设置状态时使用functional update。
setValues(prev => ({...prev, error: data.error}))
因此,在这种情况下,linter 不会警告您,您可以更新您的状态。实际上,无论有无 linter,如果您使用的是当前状态,这应该是您更新状态时的方式。