π³οΈ `querySelector` 체μ΄λ μ§μ₯: κ³Όλν DOM νμκ³Ό μ±λ₯ μ ν, μ μ§λ³΄μμ± μ ν
Summary
querySelector
체μ΄λμ DOM νμ μ±λ₯ μ ν, μ μ§λ³΄μμ± μ
ν, κΉ¨μ§κΈ° μ¬μ΄ μ½λ, κ°λ
μ± μ νλ₯Ό μΌκΈ°ν©λλ€. CSS μ νμ μ΅μ ν, querySelectorAll
, closest()
, React Refs, μ΄λ²€νΈ μμ, μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬ νμ© λ±μ λ°©λ²μΌλ‘ ν΄κ²°ν μ μμ΅λλ€.
Why Wrong?
querySelector
체μ΄λμ νΉμ μμλ₯Ό μ°ΎκΈ° μν΄ DOM νΈλ¦¬λ₯Ό κΉμ΄ νμνλ λ°©μμ
λλ€. νμ μ΄μμΌλ‘ κΉκ±°λ κΈ΄ 체μ΄λμ λ€μκ³Ό κ°μ λ¬Έμ μ μ μΌκΈ°ν©λλ€.
- μ±λ₯ μ ν: DOM νμμ λΉμ©μ΄ λ§μ΄ λλ μμ
μ
λλ€. νΉν 볡μ‘ν νμ΄μ§μμ
querySelector
체μ΄λμ κ³Όλνκ² μ¬μ©νλ©΄ λΈλΌμ°μ κ° μμλ₯Ό μ°ΎκΈ° μν΄ λΆνμν μ°μ°μ μνν΄μΌ νλ―λ‘ μ±λ₯μ΄ μ νλ μ μμ΅λλ€. - μ μ§λ³΄μμ± μ ν: 체μ΄λμ΄ κΈΈμ΄μ§μλ‘ μ½λλ₯Ό μ΄ν΄νκ³ μμ νκΈ° μ΄λ €μμ§λλ€. DOM κ΅¬μ‘°κ° λ³κ²½λλ©΄ 체μ΄λλ μ½λ μ 체λ₯Ό μμ ν΄μΌ ν μλ μμ΅λλ€.
- κΉ¨μ§κΈ° μ¬μ΄ μ½λ: DOM ꡬ쑰μ κ°νκ² κ²°ν©λμ΄, μ½κ°μ λ³κ²½μλ μ½λκ° μ½κ² λ§κ°μ§ μ μμ΅λλ€.
- κ°λ μ± μ ν: μ½λκ° κΈΈκ³ λ³΅μ‘ν΄μ Έμ λ€λ₯Έ κ°λ°μκ° μ½λλ₯Ό μ΄ν΄νκΈ° μ΄λ €μμ§λλ€.
μ΄λ¬ν μ΄μ λ‘ querySelector
체μ΄λμ μ΅μννκ³ , λ ν¨μ¨μ μΈ DOM νμ λ°©λ²μ΄λ μ κ·Ό λ°©μμ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
How to Fix?
λ€μκ³Ό κ°μ λ°©λ²μΌλ‘ querySelector
체μ΄λ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ΅λλ€.
- CSS μ νμ μ΅μ ν:
querySelector
μ μ λ¬νλ CSS μ νμλ₯Ό μ΅λν ꡬ체μ μΌλ‘ μμ±νμ¬ νμ λ²μλ₯Ό μ€μ λλ€. λΆνμν 볡μ‘ν μ νμλ₯Ό νΌνκ³ , idλ classλ₯Ό νμ©νμ¬ μ§μ μ μΌλ‘ μμλ₯Ό μ ννλ κ²μ΄ μ’μ΅λλ€. querySelectorAll
νμ©: μ¬λ¬ μμλ₯Ό ν λ²μ μ νν΄μΌ νλ κ²½μ°,querySelectorAll
μ μ¬μ©νμ¬ νμν μμλ§ μ ννκ³ λ°λ³΅λ¬Έμ ν΅ν΄ μ²λ¦¬ν©λλ€.closest()
λ©μλ νμ©: νΉμ μμμμ κ°μ₯ κ°κΉμ΄ μμ μμλ₯Ό μ°Ύμ λclosest()
λ©μλλ₯Ό μ¬μ©ν©λλ€. μ΄λ₯Ό ν΅ν΄ λΆνμν DOM νμμ μ€μΌ μ μμ΅λλ€.- React Refs μ¬μ©: Reactμμλ μ»΄ν¬λνΈ λ΄μμ DOM λ
Έλμ μ§μ μ κ·Όν΄μΌ νλ κ²½μ°,
useRef
ν μ μ¬μ©νμ¬ Refsλ₯Ό μμ±νκ³ ν΄λΉ DOM λ Έλλ₯Ό μ°Έμ‘°ν©λλ€. μ΄λ₯Ό ν΅ν΄querySelector
λ₯Ό μ¬μ©νμ§ μκ³ λ DOM λ Έλμ μ§μ μ κ·Όν μ μμ΅λλ€. - μ΄λ²€νΈ μμ: μ΄λ²€νΈ μμμ ν΅ν΄ μμ μμμ μ΄λ²€νΈ 리μ€λλ₯Ό λ±λ‘νκ³ , μ΄λ²€νΈκ° λ°μν μμμ λ°λΌ λ€λ₯Έ λμμ μνν©λλ€. μ΄λ₯Ό ν΅ν΄ κ°λ³ μμμ μ΄λ²€νΈ 리μ€λλ₯Ό λ±λ‘νλ λμ , μμ μμμ νλμ μ΄λ²€νΈ 리μ€λλ§ λ±λ‘νμ¬ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
- μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬ νμ©: 볡μ‘ν μν κ΄λ¦¬κ° νμν κ²½μ°, Redux, Zustand, Recoilκ³Ό κ°μ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬λ₯Ό νμ©νμ¬ μνλ₯Ό μ€μ μ§μ€μμΌλ‘ κ΄λ¦¬νκ³ μ»΄ν¬λνΈ κ°μ λ°μ΄ν° νλ¦μ ν¨μ¨μ μΌλ‘ μ μ΄ν©λλ€.
Before Code (Bad)
function handleClick() {
const element = document.querySelector('.container .item:nth-child(2) .content .title');
if (element) {
element.textContent = 'Updated Title';
}
}
After Code (Good)
import React, { useRef, useEffect } from 'react';
function MyComponent() {
const titleRef = useRef(null);
useEffect(() => {
if (titleRef.current) {
titleRef.current.textContent = 'Updated Title';
}
}, []);
return (
<div className="container">
<div className="item">
<div className="content">
<h2 className="title" ref={titleRef}>Original Title</h2>
</div>
</div>
</div>
);
}
export default MyComponent;