vue组件二次封装
vue演练场:Vue SFC Playground
有组件如下:
它接受
- props:msg
- 命名插槽 header
- 作用域插槽
<script setup>
const greetingMessage = 'hello'
const props=defineProps({
msg:{
type:String,
default:"默认msg props"
}
})
</script>
<template>
<div>
<h1>{{msg}}</h1>
<slot :text="greetingMessage" :count="1"></slot>
<div style="border:1px solid red">
<slot name="header">默认header</slot>
</div>
</div>
</template>
直接使用
<script setup>
import MyComponent from './MyComponent.vue'
import Comp2 from './Comp2.vue';
</script>
<template>
<MyComponent v-slot="slotProps">
{{ slotProps.text }} {{ slotProps.count }}
</MyComponent>
</Comp2>
</template>
二次封装组件
对原来的MyComponent再封装一次
强烈二次封装使用export default方式的鞋,不要用setup,会多好多声明代码
<script>
import MyComponent from './MyComponent.vue';
export default {
components:{MyComponent}
}
</script>
<template>
<MyComponent v-bind="$attrs">
<template v-for="(item,name) in $slots" #[name]="slotData">
<slot :name="name" v-bind="slotData"></slot>
</template>
</MyComponent>
</template>
二次封装的组件的使用
<script setup>
import MyComponent from './MyComponent.vue'
import Comp2 from './Comp2.vue';
</script>
<template>
<MyComponent v-slot="slotProps">
{{ slotProps.text }} {{ slotProps.count }}
</MyComponent>
<div style="height:200px"></div>
<Comp2 />
<div style="height:200px">下面是传递了参数和slot的</div>
<Comp2 >
<template v-slot:header>
我是自定义头内容
</template>
<!-- 自定义作用域插槽 -->
<template v-slot:default="slotProps">
<div>default变了{{ slotProps.text }} {{ slotProps.count }}</div>
</template>
<template v-slot:head="slotProps">
<div>头变了:{{ slotProps.text }} {{ slotProps.count }}</div>
</template>
</Comp2>
</template>