我生成10000个字符串。我把它添加到数组中,并在html中呈现它。问题是我需要在每个元素准备好的时候呈现它,而不是在所有元素都准备好的时候。如何使用vue2
<div id="app">
<button @click="generateWords()">Generate words</button>
<input v-model="search" type="text" />
<ul>
<li v-for="word in words" :key="word.id">
{{ word }}
</li>
</ul>
</div>
<script>
export default {
name: 'App',
data() {
return {
words: [],
count:10000,
};
},
methods: {
generateWords() {
let symbols = 'abcdefghijklmnopqrstuvwxyz1234567890';
let word = '';
for (let i = 0; count> i; i++) {
while (word.length < 100) {
word += symbols[Math.floor(Math.random() * symbols.length)];
}
this.words.push(word);
word = '';
}
},
},
};
</script>
1条答案
按热度按时间ryhaxcpt1#
...我需要呈现每个元素时,它的准备,而不是当所有的元素都准备好了...
如果你像上面一样在主UI线程上同步生成单词,你就不能这样做。但是请注意,以上述方式生成10,000个单词需要现代JavaScript引擎非常少的时间。例如,这在我的机器上花费不到40 ms:
生成单词的时间不会主导你的过程,它将是呈现单词的时间。正如Estus Flask所说,你可能想要某种虚拟卷轴或类似的东西,但这取决于你的用例。
但是回答这个问题,如果你像这样在主线程上同步生成单词,你不能做更新的原因是更新UI的线程和运行JavaScript代码的线程是同一个线程,当你的循环运行时,其他任何东西都不能运行。您可以将生成移动到worker thread,并在生成每个单词(或小批量单词)时将其post到Vue代码中。在主UI线程上运行的Vue代码可以自由地呈现那个单词/那些单词,即使工作线程仍然在生成其他单词。
下面是一个基于现有循环的worker脚本的粗略示例:
然后代码开始的过程,并听取结果:
你必须调整它以适应你的Vue代码,但这是基本的方法。
但是,单词的产生可能不是问题所在。