Maison > Questions et réponses > le corps du texte
J'essaie de réécrire un composant pour vue 3, plus précisément en utilisant leur nouveau script de configuration pour que le code paraisse plus propre, voici à quoi il ressemble actuellement.
export default { name: "typeWriter", data: () => { return { typeValue: "", typeStatus: false, displayTextArray: ['Art', 'Science', 'Math', 'Everything'], typingSpeed: 70, erasingSpeed: 70, newTextDelay: 1000, displayTextArrayIndex: 0, charIndex: 0, }; }, created() { setTimeout(this.typeText, this.newTextDelay + 200); }, methods: { typeText() { if (this.charIndex < this.displayTextArray[this.displayTextArrayIndex].length) { if (!this.typeStatus) { this.typeStatus = true; } this.typeValue += this.displayTextArray[this.displayTextArrayIndex].charAt(this.charIndex); this.charIndex++; setTimeout(this.typeText, this.typingSpeed); } else { this.typeStatus = false; // stop the typing once we hit the last thing we wish to type. if (this.displayTextArrayIndex + 1 >= this.displayTextArray.length) { return } setTimeout(this.eraseText, this.newTextDelay); } }, eraseText() { if (this.charIndex > 0) { if (!this.typeStatus) { this.typeStatus = true; } this.typeValue = this.displayTextArray[this.displayTextArrayIndex].substring(0, this.charIndex - 1); this.charIndex -= 1; setTimeout(this.eraseText, this.erasingSpeed); } else { this.typeStatus = false; this.displayTextArrayIndex++; setTimeout(this.typeText, this.typingSpeed + 1000); } }, }, };
Voici le nouveau code vue 3 utilisant
let typeValue = "" let typeStatus = false let displayTextArray = ['Art', 'Science', 'Math', 'Everything'] let typingSpeed = 70 let erasingSpeed = 70 let newTextDelay = 1000 let displayTextArrayIndex = 0 let charIndex = 0 setTimeout(typeText, newTextDelay); function typeText() { if (charIndex < displayTextArray[displayTextArrayIndex].length) { if (!typeStatus) { typeStatus = true; } typeValue += displayTextArray[displayTextArrayIndex].charAt(charIndex); charIndex++; setTimeout(typeText, typingSpeed); } else { typeStatus = false; // stop the typing once we hit the last thing we wish to type. if (displayTextArrayIndex + 1 >= displayTextArray.length) { return } setTimeout(eraseText, newTextDelay); } } function eraseText() { if (charIndex > 0) { if (!typeStatus) { typeStatus = true; } typeValue = displayTextArray[displayTextArrayIndex].substring(0, charIndex - 1); charIndex -= 1; setTimeout(eraseText, erasingSpeed); } else { typeStatus = false; displayTextArrayIndex++; setTimeout(typeText, typingSpeed + 1000); } }
Le problème que j'ai est que le code vue 2 utilise ce changement dans typeValue
中的值正确更新 div,新的 vue 3 代码不会更新div,我添加了一个 console.log,可以看到代码确实正在触发并工作,div 只是没有识别 typeValue
et je n'ai absolument aucune idée de pourquoi cela se produit.
Je suis encore nouveau sur la vue 3, alors peut-être qu'il me manque quelque chose, mais cela me semble correct, donc je ne comprends pas pourquoi le div ne se met pas à jour comme avant.
P粉6148403632024-01-11 16:33:07
Essayez d'utiliser ref
pour rendre vos données réactives 一个> :
const { ref } = Vue const app = Vue.createApp({ setup() { let typeValue = ref("") let typeStatus = false let displayTextArray = ['Art', 'Science', 'Math', 'Everything'] let typingSpeed = 70 let erasingSpeed = 70 let newTextDelay = 1000 let displayTextArrayIndex = ref(0) let charIndex = 0 setTimeout(typeText, newTextDelay); function typeText() { if (charIndex < displayTextArray[displayTextArrayIndex.value].length) { if (!typeStatus) { typeStatus = true; } typeValue.value += displayTextArray[displayTextArrayIndex.value].charAt(charIndex); charIndex++; setTimeout(typeText, typingSpeed); } else { typeStatus = false; if (displayTextArrayIndex.value + 1 >= displayTextArray.length) { return } setTimeout(eraseText, newTextDelay); } } function eraseText() { if (charIndex > 0) { if (!typeStatus) { typeStatus = true; } typeValue.value = displayTextArray[displayTextArrayIndex.value].substring(0, charIndex - 1); charIndex -= 1; setTimeout(eraseText, erasingSpeed); } else { typeStatus = false; displayTextArrayIndex.value++; setTimeout(typeText, typingSpeed + 1000); } } return { typeValue, eraseText, typeText }; }, }) app.mount('#demo')
<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script> <div id="demo"> <input type="text" :value="typeValue" /> </div>