Frontend Bootcampを読む Step1-05
Microsoftが公開していたFrontend Bootcampを読み進めていくメモ
自分なりの適当な翻訳なので間違いがあるかもしれません。
また公開されたばかりで現在進行形で更新されているので僕が読んだ時とは内容が少し変わっているかもしれません。
Step1-05 Demo: Building a Static Page
Thinking in Reactで説明されている手順に従って、TODOアプリを作っていきます。
まず最初に、アプリケーションをCompoentの階層に分割していきます。このアプリケーションでは、4つに分割します。
- TodoHeader
- TodoList
- TodoListItem
- TodoFooter
このアプリケーションのモックアップを、step1-05/TodoApp.html
で確認することができます。
TodoHeader
Componentは全てsrc/component
ディレクトリに格納するので、ディレクトリを作成してください。作ったら、TodoHeader ComponentをTodoHeader.tsx
というファイルに作ります。.tsx
拡張子は、このファイルがTypeScript + Reactでコードを書いていると表します。
TypeScriptについては後で説明されます。今わかるのは、TypeScriptファイルにJavaScriptを書くことができるということです。
import React from "react"; export class TodoHeader extends React.Component<any, any> { render() { return ( <header> <h1>todos</h1> <div className="addTodo"> <input className="textfield" placeholder="add todo" /> <button className="submit">Add</button> </div> <nav className="filter"> <button className="completed">all</button> <button>active</button> <button>completed</button> </nav> </header> ); }; }
Reactでは、
class
をclassName
にする必要があります。
TodoListItem
要素が繰り返し表示されている場合は、基本新しいComponentを作った方がいいです。propsを使えば、それらの要素を単一のComponentにすることができます。TodoListItemが、それに当てはまります。
import React from 'react'; export class TodolistItem extends React.Component<any, any> { render() { return ( <li className="todo"> <label> <input type="checkbox" /> Todo 1 </label> </li> ); } }
これは、クラスの代わりに関数として作ることもできます
export const TodoListItem = (props) => {}
Exercise
TodoFooter
- TodoFooter Componrntを
component
ディレクトリに作ってください。<footer>
タグとその子要素をstep1-05/TodoApp.html
からコピーします。TodoFooterは関数またはクラスです。 class
をcalssName
に変更してください。
TodoList
- TodoFooterと同じようにTodoList Componentを追加してください。クラスと関数どちらでもいいです。
- TodoListItemをインポートし、
- の内側に4つ追加してください。
- オプションでArrayのmapなどを利用して作成してみてください。
App.tsx
これらのComponentをApp.tsxにインポートし、TodoHeaderの下に配置してください。
// TodoFooter export const TodoFooter = props => { return ( <footer> <span>4 items left</span> <button class="submit">Clear Completed</button> </footer> ) } // TodoList import { TodoListItem } from "./TodoListItem; export const TodoList = props => { return ( <ul className= "todos"> { [1, 2, 3, 4].map((i) => <TodoListItem key={i} text={"Todo " + i.toString()} />)} </ul> ) }; // TodoListItem <input type="checkbox" /> {this.props.text} // App.tsx import React from "react"; import { TodoHeader } from "./components/TodoHeaderr"; import { TodoList } from "./components/TodoList"; import { TodoFooter } from "./component/TodoFooter"; export class TodoApp extends Reract.Component<any, any> { render() { return ( <div> <TodoHeader /> <TodoList /> <TodoFooter /> </div> ); } }