tl;dr
タイトルのようなpropsの渡し方でも無駄に再レンダリングが起きることはない、ということの確認の記事。
code
スプレッド演算子でオブジェクトを展開すると「新しいオブジェクト」が生成される。なので、レンダリング最適化の観点で、無駄に再レンダリングが起きそうにも見える。
だが、実際は「新しいオブジェクト」が生成されるだけで、要素については新しい値なわけではない。
const func = () => console.log('hello world')
const props = { func }
const newProps = { ...props }
props.func === newProps.func // => true
なので、レンダリング最適化されていれば、この渡し方でも無駄にレンダリングが起きることはない
// count が増加してもChildが再レンダリングされることはない
const App = () => {
const [count, increment] = React.useReducer(prev => ++prev, 0)
const func = React.useCallback(() => console.log('hello world'), [])
const props = { func }
return(
<div>
<button onClick={increment}>increment({count})</button>
<Child {...props} />
</div>
)
}
const Child = React.memo(({func}) => <button onClick={func}>CLICK_ME</button>)