vue.js 如何立即呈现数组中生成的每个元素

8hhllhi2  于 2023-10-23  发布在  Vue.js
关注(0)|答案(1)|浏览(124)

我生成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>
ryhaxcpt

ryhaxcpt1#

...我需要呈现每个元素时,它的准备,而不是当所有的元素都准备好了...
如果你像上面一样在主UI线程上同步生成单词,你就不能这样做。但是请注意,以上述方式生成10,000个单词需要现代JavaScript引擎非常少的时间。例如,这在我的机器上花费不到40 ms:

function generateWords() {
    let words = [];
    const count = 10000;
    let symbols = "abcdefghijklmnopqrstuvwxyz1234567890";
    let word = "";
    for (let i = 0; count > i; i++) {
        while (word.length < 100) {
            word += symbols[Math.floor(Math.random() * symbols.length)];
        }
        words.push(word);
        word = "";
    }
    return words;
}

console.time("x");
const w = generateWords();
console.timeEnd("x");
console.log(w.length);

生成单词的时间不会主导你的过程,它将是呈现单词的时间。正如Estus Flask所说,你可能想要某种虚拟卷轴或类似的东西,但这取决于你的用例。
但是回答这个问题,如果你像这样在主线程上同步生成单词,你不能做更新的原因是更新UI的线程和运行JavaScript代码的线程是同一个线程,当你的循环运行时,其他任何东西都不能运行。您可以将生成移动到worker thread,并在生成每个单词(或小批量单词)时将其post到Vue代码中。在主UI线程上运行的Vue代码可以自由地呈现那个单词/那些单词,即使工作线程仍然在生成其他单词。
下面是一个基于现有循环的worker脚本的粗略示例:

self.addEventListener("message", (e) => {
    if (e.data?.type === "start") {
        generateWords();
    }
});

function generateWords() {
    const count = 10000;
    let symbols = "abcdefghijklmnopqrstuvwxyz1234567890";
    let word = "";
    for (let i = 0; count > i; i++) {
        while (word.length < 100) {
            word += symbols[Math.floor(Math.random() * symbols.length)];
        }
        self.postMessage({ type: "word", word });
        word = "";
    }
}

然后代码开始的过程,并听取结果:

const worker = new Worker("./worker.js");
worker.addEventListener("message", (e) => {
    if (e.data?.type === "word") {
        // ...use `e.data.word` here, it's the word that was received...
    }
});
worker.postMessage({ type: "start" });

你必须调整它以适应你的Vue代码,但这是基本的方法。
但是,单词的产生可能不是问题所在。

相关问题