您正在执行一个长的同步过程。这些类型的进程会占用UI线程,也就是说,在此期间,您无法在选项卡内执行任何操作,也无法更新DOM。
要像你现在这样做很长的过程,你应该把它放在一个
Web Worker
。然后,使用消息api,您将向工作人员发送一条消息,告诉其创建列表,完成后,工作人员将返回一条消息。这将使您的流程异步,而不会占用UI。
旁注:您可能需要考虑使用分页来显示如此大的列表。因为隐藏/显示这么多元素也会导致浏览器锁定。
html
<input type="checkbox" value="1" v-model="even" @change="onEvenChanged" /> even?
工人js
importScripts("lodash.js");
self.addEventListener('message', function(e) {
var data = e.data;
if(data.command == "start"){
let list = data.even ? _.range(0,100000,2) : _.range(0,100000);
self.postMessage({"list":list});
}
}, false);
应用程序。js
var app,msgBus;
var worker = new Worker('worker.js');
//listen for messages coming back from the worker
worker.addEventListener('message', function(e) {
var data = e.data;
if(data.list){
//emit a message to your vue app that the list
//was made
msgBus.$emit('listGenerated',data.list);
}
}, false);
//separate empty vue for events
msgBus = new Vue();
app = new Vue({
el: '#app',
mounted:function(){
//Listen for a listGenerated event
//set numbers to the passed list
msgBus.$on("listGenerated",(list)=>{
this.numbers = list;
this.loading = false;
});
},
methods:{
onEvenChanged:function(){
this.loading = true;
//send the start command to the worker
//passing also the even property
this.$nextTick(()=>{
worker.postMessage({command:"start",even:this.even});
});
}
}
});
Demo on plunker