<slot></slot>插槽

1,默认插槽

slot用于组件内,也就是相当于占位符,例如:有两个组件demo1.vue,demo2.vue
如果<slot></slot>写在demo1.vue 中,然后在demo2.vue组件引用子组件demo1.vue,那在demo2中的<demo1>插入的内容</demo1>标签“插入的内容“就会替换掉demo1中的<slot></slot>标签,相当于占位符。
例如:
demo1.vue

<template>
    <div><slot>待替换的内容区</slot></div>
</template>

demo2.vue

<div id="app">
        <demo1>
            <div style="color: red;">内容1</div>
            <div>123</div>
        </demo1>
    </div>

上面的例子中,demo1中的<div><slot>待替换的内容区</slot></div>会被demo2中的

<div style="color: red;">内容1</div>
<div>123</div>

替换。

2,具名插槽

在组件中demo3.vue中编写

<template>
<div id="app">
        <my-con>
            <span slot="center">中间内容</span>
            <span slot="left">左侧内容</span>
            <span slot="right">右侧内容</span>
        </my-con>
    </div>
</template>

在demo4..vue中编写

<template>
    <div>
        <div>
        <slot name="left"></slot>
        <slot name="center"></slot>
        <slot name="right"></slot>
       </div>    
</div>
</template>

用slot中的name属性绑定名字,然后在demo4中给<demo3>标签一个slot属性绑定关联到对应的内容

3,作用域插槽

例子:
代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
    <div id="app">
        <!-- ulists自定义属性 -->
        <!-- <img src="" alt=""> -->
        <!-- <a href=""></a> -->
        <!-- 自定义属性不要用大写 如果要在组件内用驼峰形式来写变量名-->
        <my-table :lists-arr="users">
            <!-- <template> -->
            <!-- 2. 通过slot-scope指令绑定slot标签上面的集合(scope) -->
            <button slot-scope="scope" v-on:click="edit(scope)">编辑</button>
            <!-- </template> -->
        </my-table>
        <p>--------------</p>
        <my-table :listsArr="users1">
            <button>删除</button>
        </my-table>
    </div>
</body>
<template id="temp">
    <table>
        <thead>
            <tr>
                <th>姓名{{users}}</th>
                <th>年龄</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
            <tr v-for="(user,index) in listsArr" :key="index">
                <td>{{user.name}}</td>
                <td>{{user.age}}</td>
                <td>
                    <!-- 1. 在插槽内通过自定义属性绑定我们要传递到外面去的值 -->
                    <slot :username="user.name" :age="user.age" :idx="index" :user="user"></slot>
                </td>
            </tr>
        </tbody>
    </table>
</template>

<script>
    new Vue({
        el: '#app',
        data: {
            users: [
                { name: '张三', age: '20' },
                { name: '李四', age: '19' },
                { name: '王五', age: '22' },
            ],
            users1: [
                { name: '张三1', age: '10' },
                { name: '李四2', age: '19' },
                { name: '王五3', age: '22' },
            ]
        },
        methods: {
            edit(scope) {
                console.log('编辑按钮响应')
                console.log(scope)
                // console.log(this.users)
            }
        },
        components: { // 定义组件的地方
            MyTable: { // 组件的名称
                data() { // 定义组件内使用的变量,(子组件内的data属性一定是要function的形式,返回一个对象)
                    return {
                        users: 1
                    }
                },
                // 自定义组件具体结构
                template: "#temp",
                // props: ["ulists"],
                props: { // 定义自定义属性的
                    listsArr: {
                        type: Array,
                        default: []
                    }
                },
            }
        }
    })
</script>

</html>

通过slot-scope指令绑定slot标签上面属性的集合,用于传值。在上面例子中,子组件定义了username,age,idx三个自定义属性,在父组件中,用slot-scope属性接收这个自定义属性。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容