Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
render-props-intro.pdf
Search
mori-dev
October 04, 2018
Technology
250
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
Railsのように考える: See through the Master
snoozer05
PRO
3
910
Reactの設計論
uhyo
24
13k
OpenTelemetry eBPF Instrumentationの舞台裏 / Behind the Scenes of OpenTelemetry eBPF Instrumentation
ymotongpoo
4
1.3k
HRC_Frontend_Conference_Fukuoka_2026.pdf
ts020
0
730
Claude Codeを「使うほど育つ」AI秘書にするノウハウ
minorun365
PRO
30
26k
AIエージェントの自己改善をどう設計するか / How to Design Self-Improvement for AI Agents
22mi
25
16k
越境するなら専門用語を使うな高校校歌 / If you wanna cross border, you shouldn't use jargon
vtryo
0
140
作品が生態系になった ─ Mini Tokyo 3D から世界へ
nagix
0
190
アクセスキーこわい やめかたと漏らさない工夫
sassssan68
1
300
空間オーディオで過去の 自分(ゴースト)と競うランニング 〜HealthKitのルートを足音に変える実装〜
nao_randd
0
220
その Lambda、8分で 管理者権限まで奪われます
k1nakayama
3
1.7k
aws-iot-platform-architecture-use-cases.pdf
ma2shita
0
210
Featured
See All Featured
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
690
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
540
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
850
Marketing to machines
jonoalderson
1
5.8k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.9k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Practical Orchestrator
shlominoach
192
12k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
How to build a perfect <img>
jonoalderson
1
6k
GraphQLとの向き合い方2022年版
quramy
50
15k
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