Vue 3.x 全面升级,引入了 Composition API,相对于 Vue 2.x 传统的 Options API 来说是一个重大改进。它提供了一种更灵活、更模块化的代码组织方式。
Vue 3中的核心入口点,用于设置组件的状态和逻辑,在beforeCreate钩子之后、create钩子之前执行。它替换了原来在数据、方法等选项中定义的内容。
import { ref, computed } from "vue"; export default { setup() { // Responsive Data const count = ref(0); // Computed properties const doubleCount = computed(() => count.value * 2); // 方法 function increment() { count.value++; } // Returns the data and methods needed to be used in the template return { count, doubleCount, increment, }; }, };
用于创建响应式数据,ref用于创建基本类型的响应式数据,reactive用于对象和数组的响应式代理。
import { ref, reactive } from "vue"; export default { setup() { // Creating Responsive Primitives Using ref const count = ref(0); // Creating responsive objects using reactive const user = reactive({ name: "Alice", age: 30, }); // Modifying Responsive Data count.value++; user.age++; return { count, user }; }, };
compated 用于创建计算属性,仅当依赖项更改时才重新计算。
import { ref, computed } from "vue"; export default { setup() { const firstName = ref("John"); const lastName = ref("Doe"); // Calculate full name const fullName = computed(() => `${firstName.value} ${lastName.value}`); return { firstName, lastName, fullName }; }, };
watch 用于观察响应数据的变化,并在发生变化时执行回调。
import { ref, watch } from "vue"; export default { setup() { const count = ref(0); // Observe the change of count watch(count, (newVal, oldVal) => { console.log(`count changed from ${oldVal} to ${newVal}`); }); function increment() { count.value++; } return { count, increment }; }, };
Composition API 鼓励创建可重用的组合函数。
// useCounter.js export function useCounter(initialValue = 0) { const count = ref(initialValue); function increment() { count.value++; } return { count, increment }; } // Use in components import { useCounter } from "./useCounter"; export default { setup() { const { count, increment } = useCounter(10); return { count, increment }; }, };
Vue 3 中的生命周期钩子不再直接在 setup() 内部使用,而是通过新的生命周期钩子函数,例如 onBeforeMount 和 onMounted。
1。 onBeforeMount:该钩子在组件挂载到 DOM 之前调用。这类似于 Vue 2.x 中的 beforeMount 生命周期钩子。
import { onBeforeMount } from "vue"; export default { setup() { onBeforeMount(() => { console.log("Component is about to be mounted"); }); }, };
2。 onMounted:组件挂载到 DOM 后立即调用。相当于Vue 2.x中挂载。
import { onMounted } from "vue"; export default { setup() { onMounted(() => { console.log("Component mounted"); }); }, };
3。 onBeforeUpdate:在组件数据更新之前、DOM 更新开始之前调用。类似于 Vue 2.x 的 beforeUpdate。
import { onBeforeUpdate } from "vue"; export default { setup() { let previousData; onBeforeUpdate(() => { console.log("Before data update:", previousData); }); return { data }; }, };
4。 onUpdated:组件数据变化引起的DOM更新完成后调用。相当于Vue 2.x中更新。
import { onUpdated } from "vue"; export default { setup() { onUpdated(() => { console.log("Component update completed"); }); }, };
5。 onBeforeUnmount:在组件卸载之前调用。类似于 Vue 2.x 中的 beforeDestroy。
import { ref, computed } from "vue"; export default { setup() { // Responsive Data const count = ref(0); // Computed properties const doubleCount = computed(() => count.value * 2); // 方法 function increment() { count.value++; } // Returns the data and methods needed to be used in the template return { count, doubleCount, increment, }; }, };
6。 onUnmounted:组件卸载后调用。相当于Vue 2.x中的destroyed。
import { ref, reactive } from "vue"; export default { setup() { // Creating Responsive Primitives Using ref const count = ref(0); // Creating responsive objects using reactive const user = reactive({ name: "Alice", age: 30, }); // Modifying Responsive Data count.value++; user.age++; return { count, user }; }, };
7。 onActivated:仅当组件用
import { ref, computed } from "vue"; export default { setup() { const firstName = ref("John"); const lastName = ref("Doe"); // Calculate full name const fullName = computed(() => `${firstName.value} ${lastName.value}`); return { firstName, lastName, fullName }; }, };
8。 onDeactivated:仅当组件用
import { ref, watch } from "vue"; export default { setup() { const count = ref(0); // Observe the change of count watch(count, (newVal, oldVal) => { console.log(`count changed from ${oldVal} to ${newVal}`); }); function increment() { count.value++; } return { count, increment }; }, };
// useCounter.js export function useCounter(initialValue = 0) { const count = ref(initialValue); function increment() { count.value++; } return { count, increment }; } // Use in components import { useCounter } from "./useCounter"; export default { setup() { const { count, increment } = useCounter(10); return { count, increment }; }, };
创建响应式数据:使用响应式创建包含 cityInput、城市和天气的响应式对象。 ref 也可以用于基本类型的响应式数据,但在这种场景下,reactive 更适合管理多个状态。
计算属性:currentCity 计算属性直接返回 state.cityInput 的值。虽然在本例中直接使用 v-model="cityInput" 可能更直观,但它展示了如何定义计算属性。
响应式函数:使用toRefs将状态对象的属性转换为独立的响应式引用,以便在模板中直接绑定。这主要展示了响应式数据的使用,而不是转换函数本身,因为在模板中直接解构赋值(如 const { cityInput } = state;)就足够了。
监听器:使用watch监听cityInput的变化,并在每次input变化时清除天气状态,以便下次查询。
将状态、方法和逻辑分离到单独的函数中。在Options API中,我们通常会在组件选项中定义数据、方法、计算等。在 Composition API 中,这些逻辑被分成单独的函数。例如:
选项 API:
import { onBeforeMount } from "vue"; export default { setup() { onBeforeMount(() => { console.log("Component is about to be mounted"); }); }, };
合成 API:
import { onMounted } from "vue"; export default { setup() { onMounted(() => { console.log("Component mounted"); }); }, };
使用提供和注入。在Options API中,我们使用provide和inject来传递数据。在 Composition API 中,此过程保持不变:
选项 API:
import { onBeforeUpdate } from "vue"; export default { setup() { let previousData; onBeforeUpdate(() => { console.log("Before data update:", previousData); }); return { data }; }, };
合成 API:
import { onUpdated } from "vue"; export default { setup() { onUpdated(() => { console.log("Component update completed"); }); }, };
将绑定的属性和方法从此转换为直接引用。
以上是Vue全面升级指南:Composition API深度探索的详细内容。更多信息请关注PHP中文网其他相关文章!