๋ธ๋ก๊ทธ์ผ...์๋
....?
๊ทผ ๋๋ฌ๋ง์ด๊ตฌ๋....๐
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
....
๋ณ๋ช
์ ํด๋ณด์๋ฉด ์์ ์ผ๊ทผ ์ง์ฅ + ํ์ฌ ์ ์ ๊ธฐ๊ฐ์ ๊ฑฐ์น๋๋ผ ์ข ์ ์ ์ด ์์๋๋ฐ, ์ด์ ๋ถํฐ ๋ค์ ์ด์ฌํ ์จ๋ณผ๊ฑฐ๋ค.
์ง์ง๋ฃจ....๐ญ
์๋ฌดํผ, Next.js์์ ํด๋ฆญ์ popover(a.k.a modal)๊ฐ ๋จ๋ search ์ฐฝ์ ๊ตฌํํ๋ฉด์
autoFocus, autoSelect๋ฅผ ์ ์ฉํ๋๋ฐ ์ด์ ๋ํด ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค. (์์ฒญ ์ฌ์ ์ฃผ์๐ณ)
<input autofocus />
input์ฐฝ์ ์ด๋ ๊ฒ๋ง ์ ๋ ฅํด์ฃผ๋ฉด component๊ฐ ๋ง์ดํธ ๋ ํ์ ์๋์ผ๋ก focus๊ฐ ๋๋ค.
ํ์ง๋ง, open ์ฌ๋ถ๋ฅผ state๋ก ๊ด๋ฆฌํ๋ popover์์๋ ์ ํ ๋จนํ์ง ์๋๋ค....
์ค์ ๋ก ๋ธ๋ผ์ฐ์ console์ฐฝ์ document.activeElement
๋ก ํ์ฌ ์ ํ๋ element๋ฅผ ํ์ธํด๋ณด๋ฉด,
input์ฐฝ์ด ์๋๋ผ popover component ์ ์ฒด๊ฐ ์ฐํ๋๊ฑธ ๋ณผ ์ ์๋ค.
๋ญ๊ฐ ๊ฒ๋ ๋ณต์กํด ๋ณด์ด๋๋ฐ ๊ทธ๋ฅ material-ui popover์
ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค.
ํน์ ๋ฒํผ์ ๋๋ ์ ๋ (or ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ ๋)
ํ์
์ฐฝ์ด ๋จ๋ฉด, ํ์
์ฐฝ ๋ด์์ useRef๋ฅผ ์ด์ฉํด์ input์ฐฝ์ ๊ฐ์ ๋ก focus๋ฅผ ์ฃผ๋ฉด ๋๋ค.
ํ์ง๋ง, useRef์ ๋ํด ์๋ฒฝํ ์ดํดํ๋ ํ๋ฉด ๊ทธ๊ฑด Nope......
์ฃผ๋ง๋์ ์ข ํ๋ด์ผ๊ฒ ๋ค๐ญ
import React, { useEffect, useRef } from 'react';
๋จผ์ useEffect์ useRef๋ฅผ react์์ Import ํด์ค๊ณ ,
popover component ๋ด์์ ์๋ ์ฝ๋๋ฅผ ์
๋ ฅํด์ค๋ค!
function Popover() {
const searchElement = useRef(null); // DOM ์์๋ฅผ searchElement์ ํ ๋น
...
useEffect(() => {
if (searchElement.current) { // ํ ๋นํ DOM ์์๊ฐ ๋ถ๋ฌ์ง๋ฉด (๋ง์ดํธ ๋๋ฉด)
searchElement.current.focus(); // focus ํ ๋น!
}
}, []);
...
return(
<input ref={searchElement} /> // input์ ์์์ ์ ์ธํ searchElement ์ ๋ฌ
)
}
์ฐ์๐ ์งฑ ์๋จ
~!!
์ด๊ฑด ๋ ์ฝ๋น....
input์ฐฝ์ ํด๋ฆญํ์ ๋(=focus ๋ ํ์) ์
๋ ฅ๋ ๋ชจ๋ ๋ด์ฉ์ ์๋์ผ๋ก ์ ์ฒด์ ํ ํด์ฃผ๋๊ฑด๋ฐ,
input ํ๊ทธ์ onFocus ์์ฑ์ ์ด์ฉํด์ ๊ตฌํํด๋ณผ๊ฑฐ๋ค.
<input ref={searchElement} onFocus={(e) => e.currentTarget.select()} />
์์์ ๋ง๋ input์ฐฝ์ ์ ๋ด์ฉ๋ง ์ถ๊ฐํ๋ฉด ๋๋ค!
์์ ์ฝ๊ฒ Done๐๐๐๐!!!
flow๋ ๊ฐ๋จํ๋ค. input์ onFocus event๊ฐ ์คํ๋๋ฉด, event๊ฐ ์ผ์ด๋ currentTarget์ ๋ฐ์์์, ๊ฐ์ ๋ก select ํด์ค๋ค.
์์ ์ฝ๋๋ฅผ onFocus={(e) => console.log("target : ", e.currentTarget)}
์ด๋ ๊ฒ ๋ฐ๊ฟ๋ณด๊ณ console์ฐฝ์ ํ์ธํด๋ณด๋ฉด?
์๋ก์ฝ๋กฌ~~ ์ค์ event๊ฐ ์ผ์ด๋ input์ฐฝ์ด ์ ์ ํ๋๋ค!
์ฌ๊ธฐ๊น์ง ๊ตฌํํ๊ณ ๋๋ฉด ์ด๋ฐ ๋ชจ์ต์ด ๋๋ค!
์ฝ์ง๋ง ๋ฟ๋ฏํจ์ ํฐ.... ์ ๋ ธ๋ ๊ณ ํจ์จ ์ด๋ฒคํธ์๋ฐ ๐
ref ์๊ธฐ ๋์์ ๋ง์ธ๋ฐ ์ต๊ทผ์ ๋ณด๋ ๋ฆฌ์กํธ ref ๋ด๋ถ ๊ตฌํ์ด ์๊ฐ๋ณด๋ค ๋ณ๊ฑฐ ์๋๋ผ๊ณ ์... ๊ทธ๋ฅ ๊ฐ์ฒด ํ๋ ๋ง๋ค๊ณ Object.seal()๋ก current ์ญ์ ๋ชปํ๋๋ก ๋ด์ธํ๊ณ ๋.