Reputation: 55
I am using useContext which is re-rendering everything unexpectedly. You can see the results in the attached picture. My count
updates multiples times in a second
**//app component**
import React, { useState, useContext, memo } from "react";
import StateProvider from "./Components/StateComp";
import Count from "./Components/Count";
import CountUpdater from "./Components/CountUpdater";
const App = memo(() => {
return (
<>
<StateProvider>
<Count/>
<CountUpdater />
</StateProvider>
</>
);
})
export default App;
**//StateProvider comp**
import React, { useState, createContext } from "react";
export const StateContext = createContext();
function StateProvider({children}) {
const [count, setCount] = useState(1000);
return <StateContext.Provider value={{count, setCount}}>{children}</StateContext.Provider>;
}
export default StateProvider;
**//Count Comp**
import React, { useContext } from "react";
import { StateContext } from "./StateComp";
function CountComp() {
const { count } = useContext(StateContext);
return <h1>Count: {count}</h1>;
}
export default CountComp;
**//CountUpdater comp**
import React, { useContext, useEffect } from "react";
import { StateContext } from "./StateComp";
function CountUpdater() {
const { count, setCount } = useContext(StateContext);
setInterval(() => {
setCount(count + 1);
console.log("Updated count: ", count);
}, 1000);
return <h1>Updated count: {count}</h1>;
}
export default CountUpdater;
How can I resolve this, memo isn't working and I tried useEffect adding dependencies but its too worthless?
Console Results:
Upvotes: 1
Views: 87
Reputation: 6057
You need to clear out your timeout inside useEffect.
function CountUpdater() {
const { count, setCount } = useContext(StateContext);
useEffect(() => {
let interval = setInterval(() => {
setCount(count + 1);
console.count('updated');
}, 1000);
return () => clearInterval(interval);
}, [count, setCount]);
return <h1>Updated count: {count}</h1>;
}
Upvotes: 1
Reputation: 55
With the help of @keith, I found out its answer. Like he said, I needed to put clearInterval
on return() also in useEffect
**//CountUpdater comp**
function CountUpdater() {
const { count, setCount} = useContext(StateContext);
useEffect(() => {
const interval= setInterval(() => {
setCount(count+ 1);
console.log("Updated Count: ", count);
}, 1000);
return () => clearInterval(interval);
}, [count, setCount]);
return <h1>Updated count: {count}</h1>;
}
export default CountUpdater;
Upvotes: 1