$ npm run debug src={no}
기본 틀 예시
import React from 'react';
export default function () {
return (
<h1 onClick={ (e) => {} }>
ex03 - Event Handler
</h1>
);
}
import React from 'react';
export default function () {
return (
<h1
onClick={ (e) => { console.log('click!!'); } }
style={ {
cursor:'pointer'
} } >
ex03 - Event Handler
</h1>
);
}
import React from 'react';
export default function TitelBar02() {
const onClickHeader = () => {
console.log('TitelBar02 click!!');
}
return (
<h1
onClick={ onClickHeader }
style={ {
cursor:'pointer'
} } >
ex03 - Functional Event Handler(Functional Component)
</h1>
)
}
import React, {Component} from 'react';
export default class TitelBar01 extends Component {
constructor(){
super(...arguments);
// this.no = 10;
this.state = {
no: 10
}
}
onClickHeader(e){
// this.no++;
// console.log('TitelBar01 click!!', this.no);
// this.render();
console.log('TitelBar01 click!!', this.state.no);
// this.state.no++;
this.setState({
no: this.state.no + 1
})
}
render() {
return (
<h1
onClick={ this.onClickHeader.bind(this) }
style={ {
cursor:'pointer'
} } >
ex03 - Functional Event Handler(Class Component) { /* this.no */ this.state.no }
</h1>
)
}
}
import React, {Fragment} from 'react';
export default function App() {
const onChangeMessageInput = function(e) {
console.log(e.target.name, ":", e.target.value);
}
const onAddFormSubmit = function(e) {
e.preventDefault();
console.log(e.target.name, ":", e.target.hi.value, "Ajax 방식의 등록잡업을 해야한다.");
}
return (
<Fragment>
<h2>ex03 - SyntheticEvent</h2>
<p>
Native DOM Event 객체를 Wrapper 하고 있다.<br/>
Native 이벤트 객체와 사용하는 방식이 같다(인테페이스 동일)
</p>
<form
name='addForm'
method='post'
action='/do/not/go'
onSubmit={ onAddFormSubmit }
>
<input
type='text'
name='hi'
placeholder='메세지를 입력 하세요'
onChange= { onChangeMessageInput }
/>
<br/>
<br/>
<input
type='submit'
value='등록' />
</form>
</Fragment>
);
}
import React, {Fragment} from 'react';
import logo from '../assets/images/react-logo.png';
// file-loader를 지금 안붙여도된다.
// 왜?
export default function App() {
const onKeyPressInput = function(e){
// 이름이 지정되어있다.
// Virtual key 검색
if(e.key = 'Enter')
console.log(e.target.value);
}
const onFocusInput = function(e){
console.log('onFocusInput');
}
const onBlurInput = function(e){
console.log('onBlurInput');
}
const onMouseOverImage = function(e){
// 마우스 위치
console.log('onMouseOverImage');
}
const onMouseMoveImage = function(e){
console.log('onMouseMoveImage',`x=${e.clientX}, y=${e.clientY}`);
}
const onMouseOutImage = function(e){
console.log('onMouseOutImage');
}
const onMouseDownImage = function(e){
console.log('onMouseDownImage');
}
const onMouseUpImage = function(e){
console.log('onMouseUpImage');
}
const onClickImage = function(e){
console.log('onClickImage');
}
const onDoubleClickImage = function(e){
console.log('onDoubleClickImage');
}
return (
<Fragment>
<h2>ex03 - Some Examples of Event Handler</h2>
<input
type='text'
placeholder='메세지를 입력 하세요'
onKeyPress={ onKeyPressInput }
onFocus={ onFocusInput }
onBlur={ onBlurInput } />
<br/>
<br/>
<img
style={ {
cursor: 'pointer',
width: 190,
border: '1px solid #ccc'
} }
src={ logo }
onMouseOver={ onMouseOverImage }
onMouseMove={ onMouseMoveImage }
onMouseOut={ onMouseOutImage }
onMouseDown={ onMouseDownImage }
onMouseUp={ onMouseUpImage }
onClick={ onClickImage }
onDoubleClick={ onDoubleClickImage }/>
</Fragment>
);
}
Scroll Event를 통한 예제
real DOM element에 접근
image의 좌표값 구하기
import React, { useRef, Fragment } from 'react';
import logo from '../assets/images/react-logo.png';
export default function App() {
const imageRef = useRef(null);
// ref를 쓰기위해 객체를 생성한다.
// 여기선 ref할 상대를 알 수 없다.
// 그렇기에 null로 세팅을한다.
const onKeyPressInput = function(e){
// 이름이 지정되어있다.
// Virtual key 검색
if(e.key = 'Enter')
console.log(e.target.value);
}
const onFocusInput = function(e){
console.log('onFocusInput');
}
const onBlurInput = function(e){
console.log('onBlurInput');
}
const onMouseOverImage = function(e){
// 마우스 위치
console.log('onMouseOverImage',`x=${e.clientX}, y=${e.clientY}`);
}
const onMouseMoveImage = function(e){
const offsetTop = imageRef.current.offsetTop;
const offsetLeft = imageRef.current.offsetLeft;
// image 안에서의 좌표 구하기
console.log('onMouseMoveImage',`x=${e.clientX - offsetLeft}, y=${e.clientY - offsetTop}`);
}
// document.getElementById('image').offsetTop
const onMouseOutImage = function(e){
console.log('onMouseOutImage',`x=${e.clientX}, y=${e.clientY}`);
}
const onMouseDownImage = function(e){
console.log('onMouseDownImage',`x=${e.clientX}, y=${e.clientY}`);
}
const onMouseUpImage = function(e){
console.log('onMouseUpImage',`x=${e.clientX}, y=${e.clientY}`);
}
const onClickImage = function(e){
console.log('onClickImage',`x=${e.clientX}, y=${e.clientY}`);
}
const onDoubleClickImage = function(e){
console.log('onDoubleClickImage',`x=${e.clientX}, y=${e.clientY}`);
}
return (
<Fragment>
<h2>ex03 - Some Examples of Event Handler</h2>
<input
type='text'
placeholder='메세지를 입력 하세요'
onKeyPress={ onKeyPressInput }
onFocus={ onFocusInput }
onBlur={ onBlurInput } />
<br/>
<br/>
<img
ref = { imageRef }
style={ {
cursor: 'pointer',
width: 190,
border: '1px solid #ccc'
} }
src={ logo }
onMouseOver={ onMouseOverImage }
onMouseMove={ onMouseMoveImage }
onMouseOut={ onMouseOutImage }
onMouseDown={ onMouseDownImage }
onMouseUp={ onMouseUpImage }
onClick={ onClickImage }
onDoubleClick={ onDoubleClickImage }/>
</Fragment>
);
}
Scroll(react)
body로부터 생성된 스크롤이 아닌, div 스크롤이다.
outer -> App, inner -> div
outer의 height
inner의 height
scroll의 Top
inner = outer + top
:global(.App) { height: 100vh; width:100%; margin:0 auto; overflow-y: scroll }
핵심
Functional Component
import React, { useRef } from 'react';
import './assets/scss/App.scss';
export default function App() {
const outterRef = useRef(null);
const innerRef = useRef(null);
return (
<div
className={'App'}>
<div
ref={ innerRef }>
<ul>
{/* length만 가지고 있는 가짜 배열
실제 값을 가지고 있진 않기 때문에 undefined와 index을 가진다.
[1,2,3,4,5,6,7,8,9...]을 만들기 위해
동적으로 할당한다.
즉, 스크롤 생성을 위해 많은 리스트를 생성하기 위함이고,
새로운 정수 배열을 만들어 이용한다. */}
{ Array.from({length: 100}, (_, i) => i+1).map(i =>
<li key={ i }>
{ `아이템 ${i} 입니다.` }
</li>
) }
</ul>
</div>
</div>
);
}
Class Component
(function(e){
this.outterRef = ref;
}).bind(this) // bind에서의 this는 Component를 가리킨다.
import React, { Component } from 'react';
import './assets/scss/App.scss';
export default class extends Component{
onScroll(e){
console.log( this.outterRef.scrollTop, ":", this.outterRef.clientHeight, ":", this.innerRef.clientHeight );
// clientHegith는 화면의 크기
// ScrollTop은 움직인 scroll의 크기
// 그러므로, inner = clientHeight + scrollTop
}
render(){
return (
<div
ref={ (ref) => this.outterRef = ref }
className={'App'}
onScroll={ this.onScroll.bind(this) }>
<div
ref={ (ref) => this.innerRef = ref }
>
<ul>
{/* length만 가지고 있는 가짜 배열
실제 값을 가지고 있진 않기 때문에 undefined와 index을 가진다.
[1,2,3,4,5,6,7,8,9...]을 만들기 위해
동적으로 할당한다.
즉, 스크롤 생성을 위해 많은 리스트를 생성하기 위함이고,
새로운 정수 배열을 만들어 이용한다. */}
{ Array.from({length: 100}, (_, i) => i+1).map(i =>
<li key={ i }>
{ `아이템 ${i} 입니다.` }
</li>
) }
</ul>
</div>
</div>
);
}
}