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
2021新春Reactが怖くなくなる話
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
asazu taiga
January 04, 2021
Programming
250
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
2021新春Reactが怖くなくなる話
社内勉強会用
asazu taiga
January 04, 2021
More Decks by asazu taiga
See All by asazu taiga
Jotaiで作ったフォームをApollo_Clientで投げたらいい感じだった件.pdf
asazutaiga
1
1k
副業やってみた
asazutaiga
0
380
Hydrationから知るAstro, Qwik
asazutaiga
0
760
(LT)ApolloClientとGraphQL Code Generatorの話
asazutaiga
0
120
Other Decks in Programming
See All in Programming
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
480
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
180
New "Type" system on PicoRuby
pocke
1
720
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
3.5k
Agentic UI
manfredsteyer
PRO
0
120
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
310
Old Dog, New Tricks: The Java 25 Reinvention - JNation
bazlur_rahman
0
150
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
130
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
4.8k
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
170
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
510
柔軟なPDFレイアウトエディタを支える型システム設計 — Discriminated UnionとConditional Typeの実践
minako__ph
4
1.6k
Featured
See All Featured
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
300
Code Review Best Practice
trishagee
74
20k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.2k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
We Are The Robots
honzajavorek
0
240
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
160
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Claude Code のすすめ
schroneko
67
230k
Code Reviewing Like a Champion
maltzj
528
40k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
200
Transcript
2021年新春 Reactが怖くなくなる話 1 1
⽬標:Reactが怖くなくなくなる 社内での再利⽤性を考慮して初⼼者向けに寄せた資料です。 すでに実務でReactを使われている⽅には物⾜りないかもしれませんが、 なるべく2020年末の最新状況に合わせた記述を意識しましたので、 情報収集の⼊り⼝にしていただければ幸いです。 2 2
アジェンダ 3 3
導⼊ 「Reactってこんなもの」のイメージを共有します。 Reactってどんなイメージですか? 2020年末のReactエコシステム 4 4
やってみよう create-react-appでテンプレートを⽣成して観察してみましょう。 Start with create-react-app ★Hands On 各ディレクトリの役割 コンポーネント志向 5
5
コンポーネントとReact hooks 実装する際にまず知っておく必要がある要素について紹介します。 関数コンポーネントとクラスコンポーネント 基本のフック - useState(), useEffect(), useContext() ★Hands On
6 6
React開発における「React以外」の話 実際にWebアプリケーションを作る際に必要になる 「React以外のもの」の紹介です。 スタイリング - CSS in JS vs CSS
Module 7 7
おまけ:成果物紹介 Next.js x firebaseでつくる俳句管理アプリ「季語別俳句帖」※未完成 8 8
Reactってどんなイメージですか? 9 9
1 0 1 0
アサヅは最初こんな印象を持ちました SPAを作れるやつ なんか難しそう フロントエンドのつらみをいろいろ解消してくれる? 部品単位で開発できて効率よさそう AndroidのViewとかに相当するものを作っていくイメージかな? 1 1 1 1
遠からず 1 2 1 2
例えばこんな「部品」 const MyComponent = () => ( <p>Hello, World!</p> )
export default MyComponent 1 3 1 3
JSの中にHTML…? 不気味 これと何が違うんだろう… function createMyComponent() { return '<p>Hello, World!</p>' }
Reactの怖さ(Vanilla JSとの⼤きな違い)= JSX 1 4 1 4
JSX ≠ HTML ⽂字列ではありません HTMLそのものでもありません JSXはJSにコンパイルされます 1 5 1 5
ex. Babelによるコンパイル結果 const MyComponent = () => ( <p>Hello, World!</p>
) ↓ import {jsx as _jsx} from 'react/jsx-runtime'; const MyComponent = () => ( _jsx('p', { children: 'Hello World!' }) ) ※React 17〜 FYI: https://ja.reactjs.org/blog/2020/09/22/introducing-the-new- jsx-transform.html ※16以前は React.createElement() が呼ばれてました 1 6 1 6
なんだ、ただのJavaScriptじゃん。 怖くないですね 1 7 1 7
ちなみに JSXそのものは、Reactとは全く別の仕様として存在しています。 FYI: https://facebook.github.io/jsx/ 専⽤のbable plugin等を利⽤すれば Vue.js等でもJSXを利⽤することができます。 1 8 1
8
で、こいつはどうやったら表⽰できるのよ こいつ↓ const MyComponent = () => ( <p>Hello, World!</p>
) 1 9 1 9
ReactDOM.render() の引数に渡す <html> <body> <div id="hello-world"></div> </body> </html> import ReactDOM
from 'react-dom' import MyComponent from './components/MyComponent' const element = <MyComponent></MyComponent> ReactDOM.render(element, document.getElementById('hello-world')) ※ react-dom は react コアとは切り離されたパッケージとして提供されている →React Native等への応⽤が可能となっている 2 0 2 0
実⾏結果 <html> <body> <div id="hello-world"> <p>Hello, world!</p> </div> </body> </html>
※だいぶ省略しています 2 1 2 1
Reactには他にもこんな特徴があります 宣⾔的UI 「あるべき姿」を宣⾔し表現する(対:命令的) 仮想DOM DOM構成をJSのオブジェクトで表現し、 仮想DOMツリーの変更差分をレンダリングする 関数型プログラミングとの親和性 UI=f(state) という考え⽅ 詳しくはggってください、、、
2 2 2 2
2020年末のReactエコシステム 2 3 2 3
2 4 2 4
いっぱいあってよくわからない というか書ききれていないです まだある 無限にある 2 5 2 5
2 6 2 6
Start with create-react-app ※せっかくなのでTypeScriptも触りましょう Android経験者なら強⼒な型補完に良さを感じると思います $ npm i -g create-react-app
$ create-react-app sample-app --template typescript 2 7 2 7
各ディレクトリの役割 実際にモノを⾒ながら説明します 2 8 2 8
「コンポーネント志向」という考え⽅ 2 9 2 9
コンポーネントとは 「部品」、「構成要素」 構造、⾒た⽬、振る舞いを1つのセットとして捉える → HTML, CSS, JavaScript 3 0 3
0
(フロントエンドにおける) コンポーネント志向とは コンポーネントをいっぱいつくって ページを構築しよう!という考え⽅ 3 1 3 1
コンポーネント志向のメリット(私⾒) 1コンポーネント1ファイルなので読みやすい テストしやすい 変更に強い 再利⽤性が⾼い ローカルな状態管理がしやすい OOPの基本知識が設計に活かしやすい 3 2 3
2
コンポーネント志向の課題(私⾒) コンポーネント内でのUIとロジックの密結合 →ロジックの使いまわしが難しい 多くのコンポーネント志向ライブラリはView層にしか関⼼を持たず、 「それ以外」は実装者にゆだねられがち ・ ビジネスロジックをどう実装するか ・ コンポーネント間の状態管理をどうするか → 多くのコンポーネント志向SPAライブラリは、 これらの課題を個別に解消するエコシステムを持っている
3 3 3 3
3 4 3 4
コンポーネントとReact hooks 3 5 3 5
コンポーネント クラスコンポーネント class Welcome extends React.Component { render() { return
<h1>Hello, {this.props.name}</h1>; } } 関数コンポーネント const Welcome: React.VFC<Props> = (props) => { return <h1>Hello, {props.name}</h1>; } ※ React.VFC = VoidFunctionalComponent (関数コンポーネントの型の⼀種 @types/react 18^ ) 3 6 3 6
2020年末、どちらを選択するか? 記述的にシンプルな関数コンポーネントが第⼀候補 クラスコンポーネントの優位性であった state 、 Lifecycle はhooksの登場で関数コンポーネントでもほぼ実現可能に 基本的に関数コンポーネントでよさそう 3 7
3 7
関数コンポーネントの表現⼒を ⾼めてくれた「hooks」とは? 3 8 3 8
hooks導⼊の経緯 https://ja.reactjs.org/docs/hooks-intro.html#motivation 典型的な React アプリを React DevTools で⾒てみると、おそらくプロバイダや らコンシューマやら⾼階コンポーネントやらレンダープロップやら、その他諸々の抽象 化が多層に積み重なった『ラッパー地獄』を⾒ることになるでしょう。
フックを使えば、ステートを持ったロジックをコンポーネントから抽出して、単独でテス トしたり、また再利⽤したりすることができます。フックを使えば、ステートを持ったロ ジックを、コンポーネントの階層構造を変えることなしに再利⽤できるのです。 3 9 3 9
ルール 呼び出しは関数コンポーネントのトップレベル or カスタムhooksのトップレベルのみ カスタムhooksを⾃作する場合、命名規則 useXXX 遵守 4 0 4
0
useState const [state, setState] = useState(initialState) ステートフルな値とそれを更新するための関数を返却する 4 1 4
1
ボタンを押してカウントアップするコンポーネント import { useState, useEffect } from 'react' const Counter:React.VFC
= () => { const [count, setCount] = useState(0) return ( <> <div>{count}回クリックされました︕</div> <button onClick={() => setNumber(count + 1)}>ボタン</button> </> ) } ボタンを押される →stateが更新される →stateの変更にもとづいて再レンダリングされる 4 2 4 2
※ <></> = <React.Fragment> 「レンダリングされない括る専⽤要素」と思っておけばひとまずOK 4 3 4 3
useEffect useEffect(functionWhenUpdated) 副作⽤(再レンダリング等)を契機に実⾏する処理 第⼆引数を⽤いて実⾏タイミングを制御可能(説明略) 4 4 4 4
ボタンを押してカウントアップするコンポーネント② import { useState, useEffect } from 'react' const Counter():React.VFC
= () => { const [count, setCount] = useState(0) useEffect(() => { document.title = `${count}回クリックされたページ`; }) return ( <> <div>{count}回クリックされました︕</div> <button onClick={() => setCount(count + 1)}>ボタン</button> </> ) } 再レンダリング(副作⽤)を契機に、ページのタイトルが変更される 4 5 4 5
※ 副作⽤がある関数 ≒ 純粋でない関数 ≒ 同じ引数を渡しても同じ結果が返ってくるとは限らない関数 レンダリングが発⽣した = 結果が前回と異なる =
副作⽤が⽣じている → 副作⽤フックが実⾏される 4 6 4 6
useContext const contextValue = useContext(contextKey) Context API(後述)から値を取得 4 7 4
7
Contextの値をもとに表⽰⾊を設定するボタン import {useContext} from 'react' import ThemeContext from '../contexts/theme-context' //
context定義ファイル const ThemedButton():React.VFC = () => { const theme = useContext(ThemeContext) return ( <button style={{ background: theme.background, color: theme.foreground }}> テーマカラーで配⾊されたボタンです︕ </button> ) } 4 8 4 8
ContextAPIによる Theme の提供 React.createContext() Context.Providerコンポーネント const themes = { light:
{ foreground: "#000000", background: "#eeeeee" }, dark: { foreground: "#ffffff", background: "#222222" } } const ThemeContext = React.createContext(themes.light) // 初期値 export default ThemeContext 4 9 4 9
import ThemeContext from './contexts/ThemeContext' import ThemeButton from './components/ThemeButton' const App:
React.VFC = () => { return ( <ThemeContext.Provider value={themes.dark}> <ThemeButton /> </ThemeContext.Provider> ) } <ThemeContext.Provider> の⼦孫要素として表現されたコンポーネントは、 value に設定された値をContext APIを通じて参照できる value の値が変更されると再レンダリングされる 5 0 5 0
きみだけのhooksを作ろうのコーナー 例えば、boolean値をtoggleさせることができる useBool import {useState} from 'react' const useBool =
() => { const [bool, setBool] = useState(false) const toggleBool = setBoolean(!bool) return [bool, toggleBool] } export default useBool ちょっとだけ使い勝⼿がよくなる・安全になる薄いhooksも全然OKだと思います 5 1 5 1
React開発におけるReact以外の話 ※状態管理の話も⼊れたかったんですが、今回は未完です。。すみません 5 2 5 2
スタイリング 2020年末現在、有⼒な選択肢は⼤きく分けて2つ CSS in JS CSS Modules どちらも「モノリシックなCSSからコンポーネントごとのCSSへ」の動き 5 3
5 3
CSS in JS 代表的なライブラリ: styled-components import {styled} from 'styled-components' type
Props = { text: string } const Component: React.VFC<Props> = (props) => { return <button>{props.string}</button> } const StyledButton = styled(Component)` > button { background-color: black; } ` export default StyledButton 5 4 5 4
CSS Module button.module.css .button { background-color: black; } import Styles
from './button.module.css' type Props = { text: string } const Component: React.VFC<Props> = (props) => { return <button className={Styles.button}>{props.string}</button> } export default Component 5 5 5 5
両者の⽐較(どちらも有⼒。。) CSS in JS JSの変数が使えるので状態に応じた表現⼒が⾼い ロジックと層を分ければ保守性アップが⾒込める CSS Modules JSとCSSファイルを分けることができるので分業しやすい(かも) クラス名にスタイリングを⼀任できるので⾒通しが良い
5 6 5 6
スタイリングの基本指針 コンポーネント単位でスタイリングしよう ロジックと切り離そう コンポーネントは外部からのレイアウトを(なるべく)意識しない スタイリングにするよう⼼がけよう (使われる側が使う側を知るのは良くない、関⼼の分離) ⾊定義などグローバルに使いまわせる定数は別ファイルに切り分けよう 5 7 5
7
まとめ Reactの怖さはJSXに拠るところが⼤きいけど、 仕組みを理解するとただのJSだと分かります。コワクナイヨ Reactはエコシステムが肥⼤化しているので把握が難しいけど、 それって実は「React以外」をどうにかするための試⾏錯誤でしかない。コワクナイヨ React基礎知識をある程度⾝に付けた後は、 結局、設計パターンをどうするかが問題になると思います。 ⼀般的な開発と⼤差ありませんし、OOPわかれば普通に戦えます。 5 8
5 8
おまけ:成果物紹介 https://kigo-betsu-haiku-cho.vercel.app/ https://zenn.dev/asazutaiga/articles/2046b0fbb1e934 5 9 5 9