Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
コンポーネントとレンダー
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
nikawa2161
June 17, 2025
13
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
コンポーネントとレンダー
nikawa2161
June 17, 2025
More Decks by nikawa2161
See All by nikawa2161
Node.js Subpath imports
nikawa2161
0
28
Sagaパターン入門(続編)
nikawa2161
0
39
Sagaパターン入門
nikawa2161
0
48
沖縄観光とPostgreSQL排他制約の話
nikawa2161
0
36
20251209_プログラミング原則の学び
nikawa2161
0
29
自分のコードを数年ぶりに読んだら
nikawa2161
0
20
ユーザーインタビュー分析に参加して得られたことと気づき
nikawa2161
0
31
oEmbedとは?
nikawa2161
0
170
はじめまして、にかわです
nikawa2161
0
20
Featured
See All Featured
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
66
57k
Ruling the World: When Life Gets Gamed
codingconduct
0
300
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.9k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.8k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
119
120k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
440
WCS-LA-2024
lcolladotor
0
790
Paper Plane (Part 1)
katiecoart
PRO
1
10k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
How to Talk to Developers About Accessibility
jct
2
510
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
Transcript
関数内の コンポーネントとレンダー
関数内の ・「コンポーネントとして呼び出す」 ・「関数として実行して要素を返す」
1 2 3 4 5 6 7 InnerComponent (() {
<InnerLog name="InnerComponent" />; }, [count]); innerRender (() { <InnerLog name="InnerRender" />; }, [count]); const return const return = => = => useCallback useCallback 1 2 3 4 5 6 7 8 9 10 11 12 13 ( < > < > { } <InnerComponent /> </ > < > { } { ()} </ > </ > ); return div section section section section div /* コンポーネントとして呼び出す */ /* 関数を実行して呼び出す */ innerRender 同じコンポーネント内
1 2 3 4 5 6 7 InnerComponent (() {
<InnerLog name="InnerComponent" />; }, [count]); innerRender (() { <InnerLog name="InnerRender" />; }, [count]); const return const return = => = => useCallback useCallback 1 2 3 4 5 6 7 8 9 10 11 12 13 ( < > < > { } <InnerComponent /> </ > < > { } { ()} </ > </ > ); return div section section section section div /* コンポーネントとして呼び出す */ /* 関数を実行して呼び出す */ innerRender 同じコンポーネント内 1 2 3 4 5 6 InnerLog (({ name } { name }) { (() { . ( ${name} ); }, []); < >{name}</ >; }); const return div div = : : string => => console memo useEffect log ` rendered`
1 2 3 4 5 6 7 8 9 10
11 12 13 ( < > < > { } <InnerComponent /> </ > < > { } { ()} </ > </ > ); return div section section section section div /* コンポーネントとして呼び出す */ /* 関数を実行して呼び出す */ innerRender 状態を更新すると ・<InnerComponent /> は新しいコンポーネントとして解釈 →再レンダリングと再マウントを行う ・innerRender() は要素を返す関数として解釈 →返された要素の再評価は発生せずメモ化された結果を再利用 1 2 3 4 5 6 7 InnerComponent (() { <InnerLog name="InnerComponent" />; }, [count]); innerRender (() { <InnerLog name="InnerRender" />; }, [count]); const return const return = => = => useCallback useCallback
なぜ再レンダリングの挙動が異なるのか?
・レンダリングごとに新しい関数として生成 ・Reactはこの変更を「異なるコンポーネント」と判断 ・古い関数は破棄(アンマウント) InnerComponent innerRender ・ただの関数 ・結果として返されるのはJSX要素 ・メモ化されていれば、再利用される
JSXでの評価の違い InnerComponent 1 <InnerComponent /> 1 React. (InnerComponent, ) createElement
null
JSXでの評価の違い InnerComponent 1 <InnerComponent /> 1 React. (InnerComponent, ) createElement
null innerRender 1 { ()} innerRender 1 React. (InnerLog, { name }) createElement : "InnerRender"