gpt4 book ai didi

javascript - 将空数组作为第二个参数传递时,React Hook useEffect 缺少依赖项

转载 作者:行者123 更新时间:2023-12-03 07:25:17 32 4
gpt4 key购买 nike

我的功能组件中有以下 useEffect Hook ,我只想使用一次(当组件安装时)以便从 API 加载一些数据:

const Gear = () => {
const [weaponOptions, setWeaponOptions] = useState([
{
key: "0",
label: "",
value: "null"
}
]);
const [weapon, setWeapon] = useState("null");

useEffect(() => {
console.log("Gear.tsx useEffect");

const fetchWeaponsOptions = async (): Promise<void> => {
const weaponsData = await getWeapons();
const newWeaponOptions: DropdownOptionType[] = [
...weaponOptions,
...weaponsData.map(({ id, name }) => {
return {
key: id,
label: name,
value: id
};
})
];
setWeaponOptions(newWeaponOptions);
};

fetchWeaponsOptions();
}, []);

// TODO add weapon dropdown on change, selected weapon state
const handleWeaponChange = ({ value }: DropdownOptionType): void => {
setWeapon(value);
};

return (
<div>
<h2>Gear:</h2>
<Dropdown
defaultValue={weapon}
label="Weapon"
name="weapon"
options={weaponOptions}
onChange={handleWeaponChange}
/>
</div>
);
};

A React documentation note声明当您只希望效果在挂载和卸载时运行时,这是有效的做法:

If you want to run an effect and clean it up only once (on mount and unmount), you can pass an empty array ([]) as a second argument. This tells React that your effect doesn’t depend on any values from props or state, so it never needs to re-run. This isn’t handled as a special case — it follows directly from how the dependencies array always works.

但我收到以下 create-react-app linter 警告:

35:6 警告 React Hook useEffect 缺少依赖项:“weaponOptions”。要么包含它,要么删除依赖数组 react-hooks/exhaustive-deps

如果我将 weaponOptions 数组作为依赖项传递,则 useEffect 会触发,从而导致无限循环,因为 Hook 本身会更改 weaponOptions 状态。如果我省略空数组参数,也会发生同样的事情。

这里正确的方法是什么?

最佳答案

I only want to use once (when the component mounts) in order to load some data from an API

因此根据您的逻辑,您不需要依赖于组件的状态:

const INITIAL = [
{
key: '0',
label: '',
value: 'null'
}
];

const App = () => {
const [weaponOptions, setWeaponOptions] = useState(INITIAL);

useEffect(() => {
const fetchWeaponsOptions = async () => {
const weaponsData = await getWeapons();
const weaponsOptions = [
...INITIAL, // No state dependency needed
...weaponsData.map(({ id, name }) => {
return {
key: id,
label: name,
value: id
};
})
];
setWeaponOptions(weaponsOptions);
};

}, []);

return <></>;
};

但是,当您想使用一次 useEffect 并且它取决于状态时,通常会使用像这样的 bool 引用:

const App = () => {
const [weaponOptions, setWeaponOptions] = useState(INITIAL);

const isFirstFetch = useRef(true);

useEffect(() => {
const fetchWeaponsOptions = async () => {...}

if (isFirstFetch.current) {
fetchWeaponsOptions();
isFirstFetch.current = false;
}
}, [weaponOptions]);

return <></>;
};

关于javascript - 将空数组作为第二个参数传递时,React Hook useEffect 缺少依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60018255/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com