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
render-props-intro.pdf
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
mori-dev
October 04, 2018
Technology
240
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
render-props-intro.pdf
mori-dev
October 04, 2018
Other Decks in Technology
See All in Technology
Sony_KMP_Journey_KotlinConf2026
sony
2
210
【Gen-AX】20260530開催_JJUG CCC 2026 Spring
genax
0
430
新規事業を牽引する技術選定 〜フルスタックTypeScript開発の実践事例〜
nullnull
3
360
noUncheckedIndexedAccess、3時間、1万円。 / noUncheckedIndexedAccess, 3 Hours, 10,000 JPY.
kaonavi
1
310
Claude code Orchestra
ozakiomumkj
3
980
Rancherの紹介&Update情報(RancherJP Online Meetup #09)
yoshiyuki_kono
0
120
AI と創る新たな世界 / A New World Created with AI
ks91
PRO
0
120
LLMと共に進化するプロセスを目指して
ymatsuwitter
12
3.4k
関西に縁あるMicrosoft MVPsが語るCopilotの未来
kasada
0
1.2k
Platform engineering for developers, architects & the rest of us (AI agents)
danielbryantuk
0
190
AIプラットフォームを運用し続けるための可観測性
tanimuyk
4
1.1k
個人最適 から 全体最適 へ AI情報共有会・AIギルド・AI-DLC で進める カンリーの組織展開
rfdnxbro
0
1.7k
Featured
See All Featured
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
240
Product Roadmaps are Hard
iamctodd
PRO
55
12k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
HDC tutorial
michielstock
2
690
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
350
4 Signs Your Business is Dying
shpigford
187
22k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
530
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Transcript
React.js の render‑props と Function as child の紹介
目的 render‑props とは何かを理解すること Function as child とは何かを理解すること render‑props を使ったコードが読めるようになること Function
as child を使ったコードが読めるようになること
省略すること SFC。すべてクラス構文に統一しました。 「値」、「参照」といった用語の厳密な使い方 props の型
コンポーネント呼び出しの素朴な例 親コンポーネントが子コンポーネントを呼び出す、もっとも単純な例で す。 class Parent extends Component { render() {
return <Child /> } } class Child extends Component { render() { return ' 子コンポーネント' } }
親から子へ文字列を渡す 親コンポーネントは子コンポーネントに、JSX の属性として、文字列を 渡すことができます。 JSX の属性 として指定することで、 this.props でそれを参照するこ とができます。
import React, { Component } from 'react' class Parent extends Component { render() { const something = 'aaa' return <Child something={something} /> } } class Child extends Component { render() { return <>something は {this.props.something}</> } }
親から子へオブジェクトを渡す 親コンポーネントは子コンポーネントに、JSX の属性として、オブジェ クトを渡すことができます。たとえば、 { keyA: 'aaa'} です。 class Parent
extends Component { render() { const something = { keyA: 'aaa'} return <Child something={something} /> } } class Child extends Component { render() { return <>something.keyA は {this.props.something.keyA}</> } }
親から子へ関数を渡す 親コンポーネントは子コンポーネントに、JSX の属性として、関数を渡 すことができます。 JSX の属性が関数なら、コールバックとして使えるということです。 class Parent extends Component
{ something() { console.log('aaaaaa') } render() { return <Child something={this.something} /> } } class Child extends Component { render() { this.props.something() return <> 子コンポーネント</> } }
親から子へコンポーネントを返す関数を渡す 先程の例では、JSX の属性として渡した関数は、console.log を実行した だけでした。 コンポーネント(React.Element) を返すという使い方がもっと有益です。 たとえば、親コンポーネントで DOM 要素を返す関数を定義して、子コ
ンポーネントの props として渡します。 そして、子コンポーネントの render メソッドの定義中でその関数を実行 します。 次の例では、prop の名前を something から render に変更し、雰囲気を だしました。
class Parent extends Component { something() { return <> 親コンポーネント</>
} render() { return <Child render={this.something} /> } } class Child extends Component { render() { return this.props.render() } }
親から子へコンポーネントを渡す1 親コンポーネントは子コンポーネントに、JSX の属性として、コンポー ネントを渡すことができます。 class WanderingComponents extends Component { render()
{ return <>WanderingComponents</> } } class Parent extends Component { render() { return <Child myComponent={<WanderingComponents />} /> } } class Child extends Component { render() { return <>{this.props.myComponent}</> } }
親から子へコンポーネントを渡す2 先程の例は、JSX の属性名を children にすると、Child コンポーネント はよくみるイディオムになります。 class WanderingComponents extends
Component { render() { return <>WanderingComponents</> } } class Parent extends Component { render() { return <Child children={<WanderingComponents />} /> } } class Child extends Component { render() { return <>{this.props.children}</> } }
コンポーネントのネストと children 属性 親から子にコンポーネントを渡すとき、JSX の属性としてではなく、コ ンポーネントをネストさせる形で渡すこともできます。ネストさせると 呼び出し側から属性名の記述が消えますが、 children という名前で受 け取れると規定されています。
以下の書き方で、WanderingComponents は Child の子コンポーネント になるので、Child では this.props.children で WanderingComponents を取得できます。
class WanderingComponents extends Component { render() { return <>WanderingComponents</> }
} class Parent extends Component { render() { return ( <Child> <WanderingComponents /> </Child> ) } } class Child extends Component { render() { return this.props.children } }
Function as child パターン コンポーネントのネスト部が children 属性に対応するということを確認 しました。 このコンポーネントのネスト部は、コンポーネントそのものだけではな く関数にすることもできます。
children 属性がコールバックとして使えるということです。 その場合、render での children 属性の呼び出しは {this.props.children} ではなく {this.props.children()} で す。 これを「Function as child パターン」と呼びます。
class Parent extends Component { something() { return <>something</> }
render() { return ( <Child> {this.something} </Child> ) } } class Child extends Component { render() { return this.props.children() // () をつけて関数を実行した } }
Functions as Children と render‑props の関係 一つ前の子コンポーネントの reunder メソッドは return
this.props.children() という定義でした。 children 属性が関数である必要があると読み取れます。 これは JSX の属性として関数を渡す、いわゆる render‑props です。 コンポーネントを返す関数を prop とする JSX の属性名を render から children に変更してみましょう。
render 版 import React, { Component } from 'react' class
Parent extends Component { something() { return <>something</> } render() { return <Child render={this.something} /> } } class Child extends Component { render() { return this.props.render() } }
children 版 import React, { Component } from 'react' class
Parent extends Component { something() { return <>something</> } render() { return <Child children={this.something} /> } } class Child extends Component { render() { return this.props.children() } } 挙動は同一です。 Functions as Children は render‑props の一種だとみなせることがわかり ました。
リファレンス https://reactjs.org/docs/render‑props.html https://reactjs.org/docs/jsx‑in‑depth.html#children‑in‑jsx https://reactjs.org/docs/jsx‑in‑depth.html#functions‑as‑children https://reactjs.org/docs/react‑component.html#render