使用道具值删除 useEffect 挂钩中状态数组元素中的元素
Delete elements in state array element in useEffect hook using props values
我正在尝试使用组件的道具从 useEffect 中的状态变量中删除项目。我想从状态变量中获取初始值,然后删除该数组中的元素并将状态变量再次设置为新值。但是当我不在依赖数组中传递状态变量时,它会抛出 React Hook useEffect has a missing dependency: 'abc'. Either include it or remove the dependency array
警告,当我传递它时,它进入无限循环,我认为这是正确的,因为 useeffect 工作。这是我正在尝试的使用效果:
const [abc, setAbc] = useState([]);
useEffect(() => {
axios.get(url).then(res => setAbc(res));
}, [props.bbb])
useEffect(() => {
if(props.xyz) {
let aaa = abc.filter(key => key.id === props.xyz);
setAbc(aaa);
}
}, [props.xyz])
这里有我遗漏的东西吗?有没有更好的方法来做到这一点?
提前致谢。
正确,包括效果更新可能导致渲染循环的依赖项。使用功能状态更新来消除 abc
作为依赖项的需要。
useEffect(() => {
if (props.xyz) {
setAbc(abc => abc.filter(key => key.id === props.xyz));
}
}, [props.xyz]);
因为第一个 useEffect
实际上并没有引用道具,我可能会假设你打算只在挂载时调用它。您可以使用空的依赖项数组来执行此操作。
useEffect(() => {
axios.get(url).then(res => setAbc(res));
}, []);
更新
如果您想要获取 abc
并在每次 props.xyz
依赖项更新时进行过滤,则使用单个 useEffect
挂钩并在更新状态之前过滤结果。
useEffect(() => {
axios.get(url)
.then(res => {
if (props.xyz) {
setAbc(res.filter(key => key.id === props.xyz));
} else {
setAbc(res);
}
});
}, [props.xyz]);
我正在尝试使用组件的道具从 useEffect 中的状态变量中删除项目。我想从状态变量中获取初始值,然后删除该数组中的元素并将状态变量再次设置为新值。但是当我不在依赖数组中传递状态变量时,它会抛出 React Hook useEffect has a missing dependency: 'abc'. Either include it or remove the dependency array
警告,当我传递它时,它进入无限循环,我认为这是正确的,因为 useeffect 工作。这是我正在尝试的使用效果:
const [abc, setAbc] = useState([]);
useEffect(() => {
axios.get(url).then(res => setAbc(res));
}, [props.bbb])
useEffect(() => {
if(props.xyz) {
let aaa = abc.filter(key => key.id === props.xyz);
setAbc(aaa);
}
}, [props.xyz])
这里有我遗漏的东西吗?有没有更好的方法来做到这一点?
提前致谢。
正确,包括效果更新可能导致渲染循环的依赖项。使用功能状态更新来消除 abc
作为依赖项的需要。
useEffect(() => {
if (props.xyz) {
setAbc(abc => abc.filter(key => key.id === props.xyz));
}
}, [props.xyz]);
因为第一个 useEffect
实际上并没有引用道具,我可能会假设你打算只在挂载时调用它。您可以使用空的依赖项数组来执行此操作。
useEffect(() => {
axios.get(url).then(res => setAbc(res));
}, []);
更新
如果您想要获取 abc
并在每次 props.xyz
依赖项更新时进行过滤,则使用单个 useEffect
挂钩并在更新状态之前过滤结果。
useEffect(() => {
axios.get(url)
.then(res => {
if (props.xyz) {
setAbc(res.filter(key => key.id === props.xyz));
} else {
setAbc(res);
}
});
}, [props.xyz]);