複数のInputを扱う

# はじめに
前回は「**制御コンポーネントの作成**」について試してみました。
今日はコンポーネントに複数のInputを扱う場合について書いてみます。

https://qiita.com/kento1109/items/dc6bf55a03156c4d246a

## 前回からの拡張
まず、一番簡単なのは何も考えずにinput分だけstate変数などを作ってあげることです。
以下のような感じです。

```react
import React from 'react';
import styled from 'styled-components';

const Input = styled.input`
  height: 60px;
  width: 450px;
  border: 1px solid #BEBEBE;
  box-sizing: border-box;
  border-radius: 6px;
  padding-left: 16px;
  font-size: 24px;
  color: #222222;
  ::placeholder {
    color: #C1C1C1;
  }
`;

type Props = {
    value: string,
    onChange: (e: React.ChangeEvent<HTMLInputElement>) => void,
    placeholder: string,
};
  
const InputText = (props: Props) => {
  const {
    value,
    onChange,
    placeholder,
  } = props;
  return (
    <Input
      type=""
      value={value}
      placeholder={placeholder}
      onChange={onChange}
    />
  );
};
  
export default InputText;
```

```react
import React from 'react';
import styled from 'styled-components';

const Input = styled.input`
  height: 60px;
  width: 450px;
  border: 1px solid #BEBEBE;
  box-sizing: border-box;
  border-radius: 6px;
  padding-left: 16px;
  font-size: 24px;
  color: #222222;
  ::placeholder {
    color: #C1C1C1;
  }
`;

type Props = {
    isChecked: boolean,
    onChange: (e: React.ChangeEvent<HTMLInputElement>) => void,
};
  
const InputCheckbox = (props: Props) => {
  const {
    isChecked,
    onChange,
  } = props;
  return (
    <Input
      type="checkbox"
      checked={isChecked}
      onChange={onChange}
    />
  );
};
  
export default InputCheckbox;
```

```react
import React, { useState, useCallback, useMemo } from 'react';
import logo from './logo.svg';
import './App.css';

import InputText from './components/elements/inputText';
import InputCheckbox from './components/elements/inputCheckbox';

const App=()=> {
  const [valueState, setValue] = useState('');
  const [checkedState, setChecked] = useState(false);
  const handleChangeValue = (e: React.ChangeEvent<HTMLInputElement>) => {
    setValue(e.target.value);
  };
  const handleChangeChecked = (e: React.ChangeEvent<HTMLInputElement>) => {
    setChecked(e.target.checked);
  };
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <InputText
            value={valueState}
            placeholder="ID"
            onChange={handleChangeValue}
        />
        <InputCheckbox
            isChecked={checkedState}
            onChange={handleChangeChecked}
        />
      </header>
    </div>
  );
}

export default App;
```

##もう少しスマートに書き直す
`state`などはまとめることができます。

```react
import React, { useState, useCallback, useMemo } from 'react';
import logo from './logo.svg';
import './App.css';

import InputText from './components/elements/inputText';
import InputCheckbox from './components/elements/inputCheckbox';

type Form = {
  value: string,
  checked: boolean,
};

const App=()=> {
  const [stateForm, setForm] = useState({
    value: '',
    cheked: false,
  });

  const handleChangeValue = (e: React.ChangeEvent<HTMLInputElement>) => {
    setForm({...stateForm, value: e.target.value});
  };
  const handleChangeChecked = (e: React.ChangeEvent<HTMLInputElement>) => {
    setForm({...stateForm, cheked: e.target.checked});
  };
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <InputText
            value={stateForm.value}
            placeholder="ID"
            onChange={handleChangeValue}
        />
        <InputCheckbox
            isChecked={stateForm.cheked}
            onChange={handleChangeChecked}
        />
      </header>
    </div>
  );
}

export default App;
```

ハンドラでは`...stateForm`で展開してあげる形で渡してあげるのがコツみたいです。