vue3学习之响应式状态
响应式状态
src/views/basic/Reactive.vue
<script setup> import { ref, reactive, computed, watch, watchEffect } from "vue"; //reactive 响应式对象 只能用于对象、数组和集合类型 const author = reactive({ name: "John Doe", books: ["Vue 2 - Advanced Guide", "Vue 3 - Basic Guide", "Vue 4 - The Mystery"], }); //计算属性 值会基于其响应式依赖被缓存。计算属性仅会在其响应式依赖更新时才重新计算。 const publishedBooksMessage = computed(() => { return author.books.length > 0 ? "Yes" : "No"; }); // 声明响应式状态 const firstName = ref("John"); const lastName = ref("Doe"); const fullName = computed({ get() { return firstName.value + " " + lastName.value; }, set(newValue) { [firstName.value, lastName.value] = newValue.split(" "); // 解构赋值语法 }, }); const fullname_text = ref(null); const fullname_num_text = ref(null); const num = ref(5); // 侦听器 使用 watch 函数在每次响应式状态发生变化时触发回调函数 // 可以直接侦听一个 ref watch(num, (newnum, oldnum) => { if (newnum > 30) { num.value = 0; } }); // getter 函数 watch( () => firstName.value + " " + lastName.value, (full_name) => { fullname_text.value.textContent = `Full name is: ${full_name}`; } ); // 多个来源组成的数组 watch([num, () => firstName.value + " " + lastName.value], ([newnum, full_name]) => { fullname_num_text.value.textContent = `Full name is: ${full_name},num is:${newnum}`; }); const todoId = ref(1); const todoData = ref(null); // watchEffect 自动跟踪回调的响应式依赖。 watchEffect(async () => { const response = await fetch(`https://jsonplaceholder.typicode.com/todos/${todoId.value}`); todoData.value = await response.json(); }); </script> <template> <div> <!-- 计算属性 --> <div> <p> Has published books:<span>{{ publishedBooksMessage }}</span> </p> </div> <div> <p>num: <input v-model.number="num" /></p> <p>名:<input v-model.trim="firstName" />姓:<input v-model.trim="lastName" /></p> <p>姓名:<input v-model.trim="fullName" /></p> <p ref="fullname_text">Full name is: {{ fullName }}</p> <p ref="fullname_num_text">Full name is: {{ fullName }} , num is: {{ num }}</p> </div> <!-- 侦听器 --> <div> <p>Todo id: {{ todoId }}</p> <button @click="todoId++">Fetch next todo</button> <p v-if="!todoData">Loading...</p> <pre v-else>{{ todoData }}</pre> </div> </div> </template> <style scoped> </style>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix