Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Props
- 렌더링
- FrontendStydy
- JavaScript
- 자바스크립트
- useState
- 배열
- useRef
- callback함수
- frontendstudy
- 컴포넌트
- promise
- 비동기함수
- CSS
- Frontend Study
- REACT
- addEventListener
- 메소드 실행
- 리액트
- this 객체
- 이벤트핸들링
- 이벤트
- HTML
- DOM
- webProject
- typeScript
- input
- try.. catch
- 함수 실행
- 배열메소드
Archives
- Today
- Total
이다닷
[React] Day 6 - 컴포넌트 이벤트 만들기 본문
컴포넌트 이벤트 만들기
📢페이지가 변경되었을때 이벤트를 실행시키는 이벤트 만들기
App.js
import React, { Component } from 'react';
import TOC from "./components/TOC";
import Content from "./components/Content";
import Subject from "./components/Subject";
import './App.css';
class App extends Component {
constructor(props) {
super(props);
this.state = {
mode: 'read',
subject: { title: 'WEB', sub: 'world wide web!' },
welcome: { title: 'welcome', desc: 'Hello React!!' },
contents: [
{ id: 1, title: 'HTML', desc: 'HTML is for information' },
{ id: 2, title: 'CSS', desc: 'CSS is for design' },
{ id: 3, title: 'Javascript', desc: 'Javascript is for interactive' }
]
}
}
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}
onChangePage={function () {
this.setState({ mode: 'welcome' });
}.bind(this)}
>
</Subject>
<TOC
onChangePage={function () {
this.setState({ mode: 'read' });
}.bind(this)}
data={this.state.contents}
></TOC>
<Content title={_title} desc={_desc}></Content>
</div>
);
}
}
export default App;
➡️onChangePage 함수 생성
Subject.js
import React, { Component } from 'react';
class Subject extends Component {
render() {
return (
<header>
<h1><a href="/" onClick={function(e){
e.preventDefault();
this.props.onChangePage();
}.bind(this)}>{this.props.title}</a></h1>
{this.props.sub}
</header>
);
}
}
export default Subject;
TOC.js
import React, { Component } from 'react';
class TOC extends Component {
render() {
var lists = [];
var data = this.props.data;
var i = 0;
while (i < data.length) {
lists.push(
<li key={data[i].id}>
<a
href={"/content/" + data[i].id}
onClick={function(e){
e.preventDefault();
this.props.onChangePage();
}.bind(this)}
>{data[i].title}</a>
</li>);
i = i + 1;
}
return (
<nav>
<ul>
{lists}
</ul>
</nav>
);
}
}
export default TOC;
➡️a태그가 클릭될 시 App.js에서 만든 onChangePage함수를 this.props를 이용해서 실행시켜주기.
📢페이지가 변경되었을때 HTML, CSS, Javascript 총 세개의 a 태그 중 클릭을 하면 그에 대한 title과 desc가 뜨는 이벤트 만들기
App.js
import React, { Component } from 'react';
import TOC from "./components/TOC";
import Content from "./components/Content";
import Subject from "./components/Subject";
import './App.css';
class App extends Component {
constructor(props) {
super(props);
this.state = {
mode: 'read',
selected_content_id: 2,
subject: { title: 'WEB', sub: 'world wide web!' },
welcome: { title: 'welcome', desc: 'Hello React!!' },
contents: [
{ id: 1, title: 'HTML', desc: 'HTML is for information' },
{ id: 2, title: 'CSS', desc: 'CSS is for design' },
{ id: 3, title: 'Javascript', desc: 'Javascript is for interactive' }
]
}
}
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') {
var i = 0;
while (i < this.state.contents.length) {
var now_data = this.state.contents[i];
if (now_data.id === this.state.selected_content_id) {
_title = now_data.title;
_desc = now_data.desc;
}
i = i + 1;
}
}
return (
<div className="App">
<Subject
title={this.state.subject.title}
sub={this.state.subject.sub}
onChangePage={function () {
this.setState({ mode: 'welcome' });
}.bind(this)}
>
</Subject>
<TOC
onChangePage={function(id) {
this.setState({
mode: 'read',
selected_content_id:Number(id)
// TOC.js에서 받아온 id 값을 설정해줌으로써 선택된 a 태그의 정보가 출력됨.
});
}.bind(this)}
data={this.state.contents}
></TOC>
<Content title={_title} desc={_desc}></Content>
</div>
);
}
}
export default App;
TOC.js
import React, { Component } from 'react';
class TOC extends Component {
render() {
var lists = [];
var data = this.props.data;
var i = 0;
while (i < data.length) {
lists.push(
<li key={data[i].id}>
<a
href={"/content/" + data[i].id}
data-id = {data[i].id} // 현재 데이터의 id 값을 data-id에 넣어준다.
onClick={function(e){
// e.target
// 여기서 target는 이벤트가 발생한 태그를 말한다. 따라서 여기서는 클릭된 a 태그를 뜻한다.
// e.target.dataset.id
// target를 통해서 dataset에 들어있는 id값에 접근 할 수 있다.
e.preventDefault();
this.props.onChangePage(e.target.dataset.id);
}.bind(this)}
>{data[i].title}</a>
</li>);
i = i + 1;
}
return (
<nav>
<ul>
{lists}
</ul>
</nav>
);
}
}
export default TOC;
'React' 카테고리의 다른 글
[React] Day 8 - create 구현 2 (0) | 2023.09.01 |
---|---|
[React] Day 7 - Create 구현 1 (0) | 2023.08.31 |
[React] Day 5 - event 개념 (0) | 2023.08.29 |
[React] Day 4 - state (0) | 2023.08.28 |
[React] Day 3 - component 파일로 분리하기 (0) | 2023.08.27 |