소스:
https://github.dev/braverokmc79/react-investmement
import React, { useState } from "react"; import classes from "./UserInput.module.css"; export type UserInputType = { currentSavings: number; yearlyContribution: number; expectedReturn: number; duration: number; }; const initialUserInput: UserInputType = { currentSavings: 10000, yearlyContribution: 1200, expectedReturn: 7, duration: 10, }; interface UserInputProps { onCalculate: (userInput: UserInputType) => void; } const UserInput: React.FC<UserInputProps> = (props) => { const [userInput, setUserInput] = useState<UserInputType>(initialUserInput); const submitHandler = (event: React.FormEvent) => { event.preventDefault(); props.onCalculate(userInput); }; const resetHandler = () => { setUserInput(initialUserInput); }; const inputChangeHandler = (input: keyof UserInputType, value: string) => { //inputChangeHandler 함수에서 입력 값을 숫자로 변환(+value)하도록 했습니다. //이는 입력된 문자열 값을 숫자로 변환하여 userInput 상태에 저장합니다. setUserInput((prevInput) => { return { ...prevInput, [input]: +value }; }); }; return ( <form onSubmit={submitHandler} className={classes.form}> <div className={classes['input-group']}> <p> <label htmlFor="current-savings">현재 저축액 ($)</label> <input onChange={(event) => inputChangeHandler("currentSavings", event.target.value) } type="number" id="current-savings" value={userInput.currentSavings} /> </p> <p> <label htmlFor="yearly-contribution">연간 저축액 ($)</label> <input onChange={(event) => inputChangeHandler("yearlyContribution", event.target.value) } type="number" id="yearly-contribution" value={userInput.yearlyContribution} /> </p> </div> <div className={classes['input-group']}> <p> <label htmlFor="expected-return">예상 이자율 (연간 %)</label> <input onChange={(event) => inputChangeHandler("expectedReturn", event.target.value) } type="number" id="expected-return" value={userInput.expectedReturn} /> </p> <p> <label htmlFor="duration">투자 기간 (년)</label> <input onChange={(event) => inputChangeHandler("duration", event.target.value) } type="number" id="duration" value={userInput.duration} /> </p> </div> <p className={classes.actions}> <button onClick={resetHandler} type="reset" className={classes.buttonAlt}> 초기화 </button> <button type="submit" className={classes.button}> 계산 </button> </p> </form> ); }; export default UserInput;
이 코드는 React로 작성된 사용자 입력 폼 컴포넌트입니다. 이 컴포넌트는 사용자가 재무 계산에 필요한 입력 값을 제공할 수 있도록 합니다.
코드의 주요 부분과 동작을 아래에 설명합니다.
주요 컴포넌트 및 기능
1.UserInputType:
- UserInputType는 사용자의 입력 값을 정의하는 타입입니다. 입력 값으로는 현재 저축액, 연간 저축액, 예상 연간 이자율, 투자 기간이 있습니다.
export type UserInputType = { currentSavings: number; yearlyContribution: number; expectedReturn: number; duration: number; };
2.initialUserInput:
- initialUserInput는 사용자 입력의 초기 값을 정의합니다.
const initialUserInput: UserInputType = { currentSavings: 10000, yearlyContribution: 1200, expectedReturn: 7, duration: 10, };
3.UserInputProps:
- UserInputProps는 컴포넌트가 받을 수 있는 props의 타입을 정의합니다. 여기서는 계산을 위한 onCalculate 함수가 포함됩니다.
interface UserInputProps { onCalculate: (userInput: UserInputType) => void; };
4.UserInput 컴포넌트:
- UserInput는 상태를 관리하고 사용자 입력을 처리하는 함수형 컴포넌트입니다
const UserInput: React.FC<UserInputProps> = (props) => { const [userInput, setUserInput] = useState<UserInputType>(initialUserInput);
5.submitHandler:
- submitHandler는 폼이 제출될 때 호출되는 함수로, 폼 제출을 막고 onCalculate 함수에 현재 사용자 입력 값을 전달합니다.
const submitHandler = (event: React.FormEvent) => { event.preventDefault(); props.onCalculate(userInput); };
6.resetHandler:
- resetHandler는 초기 입력 값으로 폼을 재설정하는 함수입니다.
const resetHandler = () => { setUserInput(initialUserInput); };
7.inputChangeHandler:
- inputChangeHandler는 입력 값이 변경될 때 호출되며, 입력된 값을 숫자로 변환하여 상태를 업데이트합니다.
const inputChangeHandler = (input: keyof UserInputType, value: string) => { setUserInput((prevInput) => { return { ...prevInput, [input]: +value }; }); };
8.폼 구성:
- JSX를 사용하여 폼의 구조를 정의합니다. 각각의 입력 필드는 inputChangeHandler를 사용하여 상태를 업데이트합니다.
return ( <form onSubmit={submitHandler} className={classes.form}> <div className={classes['input-group']}> <p> <label htmlFor="current-savings">현재 저축액 ($)</label> <input onChange={(event) => inputChangeHandler("currentSavings", event.target.value) } type="number" id="current-savings" value={userInput.currentSavings} /> </p> <p> <label htmlFor="yearly-contribution">연간 저축액 ($)</label> <input onChange={(event) => inputChangeHandler("yearlyContribution", event.target.value) } type="number" id="yearly-contribution" value={userInput.yearlyContribution} /> </p> </div> <div className={classes['input-group']}> <p> <label htmlFor="expected-return">예상 이자율 (연간 %)</label> <input onChange={(event) => inputChangeHandler("expectedReturn", event.target.value) } type="number" id="expected-return" value={userInput.expectedReturn} /> </p> <p> <label htmlFor="duration">투자 기간 (년)</label> <input onChange={(event) => inputChangeHandler("duration", event.target.value) } type="number" id="duration" value={userInput.duration} /> </p> </div> <p className={classes.actions}> <button onClick={resetHandler} type="reset" className={classes.buttonAlt}> 초기화 </button> <button type="submit" className={classes.button}> 계산 </button> </p> </form> );
이 컴포넌트는 사용자가 입력한 데이터를 실시간으로 반영하고, 폼 제출 시 해당 데이터를 부모 컴포넌트로 전달합니다. 초기화 버튼을 누르면 폼의 값을 초기 값으로 재설정합니다.
댓글 ( 0)
댓글 남기기