vue之插槽

1.匿名插槽

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <App></App>
    </div>
    <script src="./vue.js"></script>
    <script>
        Vue.component('MBtn',{
            template:`
                <button>
                    <slot></slot>
                </button>
            `
        })
        const App = {
            data() {
                return {
                    title: "老爹"
                }
            },
            template: `
                <div>
                    <m-btn><a href="#">登录</a></m-btn>
                    <m-btn>注册</m-btn>
                </div>
            `,
        }
        new Vue({
            el: '#app',
            components: {
                App
            }
        })
    </script>
</body>

</html>

2.具名插槽

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <App></App>
    </div>
    <script src="./vue.js"></script>
    <script>
        // 只要匹配到slot标签的name值 template中的内容就会被插入到这个槽中
        Vue.component('MBtn', {
            template: `
                <button>
                     <slot name='submit'></slot>
                     <slot name='login'></slot>
                     <slot name='register'></slot>
                </button>
            `
        })
        const App = {
            template: `
                <div>
                     <m-btn>
                         <template slot='submit'>
                             提交
                         </template>
                     </m-btn>
                    <m-btn>
                        <template slot='login'>
                            <a href="#">登录</a>
                        </template>
                    </m-btn> 
                    <m-btn>
                        <template slot='register'>
                            注册
                        </template>
                    </m-btn>
                </div>
            `,
        }
        new Vue({
            el: '#app',
            components: {
                App
            }
        })
    </script>
</body>
</html>

3.作用域插槽

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <App></App>
    </div>
    <script src="./vue.js"></script>
    <script>
        // 已经开发了一个待办事项列表的组件,很多模块都在
        // A B
        // 1.之前数据格式和引用接口不变,正常显示
        // 2.新功能模块增加对勾
        const todoList = {
            props: {
                todos: Array,
                defaultValue: []
            },
            template: `
        <ul>
            <li v-for='item in todos' :key='item.id'>
// 1.在子组件中插入slot标签,自定义属性绑定需要传递到父组件的当前组件的数据 <slot :itemValue = 'item'> </slot> {{item.title}} </li> </ul> ` } const App = { data() { return { todoList: [{ title: '大哥你好么', isComplate: true, id: 1 }, { title: '小弟我还行', isComplate: false, id: 2 }, { title: '你在干什么', isComplate: false, id: 3 }, { title: '抽烟喝酒烫头', isComplate: true, id: 4 } ] } }, components: { todoList }, template: `
           // 2.在父组件中使用子组件 <todoList :todos='todoList'>
// 3.在子组件标签中,使用template标签,绑定v-slot属性(绑定的数据可以任意起名,v-slot属性的数据是一个对象,存放的是子组件slot插槽中自定义的属性值) <template v-slot='data'>
// 4.使用数据 <input type="checkbox" v-model='data.itemValue.isComplate' /> </template> </todoList> `, } new Vue({ el: '#app', components: { App } }) </script> </body> </html>

  

原文地址:https://www.cnblogs.com/shannen/p/13964699.html