setState inside useEffect or useCallback,依赖问题
setState inside useEffect or useCallback, dependency issue
我正在尝试从我的代码中删除控制台警告,但我对如何解决此依赖性问题感到困惑。
我有一个 useEffect 挂钩,它调用一个方法 removeMessage,它是在我的组件中定义的。我收到一条警告,指出这应该在 useEffect 依赖项数组中,但如果我这样做,我会创建一个无限循环,因为当组件重新呈现时会重新创建函数引用。
const Component = () => {
const [list, setList] = useState();
const removeMessage = (message: string) => {
const list = list.filter(x => x.message !== message);
setList(list);
}
useEffect(() => {
...
removeMessage("test");
});
所以我读到我应该使用 useCallback 挂钩,以确保引用不被更改:
const removeMessage = useCallback((message: string) => {
const list = list.filter(x => x.message !== message);
setList(list);
}, [list]);
但是,除非我提供我的 list 作为该挂钩的依赖项,否则我会收到类似的警告。但如果我这样做,我会创建另一个无限循环。
此代码和 useEffect 的用法可能是不好的做法,但我不知道如何解决它,因为我的方法 removeMessage 取决于状态进行过滤。
谢谢。
我认为这应该可行(使用 setState 函数变体)。这样你就不会依赖列表(并且在边缘情况下它也更正确)
const Component = () => {
const [list, setList] = useState<Array<{ message: string }>>([]);
const removeMessage = useCallback((message: string) => {
setList(prev => prev.filter(x => x.message !== message));
}, []);
useEffect(() => {
removeMessage('test');
}, [removeMessage]);
};
我正在尝试从我的代码中删除控制台警告,但我对如何解决此依赖性问题感到困惑。 我有一个 useEffect 挂钩,它调用一个方法 removeMessage,它是在我的组件中定义的。我收到一条警告,指出这应该在 useEffect 依赖项数组中,但如果我这样做,我会创建一个无限循环,因为当组件重新呈现时会重新创建函数引用。
const Component = () => {
const [list, setList] = useState();
const removeMessage = (message: string) => {
const list = list.filter(x => x.message !== message);
setList(list);
}
useEffect(() => {
...
removeMessage("test");
});
所以我读到我应该使用 useCallback 挂钩,以确保引用不被更改:
const removeMessage = useCallback((message: string) => {
const list = list.filter(x => x.message !== message);
setList(list);
}, [list]);
但是,除非我提供我的 list 作为该挂钩的依赖项,否则我会收到类似的警告。但如果我这样做,我会创建另一个无限循环。
此代码和 useEffect 的用法可能是不好的做法,但我不知道如何解决它,因为我的方法 removeMessage 取决于状态进行过滤。
谢谢。
我认为这应该可行(使用 setState 函数变体)。这样你就不会依赖列表(并且在边缘情况下它也更正确)
const Component = () => {
const [list, setList] = useState<Array<{ message: string }>>([]);
const removeMessage = useCallback((message: string) => {
setList(prev => prev.filter(x => x.message !== message));
}, []);
useEffect(() => {
removeMessage('test');
}, [removeMessage]);
};