Niespodziewana refleksja na taborecie z liną w dłoniach

twojacena.pl 4 dni temu

Krzysztof z opóźnieniem zdał sobie sprawę, iż stoi na taborecie z liną w rękach i iż jego zamiary mogą być źle zrozumiane.

Siedział na łóżku w samych bokserkach, opuszczając nogi na podłogę. Znów wydawało mu się, iż słyszy głos matki.

„Krzysztof, synku… Krzysztof…”

Prawie każdej nocy budził się od tego głosu. Wiedział, iż nie mogła go wołać, bo od trzech tygodni już nie żyła. Mimo to siadał, nasłuchiwał, czekał.

Ostatnie pół roku nie wstawała z łóżka. Krzysztof pracował zdalnie, by być przy niej. Próbował zatrudnić opiekunkę, ale po trzech dniach uciekła, zabierając wszystkie oszczędności i złotą biżuterię matki. Nie ryzykował już więcej.

Siedząc przy komputerze, nasłuchiwał, by na pierwsze zawołanie biec do niej. Męczył się tak, iż czasem zasypiał przed monitorem. Tamtej nocy też obudził się od jej głosu, rzucił do pokoju. Ale już nie oddychała. Płakał i błagał ją w myślach o wybaczenie, bo oprócz żalu czuł ulgę. Wyzwolenie.

Minęły trzy tygodnie, a on wciąż nie czuł radości, tylko ciężką pustkę.

Matka była zawsze pełna życia, śp## useRef 란?
> DOM을 직접 선택/제어해야 할 때 useRef()를 사용한다.

„`jsx
const refContainer = useRef(initialValue);
„`

– `useRef()`는 `{current: …}` 의 객체를 반환하고, 이 객체는 `current` 프로퍼티를 가지고 있다.
– 인자로 넘어온 `initialValue`로 `current` 프로퍼티의 값을 초기화한다.
– 반환된 객체는 컴포넌트의 전 생애주기를 통해 유지된다.
– `.current` 프로퍼티를 변경해도 리렌더링이 발생하지 않는다.

### useRef()의 활용법

1. DOM에 접근하기
„`javascript
import { useRef } from 'react’;

function TextInputWithFocusButton() {
const inputEl = useRef(null);
const onButtonClick = () => {
// `current` points to the mounted text input element
inputEl.current.focus();
};
return (


Focus the input
>
);
}
„`
– `ref` 어트리뷰트에 `{current: …}` 객체를 전달하면, React가 노드가 생성될 때 `current` 프로퍼티를 설정하고, 파괴될 때 `null` 로 되돌려 놓는다.

2. 클래스의 인스턴스 프로퍼티와 유사한 역할
– 리렌더링 없이 값을 유지할 수 있다.
– `useRef` 안의 값을 변경해도 리렌더링이 일어나지 않기 때문에, 컴포넌트의 생애주기 동안에 안정적인 값을 유지할 수 있다.
„`javascript
function Timer() {
const intervalRef = useRef();

useEffect(() => {
const id = setInterval(() => {
// …
});
intervalRef.current = id;
return () => {
clearInterval(intervalRef.current);
};
});

// …
}
„`

3. `useRef()`는 내용이 변경될 때 그것을 알려주지는 않는다.
– `.current` 프로퍼티를 변형하는 것이 리렌더링을 발생시키지는 않는다.
– React가 DOM 노드에 ref를 attach하거나 detach할 때 어떤 코드를 실행하고 싶다면, `콜백 ref` 를 사용해야 한다.

### 주의할 점

„`jsx
function MyComponent() {
const ref = useRef(null);
// ref.current의 초기값은 null
// ref.current는

객체로 할당된다.
return
안녕!

}
„`

„`jsx
function MyComponent() {
const [show, setShow] = useState(false);
const ref = useRef(null);

useEffect(() => {
if (ref.current === null) { // !!!
console.log(’레퍼런스가 엘리먼트를 가리키지 않음’);
}
}, []);

return (

{show &&

안녕!

}
setShow(!show)}>토글
>
)
}
„`
– 위 예시에서 처음 렌더링 시점에 `show` 는 false 이고, `div` 엘리먼트는 아직 존재하지 않는다. 따라서 `useEffect` 에서 `ref.current` 는 여전히 `null` 이다.
– `ref.current`가 `div` 를 가리키도록 업데이트되고 나면, **리렌더링이 일어나지 않는다.**
– `ref.current` 가 변경되는 시점에 어떤 코드를 실행하고 싶다면, `콜백 ref`를 사용해야 한다.

### useRef의 useCallback

„`jsx
function MeasureExample() {
const [height, setHeight] = useState(0);

const measuredRef = useCallback(node => { // 콜백 ref
if (node !== null) {
setHeight(node.getBoundingClientRect().height);
}
}, []);

return (

Hello, world

The above header is {Math.round(height)}px tall

>
);
}
„`

– useRef 대신 `useCallback(ref콜백)` 을 사용하면 `ref`가 다른 노드에 연결될 때마다 해당 콜백이 호출된다.
– `ref콜백` 은 `useCallback` 으로 감싸줘야 성능상의 이점을 얻을 수 있다. (그렇지 않으면 매 렌더링마다 새로운 함수 인스턴스가 생성된다.)

Idź do oryginalnego materiału