Vue小技巧

67 阅读1分钟

业务场景

在正常业务中列表组件通常会进行公共封装,例如统一的样式、统一的按钮处理等,本次小技巧适用于,在公共table组件中使用插槽,在另外的一个组件B中引用了table组件,并且也使用了插槽,这样的话如果组件C引用组件B时,传到组件table的插槽数据写法就会有问题,出现template直接嵌套template的情况,引发报错。

插槽嵌套

如果遇到插槽嵌套的情况,直接使用template嵌套template会报错,当你不想或者不能额外添加其他元素标签时,你可以这么做。

组件A a-component

<table>
    <tbody>
        <td v-for="item in data">
            <slot :item="item" :name="item.key">
                {{ item.title }}
            </slot>
        </td>
    </tbody>
</table>

组件Bb-component

<div>
    <a-component>
         <template v-for="(index, name) in tableSlot" v-slot:[name]="data">
        <slot :name="name" :record=" data?data.item:{}"></slot>
      </template>
    </a-component>
</div>
​
export default defineComponent({
    setup(props, { slots, emit }) {
       const tableSlot = computed(() => {
      let s = {};
      for (let key in slots) {
       (key !== "query"&&key !== "operationEx") && (s[key] = slots[key]);
      }
      return s;
    });
    })
    
})

组件C

<b-component>
    <template #key1>
        <a>链接</a>
    </template>
    <template #key2>
        <input />
    </template>
    <template #key3>
        <button>按钮</button>
    </template>
</b-component>

可使用如下方法处理:

B组件中 获取到所有插槽,排除掉组件C中自己使用的,剩下的使用for语句加载到组件A中,如上面组件B中示例代码,该方法可以避免template直接嵌套template

扫码_搜索联合传播样式-标准色版.png