React Native에서 모달을 전역적으로 제어(refs 사용)
10667 단어 reactnativejavascriptmodals
왜요?
Modals에 관한 공식 React Native 문서에서 상태를 사용하고 props를 통해 데이터를 전달하여 모달 가시성 콘텐츠 및 데이터를 제어할 수 있지만 참조를 RN Modal 구성 요소에 직접 전달할 수는 없음을 알고 있습니다. 이는 더 크고 복잡한 프로젝트의 경우 전역 수준에서 모달을 제어하려는 경우 다음 중 일부를 수행할 수 있음을 의미합니다.
이제 질문은 사용자 지정 모달 구성 요소를 한 번만 만들고 복잡한 소품 전달이나 컨텍스트 사용에 의존하지 않도록 방법을 구현할 수 있다면 어떨까요?
서로 다른 구성 요소 간에 어디에서나 간단한 .showModal(data) 메서드 호출이 완벽할 것이며 이 블로그에서 공유할 주제입니다.
일부 면책 조항
이것은 아마도 React Native를 처음 사용하는 사람들을 위한 것은 아니지만 refs로 사용자 정의 기능을 구현한다는 아이디어에 대한 훌륭한 개방자입니다. 이 블로그의 내용은 여러 구성 요소에서 동일한 모달을 사용하는 더 큰 프로젝트에 더 잘 적용됩니다. 앱이 단순하다면 더 간단한 구현을 고수하는 것이 더 나을 것입니다.
구현
1) 커스텀 모달 만들기
React Native 문서에서 rawexample here를 수정했습니다.
2) modalRef를 추가한 다음 후크 useImperativeHandle 및 forwardRef()를 추가합니다.
const CustomModal = () => {
const [modalVisible, setModalVisible] = useState(false);
const modalRef = useRef<CustomModalRef>();
useImperativeHandle(
modalRef,
() => ({
show: () => {
setModalVisible(true);
},
hide: () => {
setModalVisible(false);
},
}),
[]
);
// rest of your code
}
export default forwardRef(CustomModal);
저는 Typescript를 사용하므로 당신도 사용한다면 CustomModalRef에 이 유형을 사용할 수 있습니다.
export type CustomModalRef = {
show: () => void
hide: () => void
}
3) 모달 참조를 관리하기 위해 정적 변수 및 함수를 사용할 모달 컨트롤러 클래스를 만듭니다.
import { MutableRefObject } from "react"
export type CustomModalRef = {
show: () => void
hide: () => void
}
export default class ModalController {
static modalRef: MutableRefObject<CustomModalRef>;
static setModalRef = (ref: any) => {
this.modalRef = ref
}
static showModal = () => {
this.modalRef.current?.show()
}
static hideModal = () => {
this.modalRef.current?.hide()
}
}
showModal 및 hideModal 정적 메서드는 선택 사항일 수 있으며 current.show를 직접 호출할 수 있지만 더 많은 사용자 정의 기능을 제공하기 위해 메서드를 생성하기로 했습니다.
4) Custom Modal의 모달 참조를 Modal Controller 클래스의 정적 변수에 할당합니다.
const CustomModal = () => {
const [modalVisible, setModalVisible] = useState(false);
const modalRef = useRef<CustomModalRef>();
useLayoutEffect(() => {
ModalController.setModalRef(modalRef)
}, [])
useImperativeHandle(
// rest of the code
ref 값을 업데이트하기 때문에 useLayoutEffect를 사용했습니다. useEffect와 useLayoutEffect의 차이점에 대해 읽을 수 있습니다. Kent C. Dodds의 이 훌륭한 내용blog을 확인할 수 있습니다.
5) 최상위 구성 요소(일반적으로 App.tsx)에서 구성 요소를 선언합니다.
export default function App() {
return <NavigationContainer>
<MainStack/>
<CustomModal/>
</NavigationContainer>
}
6) ModalController 클래스를 사용하여 모달을 표시하거나 숨깁니다.
구성 요소에서 사용(SomeScreen.js)
/*
* Component code/logic in between
*/
return (
<SomeComponent/>
<Button
title="Show modal"
onPress={() => {
ModalController.showModal();
}}
/>
)
이것은 아래 GIF에서 예상되는 동작 쇼입니다.
추천
이제 이 개념을 확장하여 새로운 타사 라이브러리나 모달을 관리하기 위해 특별히 만든 컨텍스트 공급자 설정을 추가하지 않고도 쉽게 호출할 수 있는 매우 유연한 전역 모달을 만드는 문자열 메시지와 같은 데이터를 허용할 수 있습니다. 이것을 확인할 수 있습니다Github repository. 이 정확한 예를 보여 주지만 메시지 매개변수를 추가하여 만들었습니다. 이 리포지토리를 복제하고 상용구 분기에서 체크아웃할 수 있습니다.
시간을 내어 읽어주셔서 감사합니다. 도움이 되었기를 바랍니다.
귀하의 지원은 대단히 감사하겠습니다. 나에게 커피를 사주는 것은 많은 것을 의미할 것이다
https://www.buymeacoffee.com/royce.chua
이 블로그는 아마 곧 Youtube에 비디오가 게시될 것입니다. 라는 내 블로그를 보완할 을(를) 구성하고 있습니다. 곧 일부 콘텐츠를 방문하십시오.
Reference
이 문제에 관하여(React Native에서 모달을 전역적으로 제어(refs 사용)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/roycechua/globally-control-modals-on-react-native-using-refs-5368텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)