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
2021新春Reactが怖くなくなる話
Search
asazu taiga
January 04, 2021
Programming
260
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
1.1k
副業やってみた
asazutaiga
0
410
Hydrationから知るAstro, Qwik
asazutaiga
0
780
(LT)ApolloClientとGraphQL Code Generatorの話
asazutaiga
0
150
Other Decks in Programming
See All in Programming
Modernizing iOS Apps
seyfoyun
0
150
プロジェクトコードをキレイキレイしよう!暗黙的な参照を読み解く静的解析
ostk0069
0
200
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
220
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
400
Goコンパイラを作ってGoをもっと理解する / Build a Go compiler to better understand Go
ikura_hamu
0
110
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
340
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
130
Seven New Principles of Software Engineering
yegor256
0
420
クラウドゲーミングのパフォーマンス最適化に挑む / Cloud Gaming Performance Tuning
vivion
0
320
선언형 햅틱 라이브러리 진동을 소개합니다
l2hyunwoo
1
260
AmebaブログはKMPから卒業します
kmars0605
0
310
Coding with AI: How to trust the storyteller (AWS Community Day Adria, Ljubljana 2026)
slobodan
0
140
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
77k
How STYLIGHT went responsive
nonsquared
100
6.3k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
650
RailsConf 2023
tenderlove
30
1.6k
Optimizing for Happiness
mojombo
378
71k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
480
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
380
A Soul's Torment
seathinner
8
3.9k
KATA
mclloyd
PRO
35
16k
Believing is Seeing
oripsolob
1
260
Product Roadmaps are Hard
iamctodd
55
13k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
550
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