Vue 中的插槽内容穿透和配置参数过滤


需求描述

(以element ui组件为基础)设计一种嵌套结构,从上到下依次是:

  • 卡片组(dyn-card-group)
  • 卡片(dyn-card)
  • 布局组(dyn-layout-group,包含 el-rowel-col)

以下实现是通过配置参数的方式动态渲染组件,避免重复书写视图模板。配置参数严格按照组件结构声明。

将“布局组”组件作为插槽内容传入“卡片组”组件,并穿透到“卡片”组件内,“布局组”会获取并绑定“卡片”组件过滤后的布局数组,以确保实际生成的页面严格遵照配置参数的结构。

由于“卡片组”和“卡片”组件是独立的,当只有一个卡片时可以不渲染“卡片组”直接生成“卡片”,更加灵活。

思路分析

Vue 的插槽语法允许将任意符合要求的文本、表达式或组件传入到子组件中。因此,可以通过嵌套插槽的方式,将传入子组件插槽的内容穿透到更深层次的子组件中,并且可以获取到深层次子组件的插槽所绑定的数据。

定义需要穿透的插槽:


···
  
  
···

···
  
···

代码示例

配置参数 cardList 表示一个卡片组,组内包含两个卡片,每个卡片各自包含两个 el-row 以及若干 el-col

卡片组(dyn-card-group.vue):



卡片(dyn-card.vue):



布局组(dyn-layout-group.vue):



统一导出各组件 index.js:

import dynCardGroup from './dyn-card-group.vue';
import dynCard from './dyn-card.vue';
import dynLayoutGroup from './dyn-layout-group.vue';

export { dynCardGroup, dynCard, dynLayoutGroup};

在主模块中组合三个组件并传入参数:




输出效果:

总结

插槽穿透:

  • 通过以上方式可以实现插槽内容的穿透,不过这种方式只适合被穿透的组件与穿透到的目标组件具有强耦合关系的场景。这种情况下通过可以将两个组件作为统一的整体同时开发与维护,比如示例中的“卡片组”与“卡片”。嵌套层级最好不超过3层,否则会比较难维护。

过滤配置参数:

  • 通过以上方式过滤配置参数,实际上只绑定了组件的相对层级,也就是组件的祖孙关系(甚至可以实现反向祖孙关系),各组件之间仍然是独立的。修改某个组件的结构和内部数据不会影响其他组件,比如修改布局组件不会影响卡片组件,反之亦然。
  • 在使用时,可以将任意的其他组件嵌入到布局和卡片之间,只要保证配置参数是严格符合组件的视图结构即可。配置参数被传入到各级组件时会根据结构分层以及分组,不同层级和不同分组之间不会相关影响,保证了组件之间的低耦合度。