xml ui - memo
useMemo
returns a memoized value.
Pass a “create” function and an array of dependencies. useMemo
will only recompute the memoized value when one of the dependencies has changed. This optimization helps to avoid expensive calculations on every render.
Remember that the function passed to useMemo
runs during rendering. Don’t do anything there that you wouldn’t normally do while rendering. For example, side effects belong in useEffect
, not useMemo
.
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
const memoizedValue = useMemo(functionThatReturnsValue, arrayDepencies)
const App = () => {
const [age, setAge] = useState(99)
const handleClick = () => setAge(age + 1)
const someValue = { value: "someValue" }
const doSomething = () => {
return someValue
}
return (
<div>
<Age age={age} handleClick={handleClick}/>
<Instructions doSomething={doSomething} />
</div>
)
}
const Age = ({ age, handleClick }) => {
return (
<div>
<div style={{ border: '2px', background: "papayawhip", padding: "1rem" }}>
Today I am {age} Years of Age
</div>
<pre> - click the button below 👇 </pre>
<button onClick={handleClick}>Get older! </button>
</div>
)
}
const Instructions = memo((props) => {
return (
<div style={{ background: 'black', color: 'yellow', padding: "1rem" }}>
<p>Follow the instructions above as closely as possible</p>
</div>
)
})
render (
<App />
)
The example above is similar to the one for useCallback
.
The only difference here is that someValue is an object NOT a string. Owing to this, the Instructions component still re-renders despite the use of React.memo
.
Why?
Objects are compared by reference, and the reference to someValue changes whenever <App />
re-renders.
Any solutions?
const App = () => {
const [age, setAge] = useState(99)
const handleClick = () => setAge(age + 1)
const someValue = useMemo(() => ({ value: "someValue" }))
const doSomething = () => {
return someValue
}
return (
<div>
<Age age={age} handleClick={handleClick}/>
<Instructions doSomething={doSomething} />
</div>
)
}
const Age = ({ age, handleClick }) => {
return (
<div>
<div style={{ border: '2px', background: "papayawhip", padding: "1rem" }}>
Today I am {age} Years of Age
</div>
<pre> - click the button below 👇 </pre>
<button onClick={handleClick}>Get older! </button>
</div>
)
}
const Instructions = memo((props) => {
return (
<div style={{ background: 'black', color: 'yellow', padding: "1rem" }}>
<p>Follow the instructions above as closely as possible</p>
</div>
)
})
render (<App />)