섬 전체에 갈고리 상태를 반영하는 방법 🏝
9741 단어 tutorialwebdevreactjavascript
그러나 이러한 격리에는 공유 상태와 같은 규칙적인 패턴을 금지하는 제한 사항이 있습니다. 이 연습에서는 여러 아일랜드 간에 후크 상태를 동기화하고 애플리케이션의 논리를 체계적으로 유지하는 방법을 다룰 것입니다.
문제의 훅☀️/🌙
내 프로젝트에서 어두운 모드 기본 설정을 활성화하기 위해
"prefers-color-scheme: dark"
와 인터페이스에 이 간단한 후크를 추가하고 dark
요소에 body
클래스를 추가하고 기본 설정 재정의를 유지하도록 localstorage
에 설정했습니다.export function useDarkMode() {
const [dark, setDark] = useState(false);
function toggleDarkMode() {
const prefersDark = document.body.classList.toggle('dark');
setDark(prefersDark);
localStorage.setItem('prefers-dark', prefersDark);
}
useEffect(() => {
const prefersDark = localStorage.getItem('prefers-dark') === 'true';
const devicePrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
if ((prefersDark === null || prefersDark) && devicePrefersDark) {
toggleDarkMode();
}
}, []);
return [dark, toggleDarkMode];
}
이것은 트리거하는 버튼이 있는 렌더 트리에 대해 작동하지만
toggleDarkMode
, 아일랜드 접근 방식으로 인해 이 렌더 트리(및 내부 상태)는 다른 트리와 완전히 격리됩니다. 진입점에 관계없이 모든 요소가 올바른dark
상태에 있도록 하려면 섬 사이에 생명선이 있어야 합니다.입력: 이벤트 발송 🛟
이 문제(
MutationObserver
등)를 해결하기 위한 많은 접근 방식이 있지만 가장 간단한 방법은 이 후크의 다른 인스턴스가 수신 대기할 수 있는 이벤트를 전달하는 것입니다.이 경우 각 아일랜드가
toggleDarkMode
함수를 호출하도록 트리거하고 (적절한 조건으로) 해당 상태를 후크의 트리거 인스턴스와 동기화 상태로 유지합니다. 이를 달성하기 위해 위의 후크에 필요한 수정 사항은 다음과 같습니다.export function useDarkMode() {
function toggleDarkMode() {
// same code as above
window.dispatchEvent(new Event('dark-mode-preference-updated'));
}
function respondToEvent() {
const prefersDark = document.body.classList.contains('dark');
setDark(prefersDark);
}
useEffect(() => {
const prefersDark = localStorage.getItem('prefers-dark') === 'true';
const devicePrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
if ((prefersDark === null || prefersDark) && devicePrefersDark) {
if (!document.body.classList.contains('dark')) {
toggleDarkMode();
} else if (!dark) {
setDark(true);
}
}
window.addEventListener('dark-mode-preference-updated', respondToEvent);
return () => {
window.removeEventListener('dark-mode-preference-updated');
};
}, []);
}
요약하면 각 후크 인스턴스는 마운트 시 사용자의 색 구성표 기본 설정을 확인하고 동일한 함수를 호출하여 해당 값을 상태로 설정합니다.
그런 다음
toggleDarkMode
에 대한 모든 호출은 수신할 후크의 다른 모든 인스턴스에 대해 이벤트를 발생시켜 각각이 body
의 값을 확인하고 변경을 수행하지 않고 상태에 저장하게 합니다.localstorage
값은 트리거링 후크에 의해서만 설정되므로 후속 페이지 로드는 올바른 기본 설정 값을 얻습니다.이는 후크가 공유 상태와 관련하여 단순화하는 것을 목표로 하는 일부와 모순될 수 있지만 구성 요소 간에 공유되는 논리가 단일 위치에 있을 수 있습니다. 이 후크의 구현은
document.body.classList
가 진실의 소스가 됨으로써 단순화되지만 더 복잡한 이벤트를 사용하여 인스턴스 간에 데이터를 동기화할 수 있습니다. 어쨌든, 당신의 생각을 알려주고 다른 진입점에서 상태를 미러링하기 위한 다른 제안이 있으면 알려주세요!
Reference
이 문제에 관하여(섬 전체에 갈고리 상태를 반영하는 방법 🏝), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bryce/how-to-reflect-hook-state-across-islands-3e99텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)