#10. React ๋งํฌ์„œ๋น„์Šค ๋“ฑ๋ก ๋ฐ ํŽธ์ง‘ ํ™”๋ฉด ๊ฐœ๋ฐœ(๋“ฑ๋กํ™”๋ฉด ๋””์ž์ธ)

 

#10. React ๋งํฌ์„œ๋น„์Šค ๋“ฑ๋ก ๋ฐ ํŽธ์ง‘ ํ™”๋ฉด ๊ฐœ๋ฐœ(๋“ฑ๋กํ™”๋ฉด ๋””์ž์ธ)

#9. ์ดˆํ™”๋ฉด ๋””์ž์ธ ( CSS ์ ์šฉ ๋ฐ ํ™”๋ฉด Component์ œ์ž‘ ) #9. ์ดˆํ™”๋ฉด ๋””์ž์ธ ( CSS ์ ์šฉ ๋ฐ ํ™”๋ฉด Component์ œ์ž‘ ) #8. ํ”„๋ก ํŠธ์—”๋“œ ํ™”๋ฉด๊ฐœ๋ฐœ (component ์ œ์ž‘) #8. ํ”„๋ก ํŠธ์—”๋“œ ํ™”๋ฉด๊ฐœ๋ฐœ (component ์ œ์ž‘) #7. ํ”„๋ก ํŠธ์—”๋“œ

firstvalue.tistory.com

 

๋“ฑ๋ก ๋ฐ ํŽธ์ง‘ํ™”๋ฉด ๋””์ž์ธ์ด ๋˜์—ˆ์œผ๋‹ˆ, ์ด์   ์ž…๋ ฅ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด ๋ณด์ž.

 

Reactํ™”๋ฉด์—์„œ ๊ฐ ํ•ญ๋ชฉ์˜ Input Value์„ ๊ฐ€์ ธ์˜ค๊ธฐ

โŒ˜ links.create.jsx ( ์œ„์น˜: linkservice/client/src/component/links.create.jsx)

---------------------------------------------------------------------------------------------------

 

Input value๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์€ ์•„๋ž˜ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌ ํ•˜์‹œ๋ฉด ๋œ๋‹ค.

1)   input์—์„œ value์„ ๋‹ด๊ธฐ ์œ„ํ•ด์„œ state์„ ์ƒ์„ฑ( jsonํ˜•ํƒœ๋กœ ๋ฐ›๊ธฐ์œ„ํ•ด์„œ ์„ ์–ธ)

const [values, setValues] = useState({})

 

2)   input์—์„œ ๊ฐ’์„ ์ž…๋ ฅํ•  ๋•Œ value state๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” onChange handleํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

const handleChange = (e) => {
        const { name, value } = e.target
        setValues((prevValues) => ({
            ...prevValues,
            [name]: value,
        }))
}

์œ„ ์ฝ”๋“œ๋Š” input type=”text”์— ์ž…๋ ฅํ•˜๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ์‹œ ํ•ด๋‹น input์˜ name๊ณผ value์„ ๊ฐ€์ ธ์™€ ๊ธฐ์กด state์— ์ƒˆ๋กœ์šด state์„ ์ถ”๊ฐ€ํ•˜๋Š” ํ•ธ๋“ค ํ•จ์ˆ˜์ด๋‹ค.

preValues๊ฐ’์— setValues๊ฐ’์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

3) submit ํ•ธ๋“ค ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด values์˜ validation์ฒดํฌ์™€  API ํ˜ธ์ถœํ•˜์—ฌ ์„œ๋น„์Šค์— ์ „๋‹ฌํ•˜๊ณ ,

      useRef์„ ํ†ตํ•ด Input์— focus ์ฃผ๊ธฐ

 

useRef์„ ์–ธ

import React, { useState, useRef } from "react"

const ์„ ์–ธ

const inputFocus = useRef(null)

 handleSubmit์— validation ์ฒดํฌ ์‹œ current focus()์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

if (!values.name) {

     alert('๋งํฌ๋ช…์€ ํ•„์ˆ˜๊ฐ’์ž…๋‹ˆ๋‹ค.')
     inputFocus.current.focus()

     return false

}

 

4)   handleSubmit ํ•จ์ˆ˜

const handleSubmit = async (e) => {

        e.preventDefault();

        const formData = new FormData();
        if (!values.name) {
            alert('๋งํฌ๋ช…์€ ํ•„์ˆ˜๊ฐ’์ž…๋‹ˆ๋‹ค.')
            inputFocus.current.focus()
            return false
        }
        if (!image && !values.imageurl) {
            if (!window.confirm('์ด๋ฏธ์ง€๊ฐ€ ์—†๋Š” ๋งํฌ์ •๋ณด๋ฅผ ๋“ฑ๋กํ•˜๊ฒ ์Šต๋‹ˆ๊นŒ?')) {
                return false
            }
         }
         
         // input ํ•ญ๋ชฉ์˜ values์„ db์— ์ €์žฅํ•˜๋Š” API๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
         
          linkService.createLink(values).then(
            (res) => {
                alert(res.data.message)
                window.location.reload();           
               }
           )
    }

 

5)   ๋ Œ๋”๋ง ๋˜๋Š” input์— onChange() ํ•จ์ˆ˜๋กœ handleChange()ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

<input type="text" name="name"
                defaultValue=""
                className="input-css"
                onChange={handleChange}
            />

 

6)   form ํƒœ๊ทธ์— onSubmit ํ•จ์ˆ˜๋กœ handleSubmitํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

<form  onSubmit={handleSubmit}>

 

Input Value ์ž‘์—…์€ ์ด๊ฒƒ์œผ๋กœ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์œผ๋‚˜์ถ”๊ฐ€์ ์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋ฏธ๋ฆฌ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ,

์ด๋ฏธ์ง€๋ฅผ ์ง์ ‘ Drag&Drop ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ์ž‘ํ•ด๋ณด์ž.

 

 

+ Recent posts