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
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
次世代ランサムウェア対策の考察 / 20260704 Mitsutoshi Matsuo
shift_evolve
PRO
5
1.7k
product engineering with qa
nealle
0
150
スタートアップにおけるアジャイルの実践について #shibuyagile
murabayashi
3
2.1k
「ちゃんとやっている」は独りよがりだった ― 不安に寄り添うインシデント対応へ / Towards incident response that addresses anxieties
chmikata
1
4.3k
プロンプト_きのこカンファレンス2026_LT
yurufuwahealer
0
150
はじめてのWDM
miyukichi_ospf
1
130
Baseline対応のDOMの型定義を作った
uhyo
3
720
ruby.wasmとPicoRuby.wasmに対応した仮想DOMライブラリを作ってる話 #kaigieffect_kaigi
sue445
PRO
0
110
AIで政治は変わるのか? — 中高生と考えたAI時代の民主主義(東海高校サタデープログラム)
eitarosuda
0
410
美しいコードを書くためにF#を学んでみた話
yud0uhu
1
390
証券システムを10年Scalaで作り続けるということ - 関数型まつり2026
krrrr38
3
790
Claude Codeとハーネスについて考えてみる
oikon48
18
9k
Featured
See All Featured
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
390
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
220
How to train your dragon (web standard)
notwaldorf
97
6.7k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
300
The Spectacular Lies of Maps
axbom
PRO
1
850
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
190
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
A better future with KSS
kneath
240
18k
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