Vue.js에서 "this.〇〇 is undefined"라고 표시된 이야기

경위



safari에서 웹 개발을 할 때 콘솔에 this.func() is undefined 라고 표시되어 있어 뭐야 이것은? 되었을 때의 이야기입니다.

「methods내에 func()는 제대로 정의하고 있고···.」라고, vue 초보자의 나는 무엇이 되지 않는지 모르고, 조사해 보았습니다.



간단한 예를 준비했습니다. html과 js는 다음과 같습니다.

test.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
    <div id="app">
        <button @click="counter">クリック!</button>
        {{ num }}
    </div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script src="test.js"></script>
</body>
</html>

test.js
var app = new Vue({
    el: '#app',
    data:{
        num: 0
    },
    methods:{
        counter: function(){
            setInterval(function() {
                this.num += 1
            },1000)
        }
    }
})


HTML을 표시하면 이런 느낌이 듭니다.

버튼을 클릭하면 버튼 옆의 "0"이 초당 1, 2, 3 ...로 증가합니다 (실제로 오류가 발생합니다)

뭐가 안돼?



counter 함수의 "this"때문입니다.

이 this는 vue 인스턴스의 this가 아니라 setInterval의 this(window?)를 가리킵니다.

대책



setInterval() 을 호출하기 전에 var th = this; 라고 써 봅시다.

변경 후 js 파일은 다음과 같습니다.

test.js
var app = new Vue({
    el: '#app',
    data:{
        num: 0
    },
    methods:{
        counter: function(){
            var th = this;
            setInterval(function() {
                th.num += 1
            },1000)
        }
    }
})

이렇게 하면 th는 vu 인스턴스의 this를 저장하게 되므로 num이 1씩 더해집니다.

좋은 웹페이지 즐겨찾기