0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

5分で作る基本のReactフォーム

Last updated at Posted at 2022-04-13

やりたいこと

フォームから名前を入力すると、リアルタイムで「あなたの名前は○○です。」と表示するReactアプリケーションを作ってみたいと思います。

やり方

Reactアプリケーションを作成

※ Nodeやnpmがインストールされていない場合は事前にインストールしてください。
Node.js公式サイト

ローカルの任意の場所で以下のコマンドを打つ

npx create-react-app my-app
cd my-app
npm start

表示されるアドレスにブラウザからアクセス

Compiled successfully!

You can now view my-app in the browser.

  Local:            http://localhost:3000
  On Your Network:  http://192.168.1.2:3000

Note that the development build is not optimized.
To create a production build, use npm run build.

webpack compiled successfully

こういう画面が表示されればOK
スクリーンショット 2022-04-14 3.11.37.png

フォームの編集

フォーム要素の配置

src/App.jsを以下のように編集

function App() {
  return(
    <div>
     <p>名前を入力してください。</p>
     <input value=""/>
     <p>あなたの名前は○○です。</p>
    </div>
  )
}

export default App;

画面を確認して、名前のフォーム要素が表示されていることを確認
スクリーンショット 2022-04-14 4.02.55.png

入力時の処理

src/App.jsを以下のように編集する

import { useState } from 'react';

function App() {
  const [input, setInput] = useState('太郎');

  return(
    <div>
     <p>名前を入力してください。</p>
     <input value={input} onInput={e => setInput(e.target.value)} />
     <p>あなたの名前は{input}です。</p>
    </div>
  )
}

export default App;

ポイントは以下。

  • import { useState } from 'react';useStateというReactフックをインポートする(Rectフック = クラス等を書かずにステートを管理できる仕組み)
import { useState } from 'react';
  • フォームの値を持つためのinputという変数を用意し、setInputinputの値が変わるようにuseStateフックを使って定義。初期値は「太郎」とする。
const [input, setInput] = useState('太郎');
  • フォームのonInputイベントでsetInputを呼び出すようにする
<input value={input} onInput={e => setInput(e.target.value)} />
  • 「あなたの名前は○○です。」の部分にinputを埋め込む
<p>あなたの名前は{input}です。</p>

フォームに入力し、リアルタイムで「あなたの名前は○○です。」が更新されることを確認
ezgif.com-gif-maker (1).gif

スタイルの編集

必要であればsrc/App.jsimport './App.css'とクラスを付与してscr/App.cssを編集

import './App.css';
import { useState } from 'react';

function App() {
  const [input, setInput] = useState('太郎');

  return(
    <div class="wrapper">
     <p>名前を入力してください。</p>
     <input value={input} onInput={e => setInput(e.target.value)} />
     <p class="result">あなたの名前は{input}です。</p>
    </div>
  )
}

export default App;
.wrapper {
  display: flex;
  flex-direction: column;
  width: 90%;
  height: 100vh;
  border-radius: 5px;
  background-color: #f2f2f2;
  padding: 40px;
}

input {
  width: 100%;
  margin: 8px 0;
  display: inline-block;
  border: 1px solid #ccc;
  box-shadow: inset 0 1px 3px #ddd;
  border-radius: 4px;
  box-sizing: border-box;
  padding-left: 20px;
  padding-right: 20px;
  padding-top: 12px;
  padding-bottom: 12px;
}

.result {
  font-size: 100px;
  margin: auto;
}

CSSはこちらをほぼコピペしました

名前の表示をクソデカにしてみた
ezgif.com-gif-maker (3).gif

できあがり!

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?