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

React って本当に使う意味あるの? 〜SPA と React の「キホン」の「キ」〜

Yusuke Inai
December 03, 2022

React って本当に使う意味あるの? 〜SPA と React の「キホン」の「キ」〜

資料の中に出てくるコードのリンクを貼っておきます。

①FWなし(Rails+Ajax)
ソースコード 1(JavaScript)https://gist.github.com/youliangdao/3ec60ef2015d86e769c1dffcc93126bd
ソースコード 2(Rails の Model)https://gist.github.com/youliangdao/4520a7947acdcaa3de807d863bbbaf05
ソースコード 3(Rails の Controller)https://gist.github.com/youliangdao/3fa64e8d357789d80db9f7f8171487be
ソースコード 4(Rails の View)https://gist.github.com/youliangdao/ac5a392a8bb1e913c78813ada57fb597

②FWあり(React)
ソースコードhttps://gist.github.com/youliangdao/128299f74c063053aba0c0a2efa4de76

Yusuke Inai

December 03, 2022
Tweet

More Decks by Yusuke Inai

Other Decks in Programming

Transcript

  1. シングルページアプリケーション (英: single-page application 、SPA )と は、単一の Web ページのみから構成 することで、デスクトップアプリケ

    ーションのようなユーザ体験を提供 する Web アプリケーションまたは Web サイトである。必要なコード (HTML 、JavaScript 、CSS )は最初に まとめて読み込むか、ユーザの操作 などに応じて動的にサーバと通信 し、必要なものだけ読み込みを行 う。 引用元:Wikipedia
  2. ※Ajax について ※Ajax について Ajax = 「Asynchronous JavaScript + XML

    」 Asynchronous = 「非同期」 XML = 「Extensible Markup Language 」
  3. SPA のデメリット SPA のデメリット 1. 初期ロードの遅さ 2. OGP や SEO

    3. クライアント側のマシンスペックに依存
  4. 🤔 🤔 じゃあなんで React や Vue の じゃあなんで React や

    Vue の ような FW を使うの? ような FW を使うの?
  5. ※見通しよくするため JS も MVC を利用してます ソースコード 1 (JavaScript ) ソースコード

    2 (Rails の Model ) ソースコード 3 (Rails の Controller ) ソースコード 4 (Rails の View )
  6. 1 オブジェクトを破壊しながら 1 オブジェクトを破壊しながら DOM 操作するしかない DOM 操作するしかない /** *

    TODO の配列から UI を生成する関数 * @param {Todo[]} todos */ render(todos) { const todosEl = document.getElementById("todos"); todosEl.innerHTML = ""; const fragment = document.createDocumentFragment(); todos.forEach((todo) => { const todoEl = this._createTodoElement(todo); fragment.appendChild(todoEl); }); todosEl.appendChild(fragment); }
  7. /** * タスク送信時に TODO 追加と UI 反映をする */ handleSubmitForm() {

    window.addEventListener("load", () => { const formEl = document.getElementById("task-send-form"); formEl.addEventListener("ajax:success", (ev) => { this.flash(ev.detail[0]); }); }); }
  8. 2 データと UI の同期が手動!! 2 データと UI の同期が手動!! /** *

    指定した TODO 削除と UI 反映をする * @param {*} id TODO の id */ handleClickDeleteTask(id) { const buttonEl = document.getElementById(`button-${id}`); buttonEl.addEventListener("click", () => { fetch(`http://localhost:3000/tasks/${id}`, { method: "DELETE", headers: { "X-CSRF-Token": Rails.csrfToken(), "content-type": "application/json", }, }) .then((res) => { return res.json(); }) .then((json) => { this.flash(json); }); }); }
  9. 課題 解決法 オブジェクトを破壊し ながら DOM 操作する しかない JSX を利用し、スタイ ルとイベントハンドラ

    を渡す データと UI の同期が手 動!! state を更新すると React が自動で UI の 更新を行う
  10. 1 JSX を利用し、スタイルとイベン 1 JSX を利用し、スタイルとイベン トハンドラを渡す トハンドラを渡す return (

    <div className="App"> <h1>TODO リスト </h1> <form onSubmit={handleSubmit}> <input name="task" /> <button> 登録 </button> </form> <div> {todos.map((todo) => ( <div key={todo.id} className={todo.checked ? "checked" : "" <input type="checkbox" onChange={() => handleChangeCheckBox(todo.id)} /> {todo.task} <button onClick={() => handleClickDeleteButton(todo.id)}> 削 </div> ))} </div>
  11. 2 state を更新すると React が自動 2 state を更新すると React が自動

    で UI の更新を行う で UI の更新を行う めちゃくちゃ重要:UI = f(state) const handleSubmit = (e) => { e.preventDefault(); const inputText = e.target["task"].value; const nextid = idCounter + 1; setIdCounter(nextid); setTodos([...todos, { id: nextid, task: inputText, checked: false };
  12. SPA = 単一の Web ページのみから構成される Web アプリケーション。ページの書き換えは全 てクライアント側で行う SPA のメリット=画面遷移が超高速化

    React や Vue のような FW を用いることで オブジェクトの破壊的変更を防げたり、イベ ントハンドラの登録が楽になったりする 手動でデータと UI を同期させる必要がなく なる