Javascript React hooks:callback as prop在';这叫什么

Javascript React hooks:callback as prop在';这叫什么,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,在下面的示例中,当我调用fetchItems()中的onError属性时,我陷入了一个循环。我不明白为什么,当调用时,它会根据它触发钩子。我怎样才能解决这个问题?谢谢 const Component = ({onError}) => { const [items, setItems] = useState([]); const itemsRef = useRef(items); const fetchItems = useCallback(() => { con

在下面的示例中,当我调用
fetchItems()
中的
onError
属性时,我陷入了一个循环。我不明白为什么,当调用时,它会根据它触发钩子。我怎样才能解决这个问题?谢谢

const Component = ({onError}) => {
  const [items, setItems] = useState([]);
  const itemsRef = useRef(items);

  const fetchItems = useCallback(() => {
    const [first] = itemsRef.current;
    fetchNewItemsSince(first || 0).then((newItems) => {
      setItems((oldItems) => [...oldItems, ...newItems]);
    }).catch(onError);
  }, [onError]);

  // Update ref to dispose closure on `items` state
  useEffect(() => {
    itemsRef.current = items;
  }, [items]);

  // Call once on mount
  useEffect(() => {
    fetchItems();
  }, [fetchItems]);

  // Make an interval
  useEffect(() => {
    const id = setInterval(fetchItems, ONE_MINUTE);

    return () => {
      clearInterval(id);
    };
  }, [fetchItems]);
};

尝试使用函数设置初始状态

Const[foo,setFoo]=useState(()=>“foo”)

您对该状态实例的USECARBACK可能运行一次,如果我错了请更正我,因此如果您为UpStand设置了一个函数,它只运行一次,考虑组件是否安装但没有更新。 也许这是一种实践,但我从来没有在没有设置错误状态的情况下调用过类似于[OneError]的东西,因为我认为这是可以识别的

所以React是呈现某些组件等的一件很棒的事情。UseEffect很棒,我个人不使用它来改变状态,对我来说,这通常是在JSX中完成的

我想要一个带有UseState方法的onClick处理程序,并观察那里的变化。相反,您运行的函数运行setState事件并监视事件


如果您需要任何解释,请告诉我这是否有效。

正如我在评论中所说,
onError
将触发父级上的重新渲染,因此子级也将再次渲染


有人建议从依赖项的
useCallback
数组中删除
onError
。虽然它可能会工作,但它被认为是一种不好的做法,因为它可能导致内存泄漏。您是否尝试删除函数周围的
useCallback
wrap?

这是如何实现的
onError
?可能它的调用是使父级重新渲染,因此
组件
重新渲染我认为您解决了这个问题。如果OneError正在更改父级中的状态,则会重新渲染。我必须想办法改变代码的架构。在useCallback中传递到数组中的所有内容都会像在useEffect中一样。这使效果进入循环。请尝试从useCallback中删除它。@twboc我无法删除它,因为它是一个外部依赖项。因此,请尝试用伪占位符[{}]替换[OneError],并删除catch语句。我尝试了
useState(()=>[])
,但它不起作用。我真的不明白你在建议什么方法;我看不出还能从哪里触发
setState()
,而是从
useffect()
触发。你能根据我举的例子的目的给我举个例子吗?谢谢!:-)现在我知道了它重新呈现的原因:这是因为回调改变了父组件中的一个阶段,所以它重新呈现。我做错了…我不能删除
useCallback
,否则我会得到
Hook.eslintreact hooks/deps
lint错误。