inflearn logo
강의

Course

Instructor

[React Part 2] Advanced Topics and Hooks

[Chapter 2.4 Dialog 1] 2.4.5 withLayout(Solution)

[2.4장 다이얼로그 1] 2.4.5 withLayout(풀이) 에 관한 질문입니다.

Resolved

272

dohyunlim

67 asked

1

안녕하세요 선생님 혼자 해보는 과정중에 질문이 있습니다.

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으로 감싸니

초기화 전에 참조하려 했다는데 이 에러 자체는 이해가 가지만 왜 지금 위 상황이 이 에러에 해당되는 상황인지 이해가 가지 않습니다...

react React-Context react-hooks react-router react-component

Answer 1

1

jeonghwan

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