Vue 面试题 目录

Vue 中 mixin 和组件的选项合并策略是什么?

推荐答案

在 Vue 中,mixin 和组件的选项合并策略是通过 Vue 内部的 mergeOptions 方法来实现的。Vue 在处理 mixin 和组件选项时,会按照一定的规则进行合并。具体规则如下:

  1. 数据对象(datadata 选项会进行递归合并,组件的数据优先于 mixin 的数据。
  2. 生命周期钩子(created, mounted 等):同名钩子函数会被合并为一个数组,mixin 的钩子先执行,组件的钩子后执行。
  3. 方法(methods:同名方法会被覆盖,组件的方法优先于 mixin 的方法。
  4. 计算属性(computed:同名计算属性会被覆盖,组件的计算属性优先于 mixin 的计算属性。
  5. 指令(directives:同名指令会被覆盖,组件的指令优先于 mixin 的指令。
  6. 组件(components:同名组件会被覆盖,组件的组件优先于 mixin 的组件。
  7. 过滤器(filters:同名过滤器会被覆盖,组件的过滤器优先于 mixin 的过滤器。
  8. 其他选项:其他选项(如 props, watch 等)会按照默认的合并策略进行合并,组件的选项优先于 mixin 的选项。

本题详细解读

数据对象(data

mixin 和组件都定义了 data 选项时,Vue 会递归合并这两个对象。如果 data 中的属性名相同,组件的 data 会覆盖 mixindata

-- -------------------- ---- -------
----- ----- - -
  ------ -
    ------ -
      -------- ------ ---- -------
      ------ -
    --
  -
--

--- -----
  ------- --------
  ------ -
    ------ -
      -------- ------ ---- -----------
      ------------- -
    --
  -
---

在这个例子中,最终的 data 对象将是:

生命周期钩子

对于生命周期钩子函数,Vue 会将 mixin 和组件的同名钩子函数合并为一个数组。mixin 的钩子函数会先执行,组件的钩子函数后执行。

-- -------------------- ---- -------
----- ----- - -
  --------- -
    ------------------ ----------
  -
--

--- -----
  ------- --------
  --------- -
    ---------------------- ----------
  -
---

输出结果将是:

方法(methods

对于 methods 选项,如果 mixin 和组件定义了同名方法,组件的方法会覆盖 mixin 的方法。

-- -------------------- ---- -------
----- ----- - -
  -------- -
    ---------- -
      ------------------ ---- --------
    -
  -
--

--- -----
  ------- --------
  -------- -
    ---------- -
      ------------------ ---- ------------
    -
  -
---

调用 sayHello 方法时,输出将是:

计算属性(computed

对于 computed 选项,如果 mixin 和组件定义了同名计算属性,组件的计算属性会覆盖 mixin 的计算属性。

-- -------------------- ---- -------
----- ----- - -
  --------- -
    ----------------- -
      ------ ------------------------------------------
    -
  -
--

--- -----
  ------- --------
  ------ -
    ------ -
      -------- -------
    --
  --
  --------- -
    ----------------- -
      ------ ---------------------------
    -
  -
---

在这个例子中,reversedMessage 计算属性的值将是 HELLO,而不是 olleH

指令(directives

对于 directives 选项,如果 mixin 和组件定义了同名指令,组件的指令会覆盖 mixin 的指令。

-- -------------------- ---- -------
----- ----- - -
  ----------- -
    ------ -
      ------------ -
        -----------
      -
    -
  -
--

--- -----
  ------- --------
  ----------- -
    ------ -
      ------------ -
        ------------------------ - ---------
      -
    -
  -
---

在这个例子中,v-focus 指令的行为将是改变背景颜色,而不是聚焦。

组件(components

对于 components 选项,如果 mixin 和组件定义了同名组件,组件的组件会覆盖 mixin 的组件。

-- -------------------- ---- -------
----- ----- - -
  ----------- -
    --------------- -
      --------- ----------- ----------------
    -
  -
--

--- -----
  ------- --------
  ----------- -
    --------------- -
      --------- --------------- ----------------
    -
  -
---

在这个例子中,<my-component> 将渲染为 Component Component,而不是 Mixin Component

过滤器(filters

对于 filters 选项,如果 mixin 和组件定义了同名过滤器,组件的过滤器会覆盖 mixin 的过滤器。

-- -------------------- ---- -------
----- ----- - -
  -------- -
    ----------------- -
      ------ ----------------------------- - ---------------
    -
  -
--

--- -----
  ------- --------
  -------- -
    ----------------- -
      ------ --------------------
    -
  -
---

在这个例子中,capitalize 过滤器将把字符串转换为大写,而不是仅首字母大写。

其他选项

对于其他选项(如 props, watch 等),Vue 会按照默认的合并策略进行合并,组件的选项优先于 mixin 的选项。

-- -------------------- ---- -------
----- ----- - -
  ------ -
    -------- ------
  --
  ------ -
    --------------- -
      ------------------ -------- --------
    -
  -
--

--- -----
  ------- --------
  ------ -
    -------- -------
    ------------ ------
  --
  ------ -
    --------------- -
      ---------------------- -------- --------
    -
  -
---

在这个例子中,messagewatch 回调将是 Component watch,而不是 Mixin watch

纠错
反馈