본문 바로가기

react

[소플] ch 11. 폼

- 사용자로부터 입력을 받기 위해 사용하는 것 

 

1. 제어 컴포넌트 

 

- 사용자가 입력한 값에 접근하고  제어할 수 있도록 해주는 컴포넌트 

- 그 값이 리액트의 통제를 받는 입력 폼 엘리먼트 (input from element)

- 제어 컴포넌트를 사용하면 입력값이 리액트 컴포넌트의 state를 통해 관리됨

 

- HTML 폼에서는 각 엘리먼트가 자체적으로 state를 관리하게 됨 

- <input>, <textarea>, <select>가 각각 내부의 state를 관리하고 있음 

 

- 제어 컴포넌트에서는 모든 데이터를 state에서 관리 

- state 값을 변경할 떄는 setState() 함수를 사용 

- 함수 컴포넌트에서는 useState() 훅을 사용하여 state를 관리 

 

ex)

- <input> 태그의 value={value} 부분은 리액트 컴포넌트의 state에서 값을 가져다 넣어 주는 것 

- state에 들어있는 값이 input에 표시됨

- handleChange() 함수에서는 setValue() 함수를 사용하여 새롭게 변경된 값을 value라는 이름의 state에 저장 

 

- event = 이벤트 객체 

- event.target = 현재 발생한 아벤트의 타겟

- event.target.value = 해당 타겟의 value 속성값

function NameForm(props) {
    const [value, setValue] = useState('');

    const handleChange = (event) => {
        setValue(event.target.value);
    }

    const handleSubmit = (event) => {
        alert('입력한 이름: ' + value);
        event.preventDefault();
    }

    return (
        <form onSubmit={handleSubmit}>
            <label>
                이름:
                <input type="text" value={value} onChange={handleChange}/>
            </label>
            <button type="submit">제출</button>
        </form>
    )
}

 

 

2. textarea 태그 

 

- 여러 줄에 걸쳐서 나올 정도로 긴 텍스트를 입력받기 위한 HTML 태그 

 

HTML

<textarea>
    안녕하세요, 여기에 이렇게 텍스트가 들어가게 됩니다.
</textarea>

 

- 리액트에서는 <textarea> 태그에 value라는 attribute를 사용하여 텍스트를 표시 

 

ex)

- 고객으로부터 요청사항을 입력받기 위한 RequestForm 컴포넌트 

- state로는 value가 있고, 이 값을 <textarea>태그의 value라는 attribute에 넣어줌으로써 화면에 나타나게 됨 

function RequestForm(props) {
    const [value, setValue] = useState('요청사항을 입력하세요.');

    const handleChange = (event) => {
        setValue(event.target.value);
    }

    const handleSubmit = (event) => {
        alert('입력한 요청사항:' + value);
        event.preventDefault(); 
    }

    return (
        <form onSubmit={handleSubmit}>
            <label>
                요청사항:
                <textarea value={value} onChange={handleChange} />
            </label>
            <button type="submit"> 제출 </button>
        </form>
    )
}

 

 

3. select 태그 

 

- 드롭다운(drop-down) 목록을 보여주기 위한 HTML 태그 

- 여러 가지 옵션 중에서 하나를 선택할 수 있는 기능을 제공

 

HTML 

- 현재 선택된 옵션의 경우 selected라는 attribute를 갖고 있음 

<select>
    <option value="apple">사과</option>
    <option value="banana">바나나</option>
    <option selected value="grepe">포도</option>
    <option value="watermelon">수박</option>
</select>

 

-리액트에서는 <option>태그의 selected 속성을 사용하지 않고 <select> 태그에 value라는 attribute를 사용하여 값을 표시

function FruitSelect(props) {
    const [value, setValue] = useState('grape');

    const handleChange = (event) => {
        setValue(event.target.value);
    }

    const handleSubmit = (evnet) => {
        alert('선택한 과일:' + value);
        event.preventDefault();
    }

    return (
        <form onSubmit={handleSubmit}>
            <label>
                과일을 선택하세요:
                <select value={value} onChange={handleChange}>
                    <option value="apple">사과 </option>
                    <option value="banana">바나나 </option>
                    <option value="grape">포도 </option>
                    <option value="watermelon">수박</option>
                </select>
            </label>
            <button type="submit">제출</button>
        </form>
    )
}

 

