๋งํฌ์๋น์ค ๋ฑ๋กํ๋ฉด์์ Input Value์ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ์์๋ค.
๊ทธ๋ผ ์ด๋ฏธ์ง ๋ฑ๋ก์ ์ํ Drag&Drop ์ด๋ฏธ์ง ์ ๋ก๋๋ฅผ ์ ์ํด๋ณด์.
#11. Reactํ๋ฉด์์ ๊ฐ ํญ๋ชฉ์ Input Value์ ๊ฐ์ ธ์ค๊ธฐ
โโ์ด๋ฏธ์งDrag Drop๊ธฐ๋ฅ ๋ฐ Preview ๊ธฐ๋ฅ
โ links.create.jsx ( ์์น: linkservice/client/src/component/links.create.jsx)
---------------------------------------------------------------------------------------------------
1) ์ด๋ฏธ์ง๋ฅผ ๋ฏธ๋ฆฌ ๋ณผ ์ ์๋ ๊ธฐ๋ฅ
preview const ์ ์ธ
const [preview, setPreview] = useState('assets/default.jpg')
๐ ์ด๋ฏธ์ง๊ฐ ์์ ๋ default์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ ์ฃผ๊ธฐ ์ํด์ public/assets/default.jpg์ ๋ฃ์ด๋๋ค.
( ์ํ ์ด๋ฏธ์ง๋ ์ธํฐ๋ท ๊ฒ์์ผ๋ก ์ ๋นํ ๊ณณ์์ ๊ฐ์ ธ์ค๋ฉด ๋๋ค.)
img src ์ preview const์ ์ง์
<div className="img_wrap" >
<img src = {preview}
alt='์ด๋ฏธ์ง' className="img_box" />
<input multiple={false} name='imageurl'/>
</div>
handleChange() ํจ์์ target name์ด imageurl์ผ ๊ฒฝ์ฐ setPreview๊ฐ์ ์ ํ ํ๋ค.
const handleChange = (e) => {
const { name, value } = e.target
setValues((prevValues) => ({
...prevValues,
[name]: value,
}))
// ์ด ๋ถ๋ถ์ ์ถ๊ฐ
if (e.target.name === 'imageurl') {
setPreview(e.target.value)
}
}
2) ์ด๋ฏธ์ง Drag&Drop๊ธฐ๋ฅ ๊ตฌํ
Drag Drop๊ธฐ๋ฅ์ React์์ ์ ๊ณต๋๋ react-dropzone ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
๐ ๊ณต์๋ฌธ์ : https://github.com/react-dropzone/react-dropzone
ํฐ๋ฏธ๋์์ yarn add react-dropzone ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ ๋ค์,
useDropzone์ ์ ์ธํ๋ค.
import {useDropzone} from 'react-dropzone'
image state์ ์ ์ธํ๋ค.
const [image, setImage] = useState(null)
onDrop ๊ด๋ จ ํจ์๋ฅผ ์์ฑํ๋ค.
onDropํจ์๋ ์ด๋ฏธ์ง dropํ ์ฒ๋ฆฌํด์ผ ํ๋ ์์ ๋ด์ฉ์ ๋ฐ์ํ๋ฉด ๋๋ค.
์ฌ๊ธฐ์๋ ํ์ผ์ ์ฝ์ด ์ฒ๋ฆฌ๋ ๋ก์ง์ ๋ฐ์ ํ๋ค.
function onDrop(acceptedFiles) {
const reader = new FileReader();
const file = acceptedFiles
// ์ด๋ฏธ์ง ํ์ผ์ ์ฝ์ด setImage ๋ก ์ ์ฅ
if (file) {
reader.readAsDataURL(file[0]);
setImage(file[0]);
}
// onDrop๋๋ฉด preview ๋๊ฒ ์ฒ๋ฆฌํ๊ณ , ๊ธฐ์กด ์ด๋ฏธ์ง url์ ๋ณด๋ฅผ ๊ณต๋ฐฑ์ฒ๋ฆฌํ๋ค.
reader.onload = (e) => {
setPreview(reader.result);
document.getElementsByName("imageurl")[0].value = ''
};
}
readAsDataURL ๋ฉ์๋๋ก imageํ์ผ์ base64๋ก ์ธ์ฝ๋ฉ ๋ ๊ฐ์ผ๋ก ๋ฐํํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ setPreview(๋ฏธ๋ฆฌ๋ณด๊ธฐ) ์ ๊ฐ์ ๋ฃ๊ณ , setImage์ ์ด๋ฏธ์ง ํ์ผ์ ๋ณด๋ฅผ ๋ณด๊ดํ๋ค. ๋ง์ง๋ง์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์ง์ ๋ฑ๋กํ์ผ๋ฏ๋ก,
๋งํฌ์ ๋ณด URL(imageurl) ํญ๋ชฉ์ ๋น์ด๋ค.
Dropzone์ Props์ธ getRootProps์ getInputProps์ง์ ํ๋ค.
const {getRootProps, getInputProps} = useDropzone({onDrop})
์ด๋ฏธ์ง ์์ญ(zone)์ div์ props๋ค์ ์ ์ธํ๋ค.
<div className="img_wrap" {...getRootProps()} >
<img src = {preview}
alt='์ด๋ฏธ์ง' className="img_box" />
<input {...getInputProps()} multiple={false} name='imageurl'/>
</div>
๐(์ค์) getRootProps๋ ์ด๋ฏธ์ง ์์ญ์ div์ , getInputProps๋ input์ ์ ์ธํ๋ฉด ๋๋ค.
์ด๋ฏธ์ง ์ ์ฅํ๊ธฐ ์ํด์ handleSubmit์ ๊ด๋ จ ๋ด์ฉ์ ์ถ๊ฐํ๋ค.
์ด๋ฏธ์ง๊ฐ ์์ ๊ฒฝ์ฐ formDataํํ๋ก ์ ๋ก๋๋ฅผ ์งํํ๋ค.
linkService.createLink(values).then(
(res) => {
if (image) {
//์ด๋ฏธ์ง ํญ๋ชฉ์ด ์์๊ฒฝ์ฐ formData์ ๋ฃ์ด API์ ํธ์ถํ๋ค.
formData.append('image', image)
linkService.uploadImage(formData).then(
(res)=> {// console.log(res)
}
)}
alert(res.data.message)
window.location.reload();
}
)
๋ค์ํธ์๋ ์ค์ DB ์ ์ด๋ฏธ์ง ํ์ผ ์ ์ฅ (๋ฑ๋ก) ๊ธฐ๋ฅ์ ๋ง๋ค์ด ๋ณด์.