面试题答案
一键面试1. 代码可维护性
- 逻辑分离与集中:
- Options API:在Options API中,数据、方法、生命周期钩子等都混合在一个对象中。例如,当处理一个复杂组件时,数据定义在
data
中,方法定义在methods
中,生命周期钩子函数如created
、mounted
等也各自独立定义。这导致相关逻辑可能分散在不同位置,维护时难以快速定位和理解。比如在一个电商商品详情组件中,商品数据获取逻辑在created
钩子中,而处理商品图片展示逻辑在methods
中,修改商品数据又在data
相关的计算属性或watch
中,维护时需要在不同区域切换查看。 - Composition API:Composition API允许将组件逻辑按照功能进行拆分,使用
setup
函数将相关逻辑封装在一起。比如同样是电商商品详情组件,可以将商品数据获取逻辑封装在一个自定义的useProduct
函数中,图片展示逻辑封装在useImage
函数中。这些函数返回的数据和方法可以在setup
函数中统一使用,使得代码结构更清晰,维护时更易理解和修改。
- Options API:在Options API中,数据、方法、生命周期钩子等都混合在一个对象中。例如,当处理一个复杂组件时,数据定义在
- 更好的代码阅读:
- Options API:随着组件功能增多,
data
、methods
、computed
等属性会不断膨胀,阅读代码时需要在不同属性块之间切换,增加理解成本。例如一个包含用户信息展示、用户权限控制、用户操作日志记录等多个功能的组件,在Options API下,这些功能相关代码会分散在不同属性中,阅读时难以快速把握整体逻辑。 - Composition API:通过组合函数将功能模块化,代码按功能块组织。如在上述用户相关组件中,可以分别创建
useUserInfo
、useUserPermission
、useUserLog
等组合函数,每个函数专注于一个功能,在setup
函数中导入使用,使代码更具可读性,能快速了解组件各个功能部分。
- Options API:随着组件功能增多,
2. 复用性
- 逻辑复用更便捷:
- Options API:复用逻辑通常通过
mixins
实现,但mixins
存在命名冲突和数据来源不清晰的问题。例如,多个mixins
可能定义相同名称的属性或方法,导致冲突。而且在组件中使用mixins
时,很难直观地看出数据和方法具体来自哪个mixins
。如在一个表单组件和一个列表组件中都使用了一个包含数据验证逻辑的mixin
,当出现问题时,很难快速定位数据验证逻辑在不同组件中的具体情况。 - Composition API:通过组合函数实现逻辑复用,组合函数返回的是独立的响应式数据和方法,不存在命名冲突问题。并且可以按需导入使用,数据来源清晰。例如,可以创建一个通用的
useFormValidation
组合函数,在表单组件中导入使用,只需要关注组合函数返回的验证方法和数据,无需担心命名冲突等问题,复用性更高。
- Options API:复用逻辑通常通过
- 更灵活的复用方式:
- Options API:
mixins
是一种较为“侵入式”的复用方式,一旦混入,所有混入的属性和方法都会添加到组件中,难以灵活控制。比如一个复杂组件只需要mixin
中的部分功能,但由于mixin
的整体性,不得不引入全部内容。 - Composition API:组合函数可以根据组件需求灵活调用和组合。例如,一个组件可能只需要
useUser
组合函数中的用户权限判断部分,而不需要用户信息获取部分,就可以在setup
函数中只调用相关部分,实现更细粒度的复用。
- Options API:
3. 逻辑组织
- 响应式数据与逻辑的结合:
- Options API:响应式数据定义在
data
中,逻辑处理在methods
、computed
等其他地方,两者分离。例如在一个计数器组件中,data
定义count
变量,methods
中定义increment
和decrement
方法来修改count
,逻辑和数据分离,不够直观。 - Composition API:在
setup
函数中,可以使用ref
或reactive
直接定义响应式数据,并在同一作用域内定义相关逻辑。如在计数器组件中,可以使用const count = ref(0)
定义响应式数据count
,然后在同一setup
函数内定义const increment = () => count.value++
和const decrement = () => count.value--
,数据和逻辑紧密结合,更符合逻辑组织习惯。
- Options API:响应式数据定义在
- 基于函数的组织方式:
- Options API:基于对象属性的组织方式,在逻辑复杂时不够灵活。例如在处理复杂业务逻辑时,很难将部分逻辑封装成独立的可复用模块,因为
data
、methods
等属性定义有固定格式。 - Composition API:以函数为基础组织逻辑,可以根据业务需求自由封装和组合。例如在处理一个涉及多个步骤的业务流程时,可以将每个步骤封装成一个函数,然后在
setup
函数中按顺序调用,使逻辑组织更灵活、更符合业务逻辑流程。
- Options API:基于对象属性的组织方式,在逻辑复杂时不够灵活。例如在处理复杂业务逻辑时,很难将部分逻辑封装成独立的可复用模块,因为
示例代码
Options API示例:
<template>
<div>
<p>商品名称: {{ product.name }}</p>
<p>商品价格: {{ product.price }}</p>
<button @click="fetchProduct">重新获取商品</button>
</div>
</template>
<script>
export default {
data() {
return {
product: {}
};
},
methods: {
async fetchProduct() {
const response = await fetch('/api/product');
this.product = await response.json();
}
},
created() {
this.fetchProduct();
}
};
</script>
Composition API示例:
<template>
<div>
<p>商品名称: {{ product.name }}</p>
<p>商品价格: {{ product.price }}</p>
<button @click="fetchProduct">重新获取商品</button>
</div>
</template>
<script>
import { ref } from 'vue';
const useProduct = () => {
const product = ref({});
const fetchProduct = async () => {
const response = await fetch('/api/product');
product.value = await response.json();
};
fetchProduct();
return {
product,
fetchProduct
};
};
export default {
setup() {
const { product, fetchProduct } = useProduct();
return {
product,
fetchProduct
};
}
};
</script>
从上述示例可以看出,Composition API通过组合函数将商品数据获取逻辑和数据本身封装在一起,代码结构更清晰,可维护性和复用性更好。