๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
WEB/Front-End๐ŸŒ

[React] event

by narang111 2021. 10. 4.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ญ๋™์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ค„ ๊ธฐ์ˆ ์ธ event๋ฅผ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๋‹ค.

props, state, event ์ด ์„ธ ๊ฐœ๊ฐ€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉด์„œ ์›น ํŽ˜์ด์ง€๋ฅผ ์—ญ๋™์ ์œผ๋กœ ๋งŒ๋“ ๋‹ค.

 

 

๋งํฌ์— ์ด๋ฒคํŠธ๋ฅผ ์„ค์น˜ํ•ด์„œ ํด๋ฆญํ•˜๋ฉด ๊ทธ์— ๋”ฐ๋ผ์„œ App ์ปดํฌ๋„ŒํŠธ์˜ state๊ฐ€ ๋ฐ”๋€Œ๊ณ 

๋ฐ”๋€ state๊ฐ€ ์ด content ์ปดํฌ๋„ŒํŠธ์˜ props ๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋˜๋ฉด์„œ ๋™์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐ”๊พผ๋‹ค.

 

ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ ๋ณด๊ณ ์žˆ๋Š” ํŽ˜์ด์ง€์˜ ์ƒํƒœ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ state์— mode๋ผ๋Š” ๊ฐ’์„ ์ฃผ์—ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์œผ๋กœ welcome์„ ์ฃผ์—ˆ๊ณ  welcome ๋ชจ๋“œ์ผ ๋•Œ content ์˜์—ญ์— ํ‘œ์‹œํ•  ํ…์ŠคํŠธ๋„ ์ง€์ •ํ•ด์ฃผ์—ˆ๋‹ค.

๋ฆฌ์•กํŠธ์—์„œ๋Š” state ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ๊ทธ state๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ renderํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ํ˜ธ์ถœ๋œ๋‹ค.

๋‹ค์‹œ ํ˜ธ์ถœ๋˜๋ฉด์„œ render ํ•จ์ˆ˜ ํ•˜์œ„์˜ ์ปดํฌ๋„ŒํŠธ๋“ค๋„ ๊ฐ์ž ๊ฐ€์ง€๊ณ  ์žˆ๋Š” renderํ•จ์ˆ˜๋„ ๋ชจ๋‘ ๋‹ค์‹œ ํ˜ธ์ถœ๋œ๋‹ค.

=> ํ™”๋ฉด์ด ๋‹ค์‹œ ๊ทธ๋ ค์ง€๋Š” ๊ฒƒ

์ฆ‰, render ํ•จ์ˆ˜๊ฐ€ ํ•˜๋Š” ์ผ์€ ์–ด๋–ค html์„ ๊ทธ๋ฆด ๊ฒƒ์ธ๊ฐ€. ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. 

 

๋ฆฌ์•กํŠธ์—์„œ๋Š” props ๊ฐ’์ด๋‚˜ state ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ํ•ด๋‹น๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ render ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋„๋ก ์•ฝ์†๋˜์–ด์žˆ๋‹ค.

 

 

์ด ๋ชจ๋“œ ๊ฐ’์— ๋”ฐ๋ผ์„œ ๋งŒ๋“ค์–ด์ง€๋Š” ์ปดํฌ๋„ŒํŠธ(๋งŒ๋“ค์–ด์ง€๋Š” rendering ๊ฒฐ๊ณผ)๊ฐ€ ๋‹ฌ๋ผ์ง€๋„๋ก ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

 

๋ฆฌ์•กํŠธ๋Š” ๊ทœ์น™์ด ์žˆ๋‹ค.

์ง€๊ธˆ ์งœ๊ณ ์žˆ๋Š” ์ฝ”๋“œ๋Š” ์œ ์‚ฌhtml์ด๋‹ค.

onclick์ด ์•„๋‹ˆ๋ผ onClick์„ ์จ์ฃผ์–ด์•ผํ•˜๊ณ  ์ค‘๊ด„ํ˜ธ๋กœ ์‹คํ–‰๋  ์ฝ”๋“œ๋ฅผ ๋ฌถ์–ด์ฃผ์–ด์•ผํ•œ๋‹ค.

ํ…Œ์ŠคํŠธ๋กœ alert์ฐฝ์„ ๋„์›Œ๋ณด์•˜๋Š”๋ฐ alert ์ฐฝ ํ™•์ธ์„ ๋ˆŒ๋Ÿฌ์ฃผ๋ฉด ํŽ˜์ด์ง€๊ฐ€ reload ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค.

