在 Vue 中,当组件同时使用 mixin 和 extends 时,它们各自的合并策略是怎样的?请说明覆盖逻辑。
考察说明
考查对 Vue 选项合并机制的理解,以及 mixin 与 extends 的优先级。
回答思路
- 【回答框架 1】Vue 的选项合并发生在组件初始化时,通过 mergeOptions 方法处理。默认策略是组件自身选项优先于 mixin 和 extends,生命周期钩子则合并为数组依次调用。
- 【回答框架 2】mixin 和 extends 都用于复用选项,但 extends 的优先级高于 mixin。当存在多个 mixin 时,数组后面的 mixin 优先级更高,而 extends 在 mixin 之前处理,因此其选项会被组件和后续 mixin 覆盖。
- 【回答框架 3】对于 data 对象,采用递归合并,组件实例的数据覆盖 mixin/extend 中的数据,且是深合并。对于 methods、computed 等,组件属性覆盖混入属性;对于生命周期钩子,所有钩子都会被保留,按顺序执行,执行顺序为:extend 的钩子、mixin 的钩子、组件自身的钩子。
- 【回答框架 4】自定义选项默认采用覆盖策略,即组件选项覆盖混入选项,除非通过 Vue.config.optionMergeStrategies 自定义合并策略。
- 【关键点 1】extends 优先级高于 mixin,组件自身最高。
- 【关键点 2】data 进行深合并,组件数据覆盖混入数据。
- 【关键点 3】生命周期钩子合并为数组,顺序执行,extend 最先,组件最后。
- 【易错点 1】不要混淆 extend 的优先级和覆盖逻辑,extends 只是提高优先级,并不影响 data 的深合并。
- 【易错点 2】注意多个 mixin 的合并顺序,数组后面的优先级更高,容易在项目维护时忽略。
- 【易错点 3】生命周期钩子的执行顺序并不代表覆盖,容易误以为后定义的钩子不会执行。