4. File input 태그 

 

- 디바이스의 저장 장치로부터 사용자가 하나 또는 여러 개의 파일을 선택할 수 있게 해주는 HTML 태그 

- 서버로 파일을 업로드하거나 자바스크립트의 FIie API를 사용해서 파일을 다룰 때 사용 

- 비제어 컴포넌트 

 

<input type="file" />

 

 

5. 여러 개의 입력 다루기 

 

- 여러 개의 state를 선언하여 각각의 입력에 대하여 사용하면 됨 

 

Reservation 컴포넌트 

 

- 아침식사 선택 유무를 입력받기 위한 <input> 태그는 type이 checkbox로 되어 있고, 값이 변경되면 setHaveBreakfast() 함수를 통해 값을 업데이트 

- 방문객 수를 입력받기 위한 <input> 태그는 type이 number로 되어 있고, 값이 변경되면 setNubmerOfGuest() 함수를 통해 업데이트 

function Reservation(props) {
    const [haveBreakfast, setHaveBreakfast] = useState(true);
    const [numberOfGuest, setNumberOfGuest] = useState(2);

    const handleSubmit = (event) => {
        alert(`아침식사 여부:${haveBreakfast}, 방문객 수:${numberOfGuest}`);
        event.preventDefault();
    }

    return (
        <form onSubmit={handleSubmit}>
            <label>
                아침식사 여부:
                <input
                    type="checkbox"
                    checked={haveBreakfast}
                    onChange={(event) => {
                        setHaveBreakfast(event.target.checked);
                    }} />
            </label>
            <br />
            <label>
                방문객 수:
                <input 
                    type="number"
                    value={numberOfGuest}
                    onChange={(event) => {
                        setNumberOfGuest(event.target.value);
                    }} />
            </label>
            <button type="submit">제출</button>
        </form>
    )
}

 

 

6. Input Null Value

 

- 제어 컴포넌트에 value prop을 정해진 값으로 넣으면 코드를 수정하지 않는 한 입력값을 바꿀 수 없음

- value prop은 넣되 자유롭게 입력할 수 있게 만들고 싶다면 값에 undefiend 또는 null을 넣어주면 됨 

 

- input의 값이 hi로 정해져 있어서 값을 바꿀 수 없는 입력 불가 상태였다가 timer에 의해 1초 뒤에 value가 null인 <input>태그가 렌더링 되면서 입력 가능한 상태로 바뀜

ReactDOM.render(<input value="hi" />,rootNode);

setTimeout(function() {
	ReactDOM>render(<input value={null} /> , rootNode);
}, 1000);

 

 

7. 실습 - 사용자 정보 입력받기 

 

- 사용자의 정보를 입력받는 가입 양식 컴포넌트 

 

Signup.jsx

import React, { useState } from "react";

function Signup(props) {
    const [name, setName] = useState(" ");
    const [gender, setGender] = useState("남자");

    const handleChangeName = (event) => {
        setName(event.target.value);
    };

    const handleChangeGender = (event) => {
        setGender(event.target.value);
    }

    const handleSubmit = (event) => {
        alert(`이름:${name}, 성별:${gender}`);
        event.prventDefault();
    };

    return (
        <form onSubmit={handleSubmit}>
            <label>
                이름:
                <input type="text" value={name} onChnage={handleChangeName} />
            </label>
            <label>
                성별:
                <select value={gender} onChange={handleChangeGender} >
                    <option value="남자">남자</option>
                    <option value="여자">여자</option>
                </select>
            </label>
            <button type="submit">제출</button>
        </form>
    )
}

export default Signup;

'react' 카테고리의 다른 글

[소플] ch 13. 합성 vs 상속  (0) 2023.10.30
[소플] ch 12. State 끌어올리기  (0) 2023.10.30
[소플] ch 10. 리스트와 키  (0) 2023.10.28
[소플] ch 9. 조건부 렌더링  (1) 2023.10.28
[소플] ch 8. 이벤트 핸들링  (0) 2023.10.28