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
390
Hydrationから知るAstro, Qwik
asazutaiga
0
760
(LT)ApolloClientとGraphQL Code Generatorの話
asazutaiga
0
130
Other Decks in Programming
See All in Programming
仕様駆動開発の消費期限
watany
20
8.8k
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
340
React本体のコードリーディング
high_g_engineer
1
150
メールのエイリアス機能を履き違えない
isshinfunada
0
250
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.8k
5分で問診!Composer セキュリティ健康診断
codmoninc
0
1.1k
Google Apps Script で Ruby を動かす
kawahara
0
280
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
280
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
19k
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
830
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
160
レビュー履歴をAIに食わせて、 Compose移行を加速するs
shihochan
0
150
Featured
See All Featured
Claude Code のすすめ
schroneko
67
230k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Automating Front-end Workflow
addyosmani
1369
210k
How to Ace a Technical Interview
jacobian
281
24k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
350
We Have a Design System, Now What?
morganepeng
55
8.3k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
250
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
480
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
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