ページ外観の作成

ユーザー認証で追加するページの外観を作成します。

コンポーネントの分割

それぞれのページにあるナビゲーションメニューのヘッダについては、表示されているメニューは違いますがToDoページとほぼ同じものであるため、ToDoページで作成したNavigationHeaderコンポーネントを使用します。

ヘッダ以外の部分については、それぞれのページ内では用途が同じ情報のみ扱っているため、それぞれのページ全体をコンポーネントとします。

  • NavigationHeader:ナビゲーションメニューのヘッダ
  • Welcome:トップページのウェルカムメッセージを表示する
  • Signup:サインアップフォームを表示する
  • Login:ログインフォームを表示する

これらのコンポーネントを、ToDoページのコンポーネントと並べて次の階層構造となるように作成していきます。

  • NavigationHeader(作成済み)
  • Welcome
  • Signup
  • Login
  • TodoBoard(作成済み)
    • TodoForm
    • TodoFilter
    • TodoList
      • TodoItem

コンポーネントの作成

Todoページを作成した時と同じように、spa-restapi-handson/design-mockに配置されているデザインモックを元に、それぞれのコンポーネントを作成していきます。

Welcomeコンポーネント

まず、Welcomeコンポーネントを作成します。

src/components/Welcome.tsx

import React from 'react';
import './Welcome.css';

export const Welcome: React.FC = () => {
  return (
    <div className="Welcome_content">
      <div>
        <h1 className="Welcome_title">Welcome</h1>
        <div className="Welcome_buttonGroup">
          <button className="Welcome_button">登録する</button>
        </div>
      </div>
    </div>
  );
};

src/components/Welcome.css

.Welcome_content {
  height: 90vh;
  display: flex;
  justify-content: center;
  align-items: center;
  overflow: auto;
}
.Welcome_title {
  font-size: 60px;
}

.Welcome_buttonGroup {
  text-align: center;
}
.Welcome_button {
  width: 175px;
  cursor: pointer;
  line-height: 1;
  border: none;
  font-size: 1rem;
  color: white;
  background-color: darkgreen;
  border-radius: 5px;
  padding: 15px 30px;
}
.Welcome_button:hover {
  background-color: green;
}

Signupコンポーネント

続いて、Signupコンポーネントを作成します。

src/components/Signup.tsx

import React from 'react';
import './Signup.css';

export const Signup: React.FC = () => {
  return (
    <div className="Signup_content">
      <div className="Signup_box">
        <div className="Signup_title">
          <h1>ユーザー登録</h1>
        </div>
        <div className="Signup_item">
          <div className="Signup_label">名前</div>
          <input type="text"/>
        </div>
        <div className="Signup_item">
          <div className="Signup_label">パスワード</div>
          <input type="password" />
        </div>
        <div className="Signup_buttonGroup">
          <button className="Signup_button">登録する</button>
        </div>
      </div>
    </div>
  );
};

src/components/Signup.css

.Signup_content {
  height: 90vh;
  display: flex;
  justify-content: center;
  align-items: center;
  overflow: auto;
  text-align: center;
}
.Signup_box {
  width: 50%;
}
.Signup_title {
  height: 70px;
}
.Signup_title h1 {
  margin: 10px 0;
}
.Signup_form {
  width: 50%;
  padding: 0 25%;
}

.Signup_item {
  margin: 20px 0;
  height: 75px;
}
.Signup_item input {
  width: 100%;
  border-radius: 5px;
  padding: 8px;
  border: solid 1px lightgray;
  background-color: #fafbfc;
  font-size: 16px;
  margin-top: 10px;
  outline: none;
}
.Signup_item input:focus {
  background-color: white;
}
.Signup_label {
  text-align: left;
}

.Signup_buttonGroup {
  text-align: center;
  margin-top: 40px;
}
.Signup_button {
  width: 175px;
  cursor: pointer;
  line-height: 1;
  border: none;
  font-size: 1rem;
  color: white;
  background-color: darkgreen;
  border-radius: 5px;
  padding: 15px 30px;
}
.Signup_button:hover {
  background-color: green;
}

Loginコンポーネント

続いて、Loginコンポーネントを作成します。

src/components/Login.tsx

import React  from 'react';
import './Login.css';

export const Login: React.FC = () => {
  return (
    <div className="Login_content">
      <div className="Login_box">
        <div className="Login_title">
          <h1>ログイン</h1>
        </div>
        <div className="Login_item">
          <div className="Login_label">名前</div>
          <input type="text" />
        </div>
        <div className="Login_item">
          <div className="Login_label">パスワード</div>
          <input type="password" />
        </div>
        <div className="Login_buttonGruop">
          <button className="Login_button">ログインする</button>
        </div>
      </div>
    </div>
  );
};

src/components/Login.css

.Login_content {
  height: 90vh;
  display: flex;
  justify-content: center;
  align-items: center;
  overflow: auto;
  text-align: center;
}
.Login_box {
  width: 50%;
}
.Login_title {
  height: 70px;
}
.Login_title h1 {
  margin: 10px 0;
}
.Login_form {
  width: 50%;
  padding: 0 25%;
}

.Login_item {
  margin: 20px 0;
  height: 75px;
}
.Login_item input {
  width: 100%;
  border-radius: 5px;
  padding: 8px;
  border: solid 1px lightgray;
  background-color: #fafbfc;
  font-size: 16px;
  margin-top: 10px;
  outline: none;
}
.Login_item input:focus {
  background-color: white;
}
.Login_label {
  text-align: left;
}

.Login_buttonGruop {
  text-align: center;
  margin-top: 40px;
}
.Login_button {
  width: 175px;
  cursor: pointer;
  line-height: 1;
  border: none;
  font-size: 1rem;
  color: white;
  background-color: darkgreen;
  border-radius: 5px;
  padding: 15px 30px;
}
.Login_button:hover {
  background-color: green;
}

動作確認

ページを表示して確認したいところですが、複数のページをそれぞれ確認しづらいため、次に実装するURLルーティングが終わってから確認することにします。

results matching ""

    No results matching ""