setup
函数 vs Vue 2 的 created
和 data
Vue 3 引入了 setup
函数,作为 Composition API 的核心部分,它彻底改变了 Vue 组件的逻辑组织和代码复用方式。与 Vue 2 的 data
和 created
等选项相比,setup
函数提供了更灵活、更强大的能力,尤其是在逻辑组织、代码复用和类型推断方面。
data
和 created
data
:用于定义组件的响应式数据,返回一个对象。
created
:生命周期钩子,用于在组件实例创建后执行初始化逻辑。
问题:
逻辑分散在不同的选项中(如 data
、methods
、created
等),导致相关逻辑难以集中管理。
大型组件中,代码可读性和维护性较差。
setup
setup
:在组件创建之前执行,是组合逻辑的入口。
特点:
所有逻辑(状态、方法、生命周期等)都可以集中在 setup
函数中。
通过 ref
和 reactive
定义响应式数据,逻辑更加集中和清晰。
支持逻辑拆分和复用(通过自定义函数或 Composables)。
代码实例比较:
// Vue 2
export default {
data() {
return {
count: 0,
};
},
created() {
console.log('Component created');
},
methods: {
increment() {
this.count++;
},
},
};
// Vue 3
import { ref, onMounted } from 'vue';
export default {
setup() {
const count = ref(0);
const increment = () => {
count.value++;
};
onMounted(() => {
console.log('Component created');
});
return {
count,
increment,
};
},
};
优势:
逻辑集中,相关代码更易于理解和维护。
生命周期钩子可以直接在 setup
中使用,逻辑更直观。
代码复用主要通过 mixins
或高阶组件实现。
问题:
mixins
容易导致命名冲突和逻辑不清晰。
高阶组件增加了组件层级,降低了可读性。
Composables:通过自定义函数封装逻辑,实现高度复用。
特点:
逻辑可以按功能拆分,避免命名冲突。
复用逻辑更加灵活和直观。
代码实例比较:
// Vue 3: 使用 Composables 复用逻辑
import { ref, onMounted } from 'vue';
// 封装一个计数器逻辑
function useCounter() {
const count = ref(0);
const increment = () => {
count.value++;
};
onMounted(() => {
console.log('Counter logic mounted');
});
return {
count,
increment,
};
}
export default {
setup() {
const { count, increment } = useCounter();
return {
count,
increment,
};
},
};
优势:
逻辑复用更加灵活,避免 mixins
的缺点。
代码按功能模块化,易于测试和维护。
Vue 2 对 TypeScript 的支持较弱,类型推断能力有限。
data
、methods
等选项的类型声明需要额外的工作。
更好的 TypeScript 集成:setup
函数和 Composition API 天然支持 TypeScript。
类型推断:
ref
和 reactive
自动推断类型。
自定义 Composables 也可以轻松实现类型安全。
代码实例:
// Vue 3: 使用 TypeScript
import { ref } from 'vue';
interface User {
name: string;
age: number;
}
export default {
setup() {
const user = ref({
name: 'Alice',
age: 25,
});
const updateUser = (newName: string) => {
user.value.name = newName;
};
return {
user,
updateUser,
};
},
};
优势:
类型推断更加智能,减少手动类型声明的成本。
更好的开发体验和代码健壮性。
从 Vue 2 迁移到 Vue 3 时,可以逐步采用 setup
函数和 Composition API,以下是一些建议:
渐进式迁移:
在新组件中使用 setup
函数。
逐步将旧组件重构为使用 Composition API。
逻辑复用:
将 mixins
替换为 Composables。
类型支持:
为现有组件添加 TypeScript 支持,利用 ref
和 reactive
的类型推断能力。
工具支持:
使用 @vue/composition-api
插件在 Vue 2 中提前体验 Composition API。
代码实例比较:
// Vue 2 组件
export default {
data() {
return {
count: 0,
};
},
created() {
console.log('Component created');
},
methods: {
increment() {
this.count++;
},
},
};
// 迁移到 Vue 3
import { ref, onMounted } from 'vue';
export default {
setup() {
const count = ref(0);
const increment = () => {
count.value++;
};
onMounted(() => {
console.log('Component created');
});
return {
count,
increment,
};
},
};
Vue 3 的 setup
函数和 Composition API 在逻辑组织、代码复用和类型推断方面具有显著优势:
逻辑组织:集中管理相关逻辑,提升代码可读性。
代码复用:通过 Composables 实现高度复用,避免 mixins
的缺点。
类型推断:天然支持 TypeScript,提供更好的开发体验。
迁移到 Vue 3 时,建议逐步采用 Composition API,并结合 TypeScript 提升代码质量。