일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- GraphQL
- 연결리스트
- alexnet
- 자바스크립트
- Machine Learning
- 스택
- 코딩테스트
- 릿코드
- 프론트엔드
- 알고리즘
- 포인터
- RT scheduling
- 자료구조
- 브라우저
- 컨테이너
- 연결 리스트
- 웹팩
- 프로세스
- RxJS
- 프로그래머스
- 배열
- C
- vue3
- 큐
- APOLLO
- 타입스크립트
- pytorch
- 해시테이블
- cors
- 이진탐색
- Today
- Total
프린세스 다이어리
[Vue3] [Vue warn]: Missing required prop: "list" 해결법 본문
하루 종일 고민했는데, 기본적인 Vue 라이프사이클을 이해하면 해결할 수 있는 문제였다.
부모는 bookingListPage, 자식은 bookingList 컴포넌트 구조인 상태에서, bookingListPage에서 데이터 요청을 하고 bookingList로 props를 넘겨주는 방식이다. 파일 구조는 대충 이런 식이다.
store
ㄴ BookingListStore.ts
ㄴ index.ts
component
ㄴ BookingList.vue
ㄴ BookingEmptyState.vue
views
ㄴ BookingListPage.vue
먼저 BookingListStore.ts 에 bookingList 등의 state가 있고, 백엔드에 리스트를 요청하여 state를 변경해주는 actions가 있다.
const BookingListStore = {
state: (): StateI => ({
list: [],
...
}),
mutations: {
setState: setState,
...
},
actions: {
async getList(
context: ActionContext<StateI, StateI>,
{status, size, page}: PayloadI,
): Promise<void> {
try {
const response = await ...
context.commit('setState', {
list: response.data.result.list,
...
})
} catch (e) {
console.log(e)
alert('내역을 가져올 수 없습니다.')
} finally {
...
}
}
}
}
이 actions를 BookingListPage의 mounted 시점에 호출하기로 했다.
computed: {
...mapState('bookingListStore', ['list'])
},
methods: {
...mapActions('bookingListStore', ['getList']),
...
},
async mounted() {
await this.getList({
// payload
})
...
}
mounted 시점에 actions 를 호출하고 나서, actions에서는 list라는 state에 값을 넣어줄 것이므로, bookingList props로 list를 내려 주었다.
<booking-list
:list="list"
/><booking-list />
이 시점에서 제목과 같은 warning이 발생했다. [Vue warn]: Missing required prop: "list" 라면서, bookingList에는 props로 list가 필수로 있어야 하는데 list 로 값이 안 들어온다는 것이다. actions 함수 호출도 문제없게 하고, props 넘겨주는 방법에도 문제가 없었는데 이런 일이 발생한 이유가 무엇일까 몇 시간이나 고민했다.
답은 fetch한 값을 직접적으로 컴포넌트 또는 페이지에서 받아서 내부 state에 저장해주면 해결이 되는 문제점이었다. mounted에서 actions를 호출한다고 해서, 그 actions 내부에서 commit 한 state 값이 컴포넌트들이 mounted 되는 시점에 준비된 상태는 아니다.
그렇게 돌아돌아 리스트를 받는 대신, mounted에서 actions를 호출하는 게 아니라 직접 서버에 요청하는 메서드를 호출하여 그 result를 내부 state(vue3 에서는 setup)에 넣어주게 되면 이 문제는 해결이 된다.
setup() {
const bookingList = ref([]) as Ref<RentCarBookingListItemI[]>;
return {
bookingList,
}
},
...
async mounted() {
try {
if (this.isFetching) return;
const result = await this.fetchList();
this.bookingList = result.list;
} catch (e) {
console.log(e);
} finally {
this.isFetching = false;
}
}
이렇게 컴포넌트 또는 페이지 내부에서 함수를 호출하고, 그 값을 직접 해당 내부의 state에 넣어주면 문제 없이 작동함을 확인할 수 있다.
'FE' 카테고리의 다른 글
[Vue3, TypeScript] Type 'ResponseI' is missing the following properties from type 'ResultI' 에러해결 (0) | 2021.09.20 |
---|---|
[Vue3] Axios로 로컬에 있는 json 목데이터 가져오는 법 참쉽죠 (0) | 2021.09.19 |
[Vue3] lodash debounce 메서드 vue에서 사용하는 방법 (0) | 2021.09.17 |
웹팩의 핵심 구성 요소 4가지, 프론트엔드 개발에 꼭 필요한 추가 요소 (0) | 2021.09.11 |
웹팩(Webpack)의 역할과 프론트엔드 개발에 웹팩이 필요한 이유 (0) | 2021.09.10 |