callback 형식 ref는 조금 되는 녀석을 해본다
개요
React hooks의 문서를 바라보고 있으면, 조금 신경이 쓰이는 useRef의 사용법이 쓰여져 있었다.
언제 어떤 상황에서 사용할 수 있는지도 포함하여 써 간다.
무엇을하고 싶은 사람
참조를 보고 있는 한, ref로 지정하고 있는 컴퍼넌트가 마운트된 타이밍에서 실행할 수 있는 함수를 ref에 쓸 수 있는 것처럼 보였다.
export default function App() {
const callbackref = useCallback(() => console.log("appのref"), []);
return <div ref={callbackref} className="App" />;
}
// appのref
다시 렌더링될 때
다시 렌더링되면 함수를 한 번 더 실행할지 시도합니다.
예상: 실행
export default function App() {
// 再レンダリング用
const [state, setState] = useState(false);
const toggleState = useCallback(() => setState(!state), [state]);
console.log({ state });
const callbackref = useCallback(() => console.log("appのref"), []);
return (
<div ref={callbackref} className="App">
<button onClick={toggleState}>toggle</button>
</div>
);
}
예상과 달리 첫 렌더링 때만 처리되는 것 같다.
자식 노드에도 가져 가자.
아이의 노드에도 callbackref를 건네줄 때는 어떤 순서로 처리되는지를 살펴본다
예상: 부모 → 아이의 순서
export default function App() {
// 再レンダリング用
const [state, setState] = useState(false);
const toggleState = useCallback(() => setState(!state), [state]);
console.log({ state });
const callbackref = useCallback((node) => console.log(node), []);
return (
<div ref={callbackref} className="pearent">
<div ref={callbackref} className="child" />
<button onClick={toggleState}>toggle</button>
</div>
);
}
이것도 예상과는 달리 아이→부모의 차례로 처리되었다.
이것은 순서도있을 수 있지만 렌더링 처리가 끝난 순서부터 처리 될 수 있습니다.
useEffect에 비해
useEffect 처리와의 순서를 본다
예상: 아이 → 부모 → useEffect
export default function App() {
// 再レンダリング用
const [state, setState] = useState(false);
const toggleState = useCallback(() => setState(!state), [state]);
useEffect(() => {
console.log('useEffect');
}, []);
const callbackref = useCallback((node) => console.log(node), []);
return (
<div ref={callbackref} className="pearent">
<div ref={callbackref} className="child" />
<button onClick={toggleState}>toggle</button>
</div>
);
}
이것은 예상대로, 마지막으로 useEffect의 처리가 왔다.
지금까지 알게 된 것
먼저 말했듯이, 쓰는 ref의 노드가 마운트된 후에만 처리되는 것 같다.
지금까지, 노드에 대해서 직접 처리를 하고 싶은 경우는 useEffect에 쓰고 있었지만, 이것을 사용하면, useEffect를 쓰지 않아도, 그 노드의 ref에 써 주면 잘 움직여 주는 것을 알 수 있었다.
사용미치
그리고 사용하기 쉽지만, 솔직히 생각하지 못합니다.
라이브러리 만들 때라든지, 조금 낡은 UI 만들거나 할 때는 사용할지도 모르지만, 조금 생각하지 않는다. . .
만약 이렇기 때문에 사용하고 있는 것 같은 것이 있으면 가르쳐 주었으면 합니다.
Reference
이 문제에 관하여(callback 형식 ref는 조금 되는 녀석을 해본다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/takujiro_0529/items/1bc5b3dd5a0e64ceec66
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
참조를 보고 있는 한, ref로 지정하고 있는 컴퍼넌트가 마운트된 타이밍에서 실행할 수 있는 함수를 ref에 쓸 수 있는 것처럼 보였다.
export default function App() {
const callbackref = useCallback(() => console.log("appのref"), []);
return <div ref={callbackref} className="App" />;
}
// appのref
다시 렌더링될 때
다시 렌더링되면 함수를 한 번 더 실행할지 시도합니다.
예상: 실행
export default function App() {
// 再レンダリング用
const [state, setState] = useState(false);
const toggleState = useCallback(() => setState(!state), [state]);
console.log({ state });
const callbackref = useCallback(() => console.log("appのref"), []);
return (
<div ref={callbackref} className="App">
<button onClick={toggleState}>toggle</button>
</div>
);
}
예상과 달리 첫 렌더링 때만 처리되는 것 같다.
자식 노드에도 가져 가자.
아이의 노드에도 callbackref를 건네줄 때는 어떤 순서로 처리되는지를 살펴본다
예상: 부모 → 아이의 순서
export default function App() {
// 再レンダリング用
const [state, setState] = useState(false);
const toggleState = useCallback(() => setState(!state), [state]);
console.log({ state });
const callbackref = useCallback((node) => console.log(node), []);
return (
<div ref={callbackref} className="pearent">
<div ref={callbackref} className="child" />
<button onClick={toggleState}>toggle</button>
</div>
);
}
이것도 예상과는 달리 아이→부모의 차례로 처리되었다.
이것은 순서도있을 수 있지만 렌더링 처리가 끝난 순서부터 처리 될 수 있습니다.
useEffect에 비해
useEffect 처리와의 순서를 본다
예상: 아이 → 부모 → useEffect
export default function App() {
// 再レンダリング用
const [state, setState] = useState(false);
const toggleState = useCallback(() => setState(!state), [state]);
useEffect(() => {
console.log('useEffect');
}, []);
const callbackref = useCallback((node) => console.log(node), []);
return (
<div ref={callbackref} className="pearent">
<div ref={callbackref} className="child" />
<button onClick={toggleState}>toggle</button>
</div>
);
}
이것은 예상대로, 마지막으로 useEffect의 처리가 왔다.
지금까지 알게 된 것
먼저 말했듯이, 쓰는 ref의 노드가 마운트된 후에만 처리되는 것 같다.
지금까지, 노드에 대해서 직접 처리를 하고 싶은 경우는 useEffect에 쓰고 있었지만, 이것을 사용하면, useEffect를 쓰지 않아도, 그 노드의 ref에 써 주면 잘 움직여 주는 것을 알 수 있었다.
사용미치
그리고 사용하기 쉽지만, 솔직히 생각하지 못합니다.
라이브러리 만들 때라든지, 조금 낡은 UI 만들거나 할 때는 사용할지도 모르지만, 조금 생각하지 않는다. . .
만약 이렇기 때문에 사용하고 있는 것 같은 것이 있으면 가르쳐 주었으면 합니다.
Reference
이 문제에 관하여(callback 형식 ref는 조금 되는 녀석을 해본다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/takujiro_0529/items/1bc5b3dd5a0e64ceec66
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
export default function App() {
// 再レンダリング用
const [state, setState] = useState(false);
const toggleState = useCallback(() => setState(!state), [state]);
console.log({ state });
const callbackref = useCallback(() => console.log("appのref"), []);
return (
<div ref={callbackref} className="App">
<button onClick={toggleState}>toggle</button>
</div>
);
}
아이의 노드에도 callbackref를 건네줄 때는 어떤 순서로 처리되는지를 살펴본다
예상: 부모 → 아이의 순서
export default function App() {
// 再レンダリング用
const [state, setState] = useState(false);
const toggleState = useCallback(() => setState(!state), [state]);
console.log({ state });
const callbackref = useCallback((node) => console.log(node), []);
return (
<div ref={callbackref} className="pearent">
<div ref={callbackref} className="child" />
<button onClick={toggleState}>toggle</button>
</div>
);
}
이것도 예상과는 달리 아이→부모의 차례로 처리되었다.
이것은 순서도있을 수 있지만 렌더링 처리가 끝난 순서부터 처리 될 수 있습니다.
useEffect에 비해
useEffect 처리와의 순서를 본다
예상: 아이 → 부모 → useEffect
export default function App() {
// 再レンダリング用
const [state, setState] = useState(false);
const toggleState = useCallback(() => setState(!state), [state]);
useEffect(() => {
console.log('useEffect');
}, []);
const callbackref = useCallback((node) => console.log(node), []);
return (
<div ref={callbackref} className="pearent">
<div ref={callbackref} className="child" />
<button onClick={toggleState}>toggle</button>
</div>
);
}
이것은 예상대로, 마지막으로 useEffect의 처리가 왔다.
지금까지 알게 된 것
먼저 말했듯이, 쓰는 ref의 노드가 마운트된 후에만 처리되는 것 같다.
지금까지, 노드에 대해서 직접 처리를 하고 싶은 경우는 useEffect에 쓰고 있었지만, 이것을 사용하면, useEffect를 쓰지 않아도, 그 노드의 ref에 써 주면 잘 움직여 주는 것을 알 수 있었다.
사용미치
그리고 사용하기 쉽지만, 솔직히 생각하지 못합니다.
라이브러리 만들 때라든지, 조금 낡은 UI 만들거나 할 때는 사용할지도 모르지만, 조금 생각하지 않는다. . .
만약 이렇기 때문에 사용하고 있는 것 같은 것이 있으면 가르쳐 주었으면 합니다.
Reference
이 문제에 관하여(callback 형식 ref는 조금 되는 녀석을 해본다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/takujiro_0529/items/1bc5b3dd5a0e64ceec66
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
export default function App() {
// 再レンダリング用
const [state, setState] = useState(false);
const toggleState = useCallback(() => setState(!state), [state]);
useEffect(() => {
console.log('useEffect');
}, []);
const callbackref = useCallback((node) => console.log(node), []);
return (
<div ref={callbackref} className="pearent">
<div ref={callbackref} className="child" />
<button onClick={toggleState}>toggle</button>
</div>
);
}
먼저 말했듯이, 쓰는 ref의 노드가 마운트된 후에만 처리되는 것 같다.
지금까지, 노드에 대해서 직접 처리를 하고 싶은 경우는 useEffect에 쓰고 있었지만, 이것을 사용하면, useEffect를 쓰지 않아도, 그 노드의 ref에 써 주면 잘 움직여 주는 것을 알 수 있었다.
사용미치
그리고 사용하기 쉽지만, 솔직히 생각하지 못합니다.
라이브러리 만들 때라든지, 조금 낡은 UI 만들거나 할 때는 사용할지도 모르지만, 조금 생각하지 않는다. . .
만약 이렇기 때문에 사용하고 있는 것 같은 것이 있으면 가르쳐 주었으면 합니다.
Reference
이 문제에 관하여(callback 형식 ref는 조금 되는 녀석을 해본다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/takujiro_0529/items/1bc5b3dd5a0e64ceec66
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(callback 형식 ref는 조금 되는 녀석을 해본다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/takujiro_0529/items/1bc5b3dd5a0e64ceec66텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)