Rumah > Soal Jawab > teks badan
Saya cuba menulis semula komponen untuk vue 3, lebih khusus menggunakan skrip persediaan baharu mereka supaya kod itu kelihatan lebih bersih, inilah rupanya pada masa ini.
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); } }, }, };
Ini ialah kod vue 3 baharu menggunakan
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); } }
Masalah yang saya hadapi ialah kod vue 2 menggunakan perubahan ini dalam typeValue
中的值正确更新 div,新的 vue 3 代码不会更新div,我添加了一个 console.log,可以看到代码确实正在触发并工作,div 只是没有识别 typeValue
dan saya langsung tidak tahu mengapa ini berlaku.
Saya masih baru menggunakan vue 3, jadi mungkin saya kehilangan sesuatu, tetapi ini kelihatan betul kepada saya, jadi saya tidak faham mengapa div tidak mengemas kini seperti dahulu.
P粉6148403632024-01-11 16:33:07
Cuba gunakan ref
untuk menjadikan data anda reaktif 一个>:
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>