• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 Vue 게시판 props 관련 질문입니다.

props 관련 질문입니다.

3 글 보임 - 1 에서 3 까지 (총 3 중에서)
  • 글쓴이
  • #132512

    뷰발뉴비
    참가자
    App.vue
    
    <template>
      <div>
         Vue logo
     
        <!-- 모달 컴포넌트에 원룸들, 누른거, 모달창열렸니, closemodal 메소드를 넣어줌 -->
        <modal :원룸들="원룸들" :누른거="누른거" :모달창열렸니="모달창열렸니" :closemodal="closemodal"/>
        <div class="menu">
          <a v-for="(name, i) in menus" :key="i">{{ name }}</a>
        </div>
        <discount />
        <div v-for="(data, i) in 원룸들" :key="i">
          
          <h4 @click="모달창열렸니 = true; 누른거 = i"> {{ data.title }} </h4>
          <p>{{ data.price }}원</p>
          <button @click="신고수[i]++">허위매물신고</button>
          <span>신고수 : {{ 신고수[i] }}</span> <br><br>
        </div>
      </div>
    </template>
    <script>
    import discount from './components/Discount.vue';
    import data from './oneroom.js';
    import modal from './components/Modal.vue'
    export default {
      name: 'App',
      data() { // 앵간하면 데이터들은 밑으로 보낼 땐 props만 쓰면 되는데 위로 올리는건 불편하니까 그냥 최상위 컴포넌트에 데이터 다 집어넣자.
        return {
          menus: ['Home', 'Shop', 'About'],
          신고수: [0, 0, 0, 0, 0, 0],
          모달창열렸니: false,
          원룸들: data,
          누른거: 0,
        }
      },
      methods: {
        closemodal() {
          this.모달창열렸니 = false
        },
        handleEscKey(event) {
          if (event.key === "Escape") {
            this.closemodal(); // ESC 키가 눌리면 모달 닫기
          }
        }
      },
      mounted() {
        window.addEventListener('keydown', this.handleEscKey);
      },
      unmounted() {
        window.removeEventListener('keydown', this.handleEscKey);
      },
      components: {
        discount: discount,
        modal : modal,
      }
    }
    </script>
    <style>
    #app {
      font-family: Avenir, Helvetica, Arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      text-align: center;
      color: #2c3e50;
      margin-top: 60px;
    }
    body {
      margin: 0;
    }
    div {
      box-sizing: border-box;
    }
    .menu {
      background: darkslateblue;
      padding: 15px;
      border-radius: 5px;
    }
    .menu a {
      color: white;
      padding: 10px;
    }
    .black-bg {
      width: 100%;
      height: 100%;
      background: rgba(0, 0, 0, 0.5);
      position: fixed;
      padding: 20px;
    }
    .white-bg {
      width: 100%;
      background: white;
      border-radius: 8px;
      padding: 20px;
    }
    .room-img {
      width: 100%;
      height: 100%;
    }
    .Discount {
      background: #eee;
      padding: 10px;
      margin: 10px;
      border-radius: 5px;
    }
    </style>
     
    Modal.vue
    <template>
      <div class="black-bg" v-if="모달창열렸니 == true">
        <div class="white-bg">
          
          <h4>{{ 원룸들[누른거].title }}</h4>
          <p>{{ 원룸들[누른거].content }}</p>
          <p>{{ 원룸들[누른거].price }}원</p>
          <button @click="closemodal">닫기</button> <!-- props는 read-only이기 때문에, 모달창열렸니 = false 마냥 등호를 지 멋대로 바꾸면 안되기에, closemodal 함수로 하여금 상태를 boolean으로 변경함.-->
        </div>
      </div>
    </template>
    <script>
    export default {
      name: 'Modal',
      props: {
        원룸들: Array,
        누른거: Number,
        모달창열렸니: Boolean,
        closemodal: Boolean,
      }
    }
    </script>
    <style>
    </style>
    
    
    
    
    로 했는데,     closemodal: Boolean <-- 얘를 function으로 저장하지 않음 안된다고 gpt가 그러는데
    실제론 잘 동작합니다. 혹시나 코드가 동작이 안하는건가 싶어서 Boolean을 지워보면 닫기 버튼 실행이 안되구요. Function을 넣어야하는데 Boolean을 넣었음에도 동작하는 이유가 뭔지 알 수 있을까요?
    
    이 이유가 Vue의 렌더링 시스템이 자동으로 값을 평가하기 때문이라는데, props로 전달된 데이터가 Function인데도 Boolean으로 정의했을 경우, Vue는 이를 무조건적으로 true로 평가합니다.
    라고 하는데, 이 말이 이해가 안됩니다. false와 true값을 반대로 바꿔서 해봐도 정상 작동합니다.
    props의 정확한 구동원리를 알고 싶고, 제가 짠 코드임에도 이게 맞나 헷갈립니다.
    물론 지금처럼 props로 박는것보다 emit으로 만드는게 데이터 흐름이 단방향이라 구조가 명확하고, 자식 컴포넌트는 데이터 변경 방법을 모르고 신호만 보내니 독립적으로 재사용 가능해서 더 용이한 것은 알고 있으나 단순한 궁금증이 생겨 여쭤봅니다.
    • 이 게시글은 뷰발뉴비에 의해 7 월, 3 주 전에 수정됐습니다.
    #132534

    codingapple
    키 마스터
    props에 타입적는건는 타입 힌트일 뿐이라 틀려도 동작은 됩니다 근데 빼먹으면 props가 동작하진 않습니다
    #132884

    뷰발뉴비
    참가자
    아하 타입 체크는 컴파일러(또는 에디터 수준)에서만 이루어지고, 실제 실행 시에는 무시된다는 거군요...
3 글 보임 - 1 에서 3 까지 (총 3 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