[ Introduction ]

mixin 은 Vue.js 에서 재사용 가능한 기능을 한 곳에 묶어 코드의 중복을 줄여주기 위해 등장한 방법입니다. 예컨대, 이메일 혹은 비밀번호 등의 정규식 Rule 을 mixin 이라는 개념으로 묶어 한 곳에서 관리하고, 해당 정규식이 필요한 View 에서 mixin 을 가져다가 (import) 쓸 수 있습니다. 그러나, Mixin 을 사용할 때 주의해야 할 점이 있습니다. Mixin 내부에서 API 를 호출하는 것은 지양하는 것이 좋다는 것 입니다. 그 이유를 아래에서 함께 살펴보도록 하겠습니다. 

[ Description ]

- 아래의 예제 및 설명은 모든 API 를 created 에서 호출한다고 가정하고 진행합니다.

 

[ 사전 지식 ]

- mixin 의 created() 는 view 의 created() 보다 항상 먼저 호출됩니다.

 

mixin file 내부

 

mixin 을 가져다 사용하려는 view 내부

 

mixin 의 created 가 view 의 created 보다 먼저 호출된 것을 알 수 있습니다

 

[ 문제의 제기 ]

 - mixin 의 created() 에서 api 를 호출했을 경우, 모든 Logic 을 마치기 전에 view 의 created() 가 호출 됩니다.

 

mixin file 내부 - created() 에서 API 를 호출하고 있다

 

mixin 을 가져다 사용하는 view 파일 내부 - created() 에서 API 를 호출하고 있다.

 

* 필자는 위의 로직을 처음 만들었을 때, console 에 mixin step 1 -> mixin step 2 -> mixin step 3 -> vue step 1 -> vue step 2 -> vue step 3 이 찍힐 것으로 기대했다. 그 이유는 [사전 지식]의 예시 처럼 mixin 의 created() 가 view 의 created() 보다 항상 먼저 호출 되기 때문이다. 그러나 예상과는 달리 결과는 아래와 같았다. 

 

엥... 순서가 왜이리 뒤죽박죽 이지...

 

* 위의 예시를 통해 알 수 있는건 mixin 의 created() 가 해당 mixin 파일을 호출한 view 의 created() 보다 항상 먼저 호출은 되지만 그렇다고 mixin 의 모든 로직이 항상 mixin 을 호출한 view 의 로직보다 선행된다는 것은 아니라는 것입니다. 요컨대, mixin 의 created() 에서 api 를 호출하고 그 응답 값을 해당 mixin 을 호출한 view 에서 사용하려는 것은 안전하지 않은 방법입니다.

 

 

[ 해결 방안 ]

- 위의 문제를 해결하려면 mixin 에서는 api 를 호출하는 함수를 정의만 하되 실제 해당 함수를 호출하는 것은 mixin 이 아닌 해당 mixin 을  호출한 view 에서 해야 한다. 필자는 위에 해당 방법의 예시로 아래 case 를 제시합니다.

 

mixin 에서 api 를 호출하는 mixinFunction 을 호출하지 않고, 해당 함수를 mixinFun 이라는 변수에 담아 정의했다.

 

mixin 에서 함수를 담고 있는 변수(data) 인 mixinFun 을 view 에서 호출했다  

 

그 결과는 위와 같다.

 

[ 참고 ]

- 예시에 사용 된 코드는 vue-cli (3.9.2 version) 로 생성한 프로젝트에 기반하고 있습니다.

 

https://github.com/GwangGeun/vueJs-blog-content/blob/master/src/views/Mixin.vue

 

 

'Front-End > Vue.js & Vuex' 카테고리의 다른 글

v-model 사용시 주의점 #1  (0) 2020.01.26
v-model 사용시 주의점 #2  (0) 2020.01.19

[ Introduction ]

 v-model 은 form element 에 "data 의 양방향 바인딩" 을 가능하게 해주는 지시문 입니다. 그러나, v-model 을 사용하다보면 v-model 에 binding 되어 있는 value 값이 종종 user 가 입력한 값 그대로 반영되지 않고 일부분만 반영되거나 예상치 못한 값이 들어가있는 것을 확인 할 수 있습니다. 그 이유는 "한글" 은 "중국어" 와 "일본어" 등과 같이 IME 가 필요한 언어이기 때문입니다. 이를 해결하기 위해서 공식문서는 input event 와 "data의 단방햔 바인딩" 을 가능하게 해주는 v-bind 를 사용해서 해결하라고 안내주고 있습니다. 따라서, 입력값이 단순 숫자 혹은 영어의 형태가 아닐 것으로 예상되는 경우에 v-model 을 사용하는 것은 지양하는 것이 좋습니다. 참고로 여기에서의 IME 라 함은 "영어" 처럼 1byte 로 이루어진 언어가 아닌 "한글" 과 같은 언어를 컴퓨터가 입력받기 위해 필요한 "system software" 를 의미합니다. 

 

[ Example ]

1. 잘못된 사례

입력 값이 "영어"가 아닐 경우 사용자의 입력 값이 입력 값 그대로 value 에 할당되지 않을 수 있다. 

 

2. 올바른 사례 

input event 와 v-bind 를 사용해서 v-model 을 대체할 수 있다.

 

[ 참고 ]

- 예시에 사용 된 코드는 vue-cli (3.9.2 version) 로 생성한 프로젝트에 기반하고 있습니다.

 

https://github.com/GwangGeun/vueJs-blog-content/blob/master/src/views/Input.vue

 

- 공식 홈페이지 참고 내용  

 

https://kr.vuejs.org/v2/guide/forms.html

'Front-End > Vue.js & Vuex' 카테고리의 다른 글

mixin 사용시 주의점  (0) 2020.02.16
v-model 사용시 주의점 #2  (0) 2020.01.19

[ Content ]

computed 로 지정한 값을 v-model 에 사용하기 위해서는 computed 에 get 뿐만이 아닌 set 함수를 지정해줘야 합니다.
그렇지 않으면, 아래와 같은 에러를 볼 수 있습니다.

 

Computed property "model" was assigned to but it has no setter

 

[ Example ]

1. 잘못된 사례

  1-1) 예시 코드

 

위의 경우에는 computed 에 get 함수만 정의되어 있습니다.

 

  1-2) 실행 결과

 

error 발생과 함께 data binding 또한 제대로 이루어지고 있지 않은 상태임을 확인 할 수 있습니다.

 

 

2. 올바른 사례

  2-1) 예시 코드

 

이번에는 computed 에 get 뿐만이 아닌 set 함수도 정의되어 있습니다.

 

  2-2) 실행 결과 

 

위의 코드를 실행한 결과 위와 같이 에러 없이 잘 작동하는 것을 볼 수 있습니다.

 

[ 참고 ]

- 예시에 사용 된 코드는 vue-cli (3.9.2 version) 로 생성한 프로젝트에 기반하고 있습니다.

 

https://github.com/GwangGeun/vueJs-blog-content/blob/master/src/views/Vmodel.vue

 

- 공식 홈페이지 참고 내용  

 

https://vuejs.org/v2/guide/computed.html#Computed-Setter

 

Computed Properties and Watchers — Vue.js

Vue.js - The Progressive JavaScript Framework

vuejs.org

 

'Front-End > Vue.js & Vuex' 카테고리의 다른 글

mixin 사용시 주의점  (0) 2020.02.16
v-model 사용시 주의점 #1  (0) 2020.01.26

+ Recent posts