반응형
반응 사용비동기 대기 결과에 따라 효과 정리 기능이 달라짐
나는 일부 자원을 비동기적으로 얻은 다음 자원 변경에 가입하는 반응 구성요소를 가지고 있다.
문제는 정리 기능이 이 자원의 폐쇄에 있지 않다는 점이다.
useEffect(() => {
const onResourceChange = () => {
console.log('resource changed');
};
getSomeResource().then(resource => {
resource.subscribe(onResourceChange);
});
return () => {
resource.unsubscribe(onResourceChange); // Error! resource is undefined
}
}, []);
다음에서 비동기 함수를 사용한 이후useEffect
허용되지 않음, 내부 자원으로부터 등록을 취소하는 가장 좋은 방법은 무엇인가?useEffect
의 정리 기능?
나는 여기서 두 가지 "부작용"이 일어나고 있는 것을 본다.
- 리소스 가져오기(한 번 실행 필요, 종속성)
[]
) - 콜백 구독/구독 해제(리소스 변경, 종속성, 종속성,
[resource]
)
그래서 나는
- 두 개의 "단계"로 구분(각 단계, 하나의 부작용 처리)
- 그리고 그것을 관습의 갈고리로 추출한다.
function useResource() {
const [resource, setResource] = useState(undefined)
const onResourceChange = () => console.log('resource changed');
// Get the resource, initially.
useEffect(() => {
getSomeResource(setResource)
}, [])
// When the resource is retrieved (or changed),
// the resource will subscribe and unsubscribe
useEffect(() => {
resource.subscribe(onResourceChange)
return () => resource.unsubscribe(onResourceChange)
}, [resource])
}
// Use it like this
function App() {
useResource()
return <>your elements</>
}
보다시피 첫째는useEffect
2번째는 "foll"만 가져오는 반면, 2번째는 것.useEffect
콜백 해제/해제 책임이 있다.
그리고 체크아웃:deps
각각에 열거하다useEffect
(전자가 비어 있다.[]
후자가 의지하고 있는 동안에[resource]
)
이건 해결책이야, 아마 추악한...그러나 여전히 해결책:)
useEffect(() => {
const onResourceChange = () => {
console.log('resource changed');
};
let data = {};
getSomeResource().then(resource => {
data.resource = resource;
resource.subscribe(onResourceChange);
});
return () => {
data.resource && data.resource.unsubscribe(onResourceChange); // Error! resource is undefined
};
}, []);
반응형
'programing' 카테고리의 다른 글
rxjs 관찰 가능 .map 실행되지 않음 (0) | 2022.04.09 |
---|---|
각도 2: 값이 변경된 후 FormControl 검증기 업데이트 (0) | 2022.04.09 |
반응 및 물질적 유의를 통한 양식 검증 (0) | 2022.04.09 |
VueJ의 구성 요소 템플릿에서 Vuetify 대화 상자 열기s (0) | 2022.04.09 |
동일한 구성 요소 내부에서 호출될 때 라우터 "링크"가 새 데이터를 로드하지 않음 (0) | 2022.04.08 |