vue slot插件的理解:
父组件可以通过在子组件标签上携带属性传递给子组件,子组件通过props接收即可使用。
1.能在子组件标签之间传递信息吗,当然是可以的,这时子组件通过<slot></slot>标签接收,所以slot插件的本质是父组件向子组件传递展示dom,而非data。
<children><div>我是dom</div></children>
<template>
<div>
我是children组件
<slot></slot>
</div>
</template>
最终展示
我是children组件
我是dom
2.上面方式也可以理解为父组件给子组件传递具体的dom,还有种情况当父组件没有传递dom时,子组件可以设置后备dom,就是父组件传dom,优先渲染父组件传过来的,反之则渲染自己的,相当于占位了。
<children></children>
<template>
<div>
我是children组件
<slot><div>我是dom</div></slot>
</div>
</template>
最终展示
我是children组件
我是dom
3.上述说明的是单个插槽情况,也即父组件向子组件传递dom,这里说明多个插槽情况,父组件可以向子组件对应部位传递多个dom,而这些dom可以对应的传递给子组件对应位置。
<children>
<template v-slot:dom1>
<div>我是dom1</div>
</template>
<template v-slot:dom2>
<div>我是dom2</div>
</template>
<template v-slot:dom3>
<div>我是dom3</div>
</template>
</children>
<template>
<div>
我是children组件
<slot name="dom1"><div>我是dom1</div></slot>
<slot name="dom2"><div>我是dom2</div></slot>
<slot name="dom3"><div>我是dom3</div></slot>
</div>
</template>
最终展示
我是children组件
我是dom1
我是dom2
我是dom3
4.先总结下,插槽其实就是放在组件里的一种占位符,父组件更改占位符的内容,在多个占位符的情况下,也可以对应更改多个占位符的内容,同时,组件还可以向父组件提供数据接口,供父组件选择性的展示占位符的的数据,也即最后要介绍一的一种作用域插槽。
<children>
<template v-slot:defaule="slotProps">
<div>我是dom1{{slotProps.user.firstName}}</div>
</template>
</children>
<template>
<div>
我是children组件
<slot :user="user"><div>我是dom1{{user.lastName}}</div>
</slot>
</div>
</template>
data() {
return {
user: {
firstName: 'zhang',
lastName: 'san
}
}
}
最终展示
我是dom1zhang
这里需要注意的是为什么需要用slotProps,因为插槽传过来的是一个大对象,所以需要slotProps转一下。
{ "user": { "firstName": "zhang", "lastName": "san" } }
当然你也可以对象解构一下。这样使用。
<children>
<template v-slot:defaule="{user}">
<div>我是dom1{{user.firstName}}</div>
</template>
</children>
当只有一个默认插槽时,还可以简写。
<children v-slot="{user}">
<div>我是dom1{{user.firstName}}</div>
</children>
5.插槽使用
插槽是对公共组件的进一步公共抽象,以前的公共组件只是同一业务上的代码抽象,可面对公共组件里需要解决的差一点可以用插槽去解决。
以前是子组件一股脑展示自己的全部,现在是子组件交出部分权力让父组件去填充或替换,反之就用自己的。
现在可以试着这样想页面,最开始按基本的布局搭好架子,放好插槽占位,然后具体结构根据业务需要填充,即在业务组件上写结构,当发现结构可能会根据不同业务变化时继续写插槽占位,由上一级的组件提供具体业务内容,自此向上开发。
这里面实际上带开发哲学的味道,一种是有了页面去拆分抽象自上而下的开发,另一种是只有结构一点点往上堆叠自下往上的开发。
自下而上的开发有点向后端的接口,为页面就行接口实现类,这样在可复用的同时也对代码进行了规范。
原子性的组件只能重复写,除非是借助低代码平台来组装页面。