Vue中的slot

210 阅读1分钟

(图片来自网络,如有侵权请联系删除) OIP-C (2).jfif

插槽(slot)

插槽就是占位符,可以理解为slot在组件标签中占了一个位置,当使用该标签的时候,组件标签里面的内容会自动填上这个位置。

使用场景

通过插槽可以让用户扩展组件,去更好的复用组件和对其做定制化处理。如果父组件在使用一个复用组件的时候,获取这个组件在不同的地方都有一定的差别。可以通过slot插槽向组件的内部的指定位置传递一些内容,完成这个组件在不同场合的使用。

比如对话框:有的兑换框需要按钮有的不需要,此时就可以用slot插槽占位,如果给它传按钮就显示按钮,如果不传就没有。

插槽分为三种:

  • 默认插槽
  • 具名插槽
  • 作用域插槽
    1、默认插槽

用slot标签来确定占位的位置,标签里面可以放默认的内容,当父组件中没有像指定的插槽插入内容,那么就使用默认的内容。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<div id="app">
    我是父组件
    <component-a>
        我插入到子组件
    </component-a>
</div>
<body>
    <script>
        let ComponentA = {
            template:`
            <div>
            我在插入位置的上方
            <hr>
            <slot></slot>
            </div>
            `,
            data() {
                return {
                  children:{name:'tom',age:19}  
                }
            },
        }
        let vm =new Vue({
            el:'#app',
            components:{
                ComponentA
            }
        })
    </script>
</body>
</html>

2、具名插槽

具名插槽是默认插槽的加强,如果由很多个占位的话那么需要给他们起个名字,让他们与要插入的内容一一对应。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<div id="app">
    我是父组件
    <component-a>
        <template v-slot:header>
            我是插入的header
        </template>
        我是插入的content
        <template v-slot:footer>
            我是插入的footer
        </template>
    </component-a>
</div>
<body>
    <script>
        let ComponentA = {
            template:`
            <div>
            我在插入位置的上方
            <hr>
            <slot name='header'></slot>
            <slot></slot>
            <slot name='footer'></slot>
            </div>
            `,
            data() {
                return {
                  children:{name:'tom',age:19}  
                }
            },
        }
        let vm =new Vue({
            el:'#app',
            components:{
                ComponentA
            }
        })
    </script>
</body>
</html>

3、作用域插槽

子组件绑定属性来将子组件中的信息传递给父组件使用。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<div id="app">
    <component-a>
        <template v-slot:default='slotprops'>
            {{slotprops.childDate.name}}
        </template>
    </component-a>
</div>
<body>
    <script>
        let ComponentA = {
            template:`
            <div>
            <slot v-bind:childDate='children'>
            </slot>
            </div>
            `,
            data() {
                return {
                  children:{name:'tom',age:19}  
                }
            },
        }
        let vm =new Vue({
            el:'#app',
            components:{
                ComponentA
            }
        })
    </script>
</body>
</html>