๐ŸŒฑ [project #1] ์ฒซ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฒช์€ ์—๋Ÿฌ๋“ค

soor.devยท2021๋…„ 6์›” 16์ผ
0

Project

๋ชฉ๋ก ๋ณด๊ธฐ
1/8

ํ˜„์žฌ 2์ฃผ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ด๋‹ค.
ํ”„๋ก ํŠธ๋ฅผ ๋งก์•„ ๋ฆฌ์•กํŠธ์™€ ๋ฆฌ์•กํŠธํ›…์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋ธ”๋กœ๊น… ํ•ด์•ผ๋  ๊ฒƒ๋“ค์ด ๋„ˆ๋ฌด ๋งŽ์•˜๋‹ค. ์ง„์งœ ๋‹ค ๊นŒ๋จน๊ธฐ ์ „์— ๋Œ€์ถฉ์ด๋ผ๋„ ์ ์–ด๋ด์•ผ๊ฒ ๋‹ค.

  • input ์†์„ฑ๊ฐ’ type, required ๋“ฑ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ถ€๋ชจ ํƒœ๊ทธ๊ฐ€ form์ธ์ง€ ๋จผ์ € ํ™•์ธํ•ด ๋ณด์ž.

  • img url ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋Š”๋ฐ ์ด๊ฒŒ ์ ˆ๋Œ€ ์ž‘๋™์„ ์•ˆ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์•Œ๊ณ ๋ณด๋‹ˆ ์„œ๋ฒ„์ธก data type ์„ long text๋กœ ์„ค์ •ํ•ด ์ค˜์•ผ ๋๋˜๊ฒƒ. ์™œ๋ƒํ•˜๋ฉด ๋ณดํ†ต varchar 255๋Š” 255์ž๊ฐ€ ์ตœ๋Œ€์ด๊ธฐ ๋•Œ๋ฌธ. base64๋กœ ์ธ์ฝ”๋”ฉ๋˜์„œ ๋‚˜์˜ค๋Š” ๊ฐ’์„ ๋ณด๋ฉด ์–ด๋งˆ์–ด๋งˆํ•˜๊ฒŒ ๊ธธ๋‹ค. ์ฝ˜์†”์ฐฝ ์••์‚ด๊ฐ.. ์ด๋ ‡๊ฒŒ ์—๋Ÿฌ ํ•˜๋‚˜ ์‹œ์›ํ•˜๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‹ค.

  • ํŽ˜์ด์ง€ ์ด๋™ํ•  ๋•Œ <a href="#"></a> ์•ˆ์— ๋„ฃ์œผ๋‹ˆ๊นŒ ์ž˜๋๋‹ค. href๋กœ ๋ฐ”๋กœ ์ด๋™ํ•˜๋‹ˆ๊นŒ ์ƒˆ๋กœ๊ณ ์นจ์ด ๊ณ„์†๋˜์–ด ๋ฌธ์ œ ๋ฐœ์ƒ์˜ ์›์ธ์ด ๋˜์—ˆ์—ˆ๋‹ค.

<a href="#">
  <button className="nav-post nav-btn" onClick={this.moveToNewpost} > New post </button>
</a>
  • input type="file" ์Šคํƒ€์ผ๋ง ํ•˜๋Š” ๋ฒ•. label์„ ์‚ฌ์šฉํ•˜๊ณ , input์€ opacity : 0 ์œผ๋กœ ์•ˆ๋ณด์ด๊ฒŒ ์ˆจ๊ฒผ๋‹ค. label์„ ํด๋ฆญํ•˜๋ฉด input์ด ์—ด๋ฆฌ๋Š” ํŠน์„ฑ์„ ์ด์šฉํ•˜์—ฌ ํ•œ ์Šคํƒ€์ผ๋ง. ์—„์ฒญ ์œ ์šฉํ•˜๊ฒŒ ์ž˜ ์“ธ ๊ฒƒ ๊ฐ™๋‹ค. ์žŠ์ง€๋ง๊ณ  label for="file" input id="file" ๊ฐ๊ฐ for๊ณผ id ์•ˆ์— ๊ฐ™์€ ์ด๋ฆ„์„ ์ ์–ด์ค˜์•ผ ์ž‘๋™ํ•œ๋‹ค.

  • class ์ปดํฌ๋„ŒํŠธ์—์„œ ์™œ this.props.history๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”์ง€ ์ฐพ์•„๋ณด๋‹ˆ withRouter ์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ  import { withRouter } from 'react-router-dom'; ๋‚ด๋ณด๋‚ผ ๋•Œ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด ์ค˜์•ผ๋๋˜ ๊ฒƒ์ด๋‹ค. export default withRouter(); history ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ™•์ธํ•ด ๋ณผ ๊ฒƒ.

  • ๋ฐฐ๊ฒฝํ™”๋ฉด์œผ๋กœ ์˜์ƒ์„ ๋„ฃ๋Š” ์ž‘์—…์—์„œ ์ด๋ฏธ์ง€ ๋„ฃ๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ import๋กœ ๋ฐ›์•„์˜ค์ง€ ์•Š์œผ๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    autoPlay ์ž๋™์žฌ์ƒ muted ์†Œ๋ฆฌ์—†์Œ loop ๋ฌดํ•œ์žฌ์ƒ

import introVideo from '๋น„๋””์˜ค ๊ฒฝ๋กœ';

<video  id="video" autoPlay muted loop>
  <source src={introVideo} className="introvideo" type="video/mp4" />
</video>
  • form ํƒœํฌ์˜ ํŠน์„ฑ์— ๋Œ€ํ•ด์„œ ์ข€ ๋” ๊ณต๋ถ€ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค. form์„ ์ผ์„ ๋•Œ ์ƒˆ๋กœ๊ณ ์นจ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

  • ๋กœ๊ทธ์ธ, ๋กœ๊ทธ์•„์›ƒ, ํšŒ์›๊ฐ€์ž… ์ฝ”๋“œ๋ฅผ ์งœ๋Š”๋ฐ ๊ฝค๋‚˜ ์• ๋ฅผ ๋จน์—ˆ๋‹ค.. ๋˜๊ฒŒ ์‰ฌ์šด ์ค„ ์•Œ์•˜์—ˆ๋Š”๋ฐ..ใ… ใ…œ ํ† ํฐ์ธ์ฆ๋ฐฉ์‹์„ ์ผ๋Š”๋ฐ, localStorage์— ์ €์žฅ๋˜์„œ ์ƒˆ๋กœ๊ณ ์นจํ•ด๋„ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋˜๋„๋ก ๋กœ์ง์„ ์งฐ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋กœ์ปฌ์—๋Š” ๊ทธ๋Œ€๋กœ ์žˆ๋Š”๋ฐ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ๋กœ๊ทธ์ธ ์ƒํƒœ๊ฐ€ ํ’€๋ ค๋ฒ„๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ํ”„๋กœ์ ํŠธ ๋๋‚˜๋„ ๋ฆฌํŒฉํ† ๋งํ• ๊ฒŒ ์—„์ฒญ ๋งŽ์„ ๊ฒƒ ๊ฐ™๋‹ค ใ…‹ใ…‹ใ…‹

  • input์— autoFocus ๋„ฃ์–ด์ฃผ๋ฉด ๊ตณ์ด ์ž…๋ ฅ๋ž€์„ ํด๋ฆญํ•˜์ง€ ์•Š์•„๋„ ์˜ฎ๊ฒจ๊ฐ€๋Š” ์œ ์šฉํ•œ ์†์„ฑ!

  • textarea์—์„œ (placeholder ๋ง๊ณ ) ์ง์ ‘ ์ž…๋ ฅํ•œ ๊ฐ’์„ ์ดˆ๊ธฐํ™” ํ•˜๊ณ ์‹ถ์–ด์„œ ์ƒํƒœ๋ณ€๊ฒฝ์œผ๋กœ ๊ด€๋ฆฌํ•ด ๋ณด๋ คํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ดˆ๊ธฐํ™”๋ฅผ ์ ์šฉํ•ด๋„ ํ™”๋ฉด์—์„œ ์ ์šฉ์ด ์•ˆ ๋˜๋Š” ๊ฒƒ์ด๋‹ค..! ๋‹นํ™ฉ ๋‹นํ™ฉ
    ๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ ์ž˜ ์ ์šฉ๋˜๋Š”๊ฑธ ๋ณด๋‹ˆ input, textarea ํƒœ๊ทธ๋Š” value ๊ฐ’์ด ์žˆ๋Š” ํƒœ๊ทธ๋ผ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ textarea ์— value๋ฅผ content ๋กœ ์ง€์ •ํ•ด ์ฃผ๋‹ˆ ๋ง๋”ํ•˜๊ฒŒ ๋ฌธ์ œ ํ•ด-๊ฒฐ!

// ์ƒํƒœ๋Š” ์ด๋ ‡๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ 
const [content, setContent] = useState('')

// ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ ํ•จ์ˆ˜ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๊ณ  
function handleReset() {
  setContent('')
}

// ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ return ๋ถ€๋ถ„์—์„œ value์ฒ˜๋ฆฌ 
<textarea value={content}
  • ๊ทธ ์™ธ์— ๋ชจ๋‹ฌ์ฐฝ, ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ, ์ด๋ฏธ์ง€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€