Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Reactの公式Doc「react.dev」 を読んでの要点まとめ

KeitaUenishi
September 13, 2023

Reactの公式Doc「react.dev」 を読んでの要点まとめ

2023/09/13 に社内の勉強会で発表した資料です
最後の「スクラップ」の部分には時間の都合で省略したものが含まれています。

発表にあたってメモしていた内容
https://zenn.dev/uenishi_com/scraps/0e1c677875613f

KeitaUenishi

September 13, 2023
Tweet

More Decks by KeitaUenishi

Other Decks in Technology

Transcript

  1. 7 参照 : UIの記述 / コンポーネントを純粋に保つ let guest = 0;

    function Cup() { // Bad: changing a preexisting variable! guest = guest + 1; return <h2>Tea cup for guest #{guest}</h2>; } export default function TeaSet() { return ( <> <Cup /> <Cup /> <Cup /> </> ); } 例えば、左のようなコードの場合 普通にCupコンポーネントを呼び出しているだけなのに 結果が以下のようにそれぞれで変わります
  2. 1. 根本的な思想とか JSX = Reactってこと? 9 答えは「No」 - JSXはJavaScriptの拡張 (言語の拡張、正式名称は

    JavaScript Syntax Extention) - ReactはJavaScriptのライブラリ つまり、Reactを使わないまま、JSXだけで使うことも可能
  3. 10 JSX記法はなんで親のタグで囲むのか <> <h1>Hedy Lamarr's Todos</h1> <img src="https://i.imgur.com/yXOvdOSs.j pg" alt="Hedy

    Lamarr" class="photo" > <ul> ... </ul> </> React書き始めたら最初にハマるポイント 厳密にはReactのエラーではなく、JSXのエラー Returnの中身は1つのタグにラップされている状態で なければいけない 理由としては、内部でプレーンな JavaScriptオブジェクトに変 換されているため。 複数のオブジェクトを関数の戻り値として返したい場合、配列 にラップするなどして返すのと同じ。 ひとつの親要素 = ひとつの戻り値
  4. 12 具体的にいうと? import { useState } from 'react'; export default

    function Counter() { const [number, setNumber] = useState(0); return ( <> <h1>{number}</h1> <button onClick={() => { setNumber(number + 1); setNumber(number + 1); setNumber(number + 1); }}>+3</button> </> ) } ボタンをクリックしたら値がいくつ増えるでしょう?
  5. 13 具体的にいうと? import { useState } from 'react'; export default

    function Counter() { const [number, setNumber] = useState(0); return ( <> <h1>{number}</h1> <button onClick={() => { setNumber(number + 1); setNumber(number + 1); setNumber(number + 1); }}>+3</button> </> ) } 正解は「1増えるだけ」 これは書き換えると、以下のような形になる <button onClick={() => { setNumber(0 + 1); setNumber(0 + 1); setNumber(0 + 1); }}>+3</button> setNumberが実行され、stateの中身が変わらなければ numberはずっと0のまま
  6. 16 refの使い方アンチパターン import { useState, useRef } from 'react'; export

    default function Counter() { const [show, setShow] = useState(true); const ref = useRef(null); return ( <div> <button onClick={() => { setShow(!show); }}> Toggle with setState </button> <button onClick={() => { ref.current.remove(); }}> Remove from the DOM </button> {show && <p ref={ref}>Hello world</p>} </div> ); } 左のコードでは、refを使ってDOMを直接操作(削除) しています。 「Remove from the DOM」ボタンを押すと、下の Hello Worldの表示は消えてしまいます。 この状態で、「Toggle with setState」ボタンを押すと どうなる?
  7. 4. RSC (React Server Component) とは 最近のReactについて 20 - RSC

    (React Server Component) という概念の登場 - RSCの世界観ではReactのコンポーネントはデフォルトでサーバーサイドでレンダリングされます - つまりこれまでのuseStateやらuseEffectやらは使えません - もちろん完全に使えなくなるわけではなく、従来通りのクライアントサイドコンポーネントとして扱いたい場合は、 モジュールに対して ’use client’ という記述をします - コンポーネントが直接dbにデータを取りに行く、ようなことも可能(今までReact触ってきた人から見ると結構衝 撃) - コンポーネントをサーバーサイドでレンダリングすることで、どんなメリットがあるの? - クライアントでのJavaScriptのバンドルサイズが減る = パフォーマンスの向上 = UXの向上 - バンドルとは変換のこと。ReactやNext.js, TypeScriptなどは最終的にJavaScriptになる。このバン ドルされたJavaScriptが大きくなるとページロードなどの時間が長くなる。
  8. 4. RSC (React Server Component) とは 最近のReactについて 21 これまでReactでアプリケーション開発をする時は、データアクセスの方法やデータをどこに保存するのかを決めるこ とが悩みのタネになっていた。

    → 大量にあるサードパーティーライブラリを要件に沿って最適なものを選択しなければいけない このデータのアクセス・管理周りをReactで標準化する React Server Componentが成熟した先には、かなり面白い世界観になっていそう 変化が早すぎてついていくのはかなり大変。世の中のスーパーエンジニア等の記事を読んだり、公式追っかけて日々 知識を入れていかないといけない。
  9. 23

  10. 4. RSC (React Server Component) とは 最近のReactについて 29 - RSC

    (React Server Component) という概念の登場 - RSCの世界観ではReactのコンポーネントはデフォルトでサーバーサイドでレンダリングされます - つまりこれまでのuseStateやらuseEffectやらは使えません - もちろん完全に使えなくなるわけではなく、従来通りのクライアントサイドコンポーネントとして扱いたい場合は、 モジュールに対して ’use client’ という記述をします - コンポーネントが直接dbにデータを取りに行く、ようなことも可能(今までReact触ってきた人から見ると結構衝 撃) - コンポーネントをサーバーサイドでレンダリングすることで、どんなメリットがあるの? - JavaScriptのバンドルサイズが減る = パフォーマンスの向上 = UXの向上 - たとえばブログのコードブロックはいろんな言語に合わせてシンタックスハイライトを行うので、JSのバン ドルサイズは大きくなりがち - RSCを使えばJSのバンドルサイズは (その分) ゼロになる!(Brightというパッケージが出ているよう)