[2.4장 다이얼로그 1] 2.4.5 withLayout(풀이) 에 관한 질문입니다.
안녕하세요 선생님 혼자 해보는 과정중에 질문이 있습니다.
import React from "react";
import Backdrop from "../components/Backdrop";
import Dialog from "../components/Dialog";
export const layoutContext = React.createContext({});
layoutContext.displayName = "LayoutContext";
export class Layout extends React.Component {
constructor(props) {
super(props);
this.state = {
dialog: null,
};
this.setDialog = this.setDialog.bind(this);
}
setDialog(dialog) {
this.setState({ dialog });
}
render() {
const value = {
dialog: this.state.dialog,
setDialog: this.setDialog,
};
return (
<layoutContext.Provider value={value}>
{this.props.children}
</layoutContext.Provider>
);
}
}
export const DialogContainer = () => (
<layoutContext.Consumer>
{({ dialog }) => dialog && <Backdrop>{dialog}</Backdrop>}
</layoutContext.Consumer>
);
export const withLayout = (WrappedComponent) => {
const WithLayout = (props) => (
<layoutContext.Consumer>
{({ dialog, setDialog }) => {
const openDialog = () => {
console.log("openDialog")
setDialog(<Dialog>hihi</Dialog>);
};
const closeDialog = () => {
setDialog(null);
};
const enhancedProps = {
openDialog,
closeDialog,
};
return (
<WrappedComponent {...props} {...enhancedProps}></WrappedComponent>
);
}}
</layoutContext.Consumer>
);
return WithLayout;
};
withLayout을 만들어서 openDialog, closeDialog를 enhancedProps로 전달을 하였습니다.
import * as MyLayout from "../lib/MyLayout";
const Page = ({ header, children, footer, openDialog }) => (
<div className="Page">
<header>{header}</header>
<main>{children}</main>
<footer>{footer}</footer>
<MyLayout.DialogContainer />
<button onClick={openDialog}>dialog</button>
</div>
);
export default MyLayout.withLayout(Page);
Page에서 MyLayout.DialogContainer이 기본값이 null인데 button을 추가하여 고차컴포넌트에서 주입받은 openDialog를 사용하여 Dialog를 렌더링하는데 성공하였습니다.
닫기도 해보고싶어서
import * as MyLayout from "../lib/MyLayout";
const Dialog = ({ closeDialog }) => (
<div className="Dialog">
<header>header</header>
<main>main</main>
<footer>footer</footer>
<button onClick={closeDialog}>closeDialog</button>
</div>
);
export default MyLayout.withLayout(Dialog);Dialog component에 닫기 버튼을 추가하려고 MyLayout.withLayout으로 감싸니

초기화 전에 참조하려 했다는데 이 에러 자체는 이해가 가지만 왜 지금 위 상황이 이 에러에 해당되는 상황인지 이해가 가지 않습니다...
Answer 1
1
Dialog.jsx에서 MyLayout 모듈을 가져올 때 참조 오류가 발생하네요
Uncaught ReferenceError: can't access lexical declaration 'withLayout' before initialization
순환 참조 오류인데요. 각 모듈이 서로 가져오기를 할경우 발생합니다. 이 경우는
MyLayout.jsx에서 Dialog.jsx를 불러오고
Dialog.jsx에서 MyLayout.jsx를 불러옴.
이 브라우져가 모듈을 가져올 때 종단점 없이 계속 가져오기를 시도하는데, 이 때 참조 오류를 예외로 발생시키는 현상입니다.
순환 참조는 코드가 많아질수록 발견될 가능성이 많고요. 고려해서 잘 설계하는 게 중요합니다.
관련해 정리한 내용도 참고해주세요.
잘못된 useEffect 사용?
1
65
2
useEffect 의존성 질문
1
57
2
orderableProductItem 에 관하여...
0
56
2
강의 자료, 블로그, 깃 주소
0
63
1
React 훅 구현 원리와 실무 패턴 관련 질문 (useState, useEffect 순서 및 핸들러 구조)
1
104
2
pushState로 주소를 바꾸면 렌더링이 안 되는 이유가 궁금합니다.
1
87
2
FormControl 컴포넌트 사용시 htmlFor prop 값 넘길 때 중괄호 이유
1
123
1
dispatch 함수도 리렌더링 유발하지 않나요?
1
203
2
ProductItem에서 onClick = {onClick}을 달지 않아도 되는 이유
1
160
2
replaceState를 쓰지 않는 대안
1
195
2
setValue 메서드를 바인딩 해야 하는 이유
1
163
2
MyReact를 IIFE(즉시실행함수)로 설계하신 이유
0
208
2
[4.4장 메모이제이션 훅] 4.4.3 memo 참조 비교
0
129
1
useRef 관련하여 질문드립니다
0
152
2
렌더 프롭 관련하여 질문드립니다
0
182
2
[1.2장 상품목록 화면] 1.2.3 Button ...rest 관련 질문 드립니다.
1
395
2
[4.4장 메모이제이션 훅] 4.4.4 useCallback curried function에 관한 질문입니다.
1
315
2
[4.4장 메모이제이션 훅] 4.4.2 useMemo 에서 every 함수에 관한 질문입니다.
1
355
2
[4.3장 리듀서 훅] 4.3.7 활용 MyForm(풀이) 오타 제보 및 질문이 있습니다.
1
281
2
[4.1장 레프 훅] useRef관련 질문이있습니다.
1
334
1
[1.3장 주문 내역 화면] 1.3.5 Card 조합 질문 있습니다
2
283
1
[3.5장 컨택스트 훅] 3.5.2 useContenxt 에서 질문이 있습니다.
1
432
2
[1.3.6 상태정의] state 관련
1
259
1
[2.1장 컨택스트] 2.1.4 공급자와 소비자 / 에서 질문이 있습니다.
1
424
2

