2017-06-27 15 views
0

関数がvueインスタンスの外側で使用され、マウントされたメソッドの内部で渡されると、なぜ 'vm'への参照が失われますか?'vm'オブジェクトがVueインスタンス外にあり、内部メソッド呼び出しが呼び出されましたundefined

https://jsfiddle.net/z9u39hgu/5/

var vm = new Vue({ 
 
    el: '#app-4', 
 
    data: { 
 
     isLoading: true 
 
    }, 
 
    mounted: function() { 
 
     hello(); 
 
    } 
 
}); 
 

 

 
function hello() { 
 
    console.log(JSON.stringify(vm)); 
 
    //vm.isLoading = true; 
 
    setTimeout(function() { 
 
     console.log(JSON.stringify(vm, replacer)); 
 
     //vm.isLoading = false; 
 
    }) 
 
} 
 

 
//Extra code ignore 
 
seen = []; 
 

 
var replacer = function(key, value) { 
 

 
if (value != null && typeof value == "object") { 
 
    if (seen.indexOf(value) >= 0) { 
 
     return; 
 
    } 
 
    seen.push(value); 
 
} 
 
return value; 
 

 
};
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js"></script> 
 
<div id="app-4"> 
 
    <p v-if="isLoading">Vuejs loading...</p> 
 
</div>

答えて

2

mounted()vm変数にも割り当てることができ、すなわち前に、Vueのコンストラクタから発射されているようです。したがってvm参照は失われませんが、hello()が呼び出されるとまだ定義されていません。

Vueコンストラクタが既に返され、vm変数が割り当てられているときに、timeout()コールバックが後で呼び出されます。これらのイベントの年表もコンソールに表示されます。説明する

var vm = new Vue({ 
 
    el: '#app-4', 
 
    data: { 
 
     isLoading: true 
 
    }, 
 
    mounted: function() { 
 
     hello(); 
 
    } 
 
}); 
 

 

 
function hello() { 
 
    console.log("before timeout: " + typeof(vm)); 
 
    //vm.isLoading = true; 
 
    setTimeout(function() { 
 
     console.log("after timeout: " + typeof(vm)); 
 
     //vm.isLoading = false; 
 
    }) 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js"></script> 
 
<div id="app-4"> 
 
    <p v-if="isLoading">Vuejs loading...</p> 
 
</div>

+0

感謝。では、このコードを書くのに最高のVueの方法は何ですか?私はsetTimeoutを使う考えが嫌いです。 2回目の試行では、私はhello関数のパラメータとして 'this'を渡していましたが、エラーがありました。それをより良い方法で処理してはいけませんか? – guilima

+0

おそらく 'hello()'関数をVueインスタンス内のメソッドにすることができます。次に 'vm'を割り当てる必要はなく、単に' this'を参照することもできます... https://v1.js.org/guide/events.html – emanek

+0

ええ、私はそれをするか、 Vueインスタンスいずれにせよ、それは動作します。おそらく、私は自分の心を変えてそのようにする必要があります。 – guilima

関連する問題