๋ฆฌ์•กํŠธ์˜ reload ํ•˜์ง€ ์•Š๊ณ ๋„ ์—ญ๋™์ ์ธ ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์—†์–ด์ง„๋‹ค.

 

aํƒœ๊ทธ๋Š” ํด๋ฆญํ–ˆ์„ ๋–„ href๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์œผ๋กœ ์ด๋™ํ•œ๋‹ค๋Š” ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘์ด ์žˆ๋Š”๋ฐ,

์ด ๊ธฐ๋ณธ๋™์ž‘์„ ๋ชปํ•˜๊ฒŒ ํ•˜๊ณ ์‹ถ์€ ๊ฒƒ!!

 

์–ด๋–ป๊ฒŒ ํ•˜๋ƒ?

ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๋ฆฌ์•กํŠธ๋Š” ํ•จ์ˆ˜์˜ ์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์œผ๋กœ ์ด๋ฒคํŠธ๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•ด์ฃผ๊ธฐ๋กœ ์•ฝ์†๋˜์–ด์žˆ๋‹ค.

console.log๋กœ ํ™•์ธํ•ด๋ณด์•˜๋‹ค.

debugger; ๋ผ๋Š” ์ฝ”๋“œ๋Š” ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์“ธ ๋•Œ, ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์ผœ๋†“์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ debugger๋ผ๊ณ  ๋˜์–ด์žˆ๋Š” ๋ถ€๋ถ„์—์„œ ์‹คํ–‰์„ ๋ฉˆ์ถ”๊ณ  sources๋ผ๋Š” ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ด์„œ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ์ •๋ณด๋ฅผ ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ํ•ด์ค€๋‹ค.

 

debugger์—์„œ ๋ฉˆ์ถ˜ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด ๋•Œ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์จฐ ์ธ์ž๋กœ e๋ฅผ ์คฌ๋Š”๋ฐ

e๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ•ธ๋“ค๋งํ•  ์ˆ˜ ์žˆ๊ฒŒ ์šฐ๋ฆฌ์—๊ฒŒ ์ฃผ์ž…๋˜๋Š” ์ •๋ณด์ด๋‹ค.

html ํƒœ๊ทธ์˜ ๊ธฐ๋ณธ๋™์ž‘์„ ๋ชปํ•˜๊ฒŒ ๋ง‰๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋ž˜ ์ฝ”๋“œ์ด๋‹ค.

e.preventDefault();

 

render() ํ•จ์ˆ˜

 

 

 

 

import './App.css';
import React, { Component } from 'react';
import TOC from "./components/TOC"
import Content from "./components/Content"
import Subject from "./components/Subject"



// ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ (ํ…œํ”Œ๋ฆฟ)
// ๋ฆฌ์•กํŠธ์˜ Component๋ผ๊ณ  ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š”
// App ์ด๋ผ๋Š” ํด๋ž˜์Šค - render()๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
class App extends Component {
  constructor(props){
    super(props);
    this.state = {
      mode:'welcome',
      subject:{title:'WEB', sub:'World Wide Web!'},
      welcome:{title:'Welcome', desc:'Hello, React'},
      contents:[
        {id:1, title:'HTML', desc:'HTML is HyperText ...'},
        {id:2, title:'CSS', desc:'CSS is for design ...'},
        {id:3, title:'JavaSript', desc:'JavaSript is ...'}
      ]
    }
  }
  render(){
    var _title, _desc = null;
    if(this.state.mode ==='welcome'){
      _title = this.state.welcome.title;
      _desc = this.state.welcome.desc;
    } else if(this.state.mode ==='read'){
      _title = this.state.contents[0].title;
      _desc = this.state.contents[0].desc;
    }
    return (
      <div className="App">
        {/* <Subject title={this.state.subject.title} sub={this.state.subject.sub}></Subject> */}
        <header>
          <h1><a href="/" onClick={function(e){
            //alert('hi');
            console.log(e);
            e.preventDefault();
          }}>{this.state.subject.title}</a></h1>
          {this.state.subject.sub}
        </header> 
        <TOC data={this.state.contents}></TOC>
        <Content title={_title} desc={_desc}></Content>
      </div>  
    );
  }
  
}

export default App;