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错误。