์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฐ์ธ๋ฉ์ด๋?
์ปดํฌ๋ํธ(Component)์ ์ด๋ฒคํธ ํจ์๋ฅผ ์ฐ๊ฒฐ(bind)ํ๋ ๊ฒ์
๋๋ค.
๋ฐ์ธ๋ฉํ์ง ์์๋ ์ด๋ฒคํธ ํจ์๋ ์คํ์ด ๋์ง๋ง, ๋๊ฐ(์ด๋ค ์ปดํฌ๋ํธ๊ฐ) ํธ์ถ์ ํ๋์ง ์ ์ ์์ต๋๋ค.
๋ฐ์ธ๋ฉํ์ง ์์๋๋ฐ, ์ด๋ฒคํธ ํจ์์์ this.state ๋๋ this.props๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ undefined๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
const App = () => {
const nav = useNavigate()
const goTo = () => {
nav('ex-router')
}
const goToWrapper = () => {
goTo()
}
return (
<div>
<nav>
<button onClick={goToWrapper}>๊ฐ์!!</button>
</nav>
</div>
);
};
const App = () => {
const nav = useNavigate()
const goTo = () => {
nav('ex-router')
}
return (
<div>
<nav>
<button onClick={() => goTo()}>๊ฐ์2!!</button>
</nav>
</div>
);
};
onClick={changename} (x) onClick={changeName} (o)
<button onClick={activateLasers}>
Activate Lasers
</button>
{onClickHandle}
{onClickHandle()}
e.preventDefault() ํธ์ถ
ํ๋์ ์น์ฌ์ดํธ์ ์ฌ๋ฌ๊ฐ์ ์ด๋ฒคํธ๊ฐ ์กด์ฌํ๊ณ ๊ฐ์ ์ด๋ฒคํธ๋ผ๊ณ ํ๋๋ผ๋ ๋ค๋ฅด๊ฒ ๋์ํด์ผํ๋ ๊ฒ๋ค์ด ๋ง์์ง๋ค.
์ด๋ฒคํธ ์ ์ด๊ฐ ๋ณต์กํด์ง๋ ๊ทผ๋ณธ์ ์ธ ์์ธ์ html ํ๊ทธ๊ฐ ์ค์ฒฉ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌด์ธ๋ค.
//html
<body>
<div class="divWrapper">
<div class="inner1">
<div class="inner2"></div>
</div>
</div>
</body>
// divํ๊ทธ ์์ > div > div๊ฐ ๊ตฌ์กฐ๋์ด ์๋ค.
//js
const divs = document.querySelectorAll('div')
divs.forEach(box => {
box.addEventListner('click', e => {
console.log(e.currentTarget.className)
})
})
jsํ์ผ์์ div๋ฅผ ๊ฐ๊ณ ์๋ ์์๋ฅผ ๋ชจ๋ ๊ฐ๊ณ ์์
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ํ์ผ์ ์ฝ์์ ์ฐ์ด์ฃผ๋ ์ฝ๋ฐฑํจ์๋ฅผ ์คํ์์ผฐ๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก inner2๋ฅผ ๋๋ ์ง๋ง innner1๊ณผ divWrapper๋ ํจ๊ป ์ฝ์์ ์ฐํ๊ฒ ๋๋ค.
inner2๋ฅผ ํด๋ฆญํ์ ๋ ํด๋น ๋ธ๋ก์ ์ฐธ์กฐํ๊ณ ์๋ ์คํ์ปจํ
์คํธ์ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง ํ์์ด ์ผ์ด๋๊ฒ ๋๋ค.
์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ํน์ ์์์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋, ์์์ ์๋ ์์์๋ ๋์ผํ ์ด๋ฒคํธ๊ฐ ์ ์ฉ๋์ด ์๋ค๋ฉด ํด๋น ์์๊น์ง ์ด๋ฒคํธ๊ฐ ์ ํ๋๋๊ฒ์ ๋งํ๋ค.
//js
const divs = document.querySelectorAll('div')
divs.forEach(box => {
box.addEventListner('click', e => {
e.stopPropagation()
console.log(e.currentTarget.className)
})
})
//react
import React, { useState } from 'react'
function Test() {
const [visible, setIsvisible] = useState(false)
const closeBanner = (e) => {
e.stopPropagation()
setIsvisible(true)
}
return (
<div
onClick={() => alert('๋น์ฒจ!')}
style={{ display: visible ? 'flex' : 'none' }}
>
<button type="button"
onClick={closeBanner}
>๋ซ๊ธฐ</button>
</div>
)
}
export default Test
ํ์ดํ ํจ์์ Function.prototype.bind
์ฝ๋ฐฑํจ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ธ์๋ฅผ ๋๊ธฐ๋ ์ฝ๋๋ ์ํฉ๋ง๋ค ๊ฐ๊ฐ ๋ค๋ฅด๋ค.
ํจ์ ํํ์์ผ๋ก ๋ฐ๋ก๋นผ์ jsx๋ฌธ๋ฒ์ผ๋ก ์ค๊ดํธ ์์ ๋ณ์๋ฅผ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ ๋ง์ด ์ฌ์ฉํ๋ค.
function Test() {
const onClickHandle = () => {
alert('hello world')
}
return (
<div>
<button
type="button"
onClick={onClickHandle}
>Click Me!</button>
</div>
)
}
export default Test
๊ฐ๋จํ ๋ฌธ๊ตฌ๋ผ๋ฉด ํจ์ ์คํ์ inline์ผ๋ก ๋ฃ์ด์ค๋ ๊ด์ฐฎ!
//onClick={() => alert('hello world')}
// name์ด๋ผ๋ ๋ฌธ์์ด ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ๋๋ค.
import React, { useState } from 'react'
function Test() {
const onClickHandle = (name) => {
alert(`hello, ${name}`)
}
return (
<div>
<button
type="button"
onClick={onClickHandle('nimo')}
>Click Me!</button>
</div>
)
}
export default Test
์ฌ๊ธฐ์ ๋ฌธ์ ์ ์ onClick={onClickHandle('nimo')}๋ถ๋ถ์์ ํจ์ ํธ์ถ์ ๋ฐ๋กํด์คฌ๊ธฐ ๋๋ฌธ์ onclick ์ด๋ฒคํธ๊ฐ ๋ฐ์๋๊ธฐ๋ ์ ์ alert์ด ๋จผ์ ์คํ๋๋ฒ๋ฆฐ๋ค.
์ฝ๋ฐฑํจ์์์ ์ธ์๊ฐ์ ๋๊ฒจ ์ค ๋๋ ํจ์ํธ์ถ์ด ์๋ ํจ์ ์ ์ธ์์ ์ฌ์ฉํด์ผํ๋ค.
import React, { useState } from 'react'
function Test() {
const onClickHandle = (name) => {
alert(`hello, ${name}`)
}
return (
<div>
<button
type="button"
onClick={() => onClickHandle('nimo')}
>Click Me!</button>
</div>
)
}
export default Test
์ด๋ฒคํธ๊ฐ์ฒด๋?
์ด๋ฒคํธ๋ฅผ ๋ง๋ค์์ ๋ ์๋์ผ๋ก ๋ง๋ค์ด์ง๋ ๊ฐ์ฒด๋ฅผ ๋งํ๋ค.
์ด๋ฒคํธ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๊ฐ์ฒด์ด๋ค.
import React, { useState } from 'react'
function Test() {
const onClickHandle = (e) => {//ํด๋ฆญํธ๋ค๋ฌ ํจ์ ๋ํ ์ธ์๋ฅผ ๋ฐ๋ ๋ถ๋ถ์ ๋ณ๊ฒฝ
alert(e.target.value)
}
return (
<div>
<button
type="button"
value={'clickBtn'}
onClick={(e) => onClickHandle(e)}
>Click Me!</button>
</div>
)
}
export default Test
๋ง์ผ ์ด๋ฒคํธ ๊ฐ์ฒด ํ๋๋ง์ ๋๊ธฐ๋ ค๊ณ ํ ๋๋ ์ค์ฌ๋ ๊ฐ๋ฅํ๋ค.
`
onClick = {(e) => onClickHandle(e)}
โผ
onClick = { onClickHandle }`
import React, { useState } from 'react'
function Test() {
const onClickHandle = (e, name) => {
alert(e.target.value)
console.log(name)
}
return (
<div>
<button
type="button"
value={'clickBtn'}
onClick={(e) => onClickHandle(e, 'nimo')}
>Click Me!</button>
</div>
)
}
export default Test
์ด๋ฒคํธ ๊ฐ์ฒด์ ์ผ๋ฐ ์ธ์๋ฅผ ๋๊ธธ ๋ ํจ์ ์ปค๋ง์๋ํด์๋ ์ ๊น ์ดํด๋ณด์.
[ํจ์ ์ปค๋ง]:
ํจ์ ํธ์ถ ์ ์ฌ๋ฌ ๊ฐ์ ์ธ์๋ฅผ ํ๋ฒ์ ๋๊ธฐ์ง ์๊ณ , ํ ๋ฒ์ ํ๋์ ์ธ์๋ฅผ ๋๊ธฐ๊ณ , ํจ์์ ์ธ์๋ฅผ ๊ฐ์๋งํผ ์ฌ๋ฌ๋ฒ ํธ์ถํ๋ ๋ฐฉ์์ ๋งํ๋ค.
์์์ผ ํ ๋ถ๋ถ: ์ผ๊ธ ๊ฐ์ฒด, ํด๋ก์ , ๋ ์์ปฌ ์ค์ฝํ, ์ค์ฝํ ์ฒด์ธ
import React, { useState } from 'react'
function Test() {
const onClickHandle = name => e => {
alert(e.target.value)
console.log(name)
}
return (
<div>
<button
type="button"
value={'clickBtn'}
onClick={(e) => onClickHandle('nimo')(e)}
// onClick={onClickHandle('nimo')} ์ด๋ ๊ฒ ์ค์ฌ๋ ๋จ
>Click Me!</button>
</div>
)
}
export default Test