|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: "Vue.js에서 nextTick 사용하기" |
| 4 | +date: 2017-01-19 21:36:00 +0900 |
| 5 | +categories: jekyll update |
| 6 | +author: "developerjin" |
| 7 | +excerpt: "Vue.js에서 데이터 갱신 후 UI조작시 생기는 문제와 해결방법을 알아봅시다." |
| 8 | +--- |
| 9 | + |
| 10 | +### Vue.$nextTick |
| 11 | + |
| 12 | +`Vue.js`를 어느정도 사용하고 있다가 데이터와 UI를 건드리는 상황에서 간헐적으로 DOM을 못찾는 상황을 겪어보셨을지 모르겠습니다. 겪지 않으셨더라도 언제가는 겪게 될 일이죠. (저는 이미 이 일을 겪게 되었습니다.) |
| 13 | + |
| 14 | +네트워크 요청을 하던가, 어떤 데이터를 `vue._data`에 삽입하자마자 삽입 후에 갱신될 UI의 대해서 DOM을 탐색하여 처리할려고 하면 해당 DOM을 못찾아서 콘솔화면에 빨간색의 글자로 오류들을 내뿜게 됩니다. |
| 15 | +이는 `vue._data`에 값들을 대입하게 되면 `Vue.js`에서 데이터갱신을 감지하고 UI를 갱신하게 되는데, 모든 데이터처리가 비동기로 처리되는 JavaScript의 특성때문에 UI가 갱신도 되기전에 DOM들을 탐색하는 상황이 나오게 됩니다. |
| 16 | + |
| 17 | + |
| 18 | +```html |
| 19 | +<!-- 오류 예제 --> |
| 20 | +<div id="app"> |
| 21 | + <div v-for="item in list"> |
| 22 | + <div v-bind:id="bindId(item)">{{item}}</div> <!-- 2 --> |
| 23 | + </div> |
| 24 | +</div> |
| 25 | + |
| 26 | +<script> |
| 27 | +new Vue({ |
| 28 | + el: '#app', |
| 29 | + data: function() { |
| 30 | + return { |
| 31 | + list: [] |
| 32 | + }; |
| 33 | + }, |
| 34 | + created: function() { |
| 35 | + var self = this; |
| 36 | +
|
| 37 | + for(var i=0; i<100; i++) { |
| 38 | + this._data.list.push(i); // 1 |
| 39 | + } |
| 40 | +
|
| 41 | + var dom = document.getElementById('item-0'); // 4 |
| 42 | + dom.style.backgroundColor = 'red'; // 5 |
| 43 | + }, |
| 44 | + methods: { |
| 45 | + bindId: function(item) { |
| 46 | + return 'item-' + item; // 3 |
| 47 | + } |
| 48 | + } |
| 49 | +}) |
| 50 | +</script> |
| 51 | +``` |
| 52 | +위와 같은 상황으로 작성하게 되면 오류가 나게 됩니다. |
| 53 | +간단하게 설명을 드리면 `1`에서 list에 데이터들을 넣게 됩니다. Vue.js는 이를 감지하여 `2`, `3`을 통해 UI들을 갱신하게 되는데, UI를 갱신하기전에 `1`의 다음 라인인 `4`,`5`를 수행하게 됩니다. 아직 그리지도 않은 UI를 호출하려하니 당연히 오류가 나겠죠? Vue.js에서는 이런 일이 일어날 것을 예측하고, callback함수를 제공하고 있습니다. |
| 54 | + |
| 55 | +```js |
| 56 | +created: function() { |
| 57 | + |
| 58 | + // ... |
| 59 | + |
| 60 | + this.$nextTick(function() { |
| 61 | + var dom = document.getElementById('item-0'); |
| 62 | + dom.style.backgroundColor = 'red'; |
| 63 | + }); |
| 64 | +} |
| 65 | +``` |
| 66 | + |
| 67 | +`nextTick`으로 감싼뒤 callback을 통해 DOM을 조작하게 되면 `Vue.js`에서 데이터갱신 후 UI까지 완료한 뒤에 `nextTick`에 있는 함수를 최종적으로 수행하게 됩니다. |
| 68 | + |
| 69 | +`nextTick`이 자주사용되기는 하는데 예제를 만들기가 애매한 부분이 있는 것 같습니다. 최대한 간단하게 설명하려다보니 위 코드대로 알려드리게 되었습니다. 더 좋은 의견이 있거나 좋은 예제가 있으면 언제든지 말씀해주시면 감사하겠습니다. |
| 70 | + |
| 71 | +### 관련자료 |
| 72 | +- [Vue.nextTick 공식API문서](https://kr.vuejs.org/v2/api/#Vue-nextTick) |
| 73 | +- [Vue.js 한국어 사용자 모임](https://vuejs-kr.github.io/) |
| 74 | +- [jsfiddle 예제](https://jsfiddle.net/devjin0617/pgscu4q3/) |
0 commit comments