Vue-52、Vue技术插槽使用

1、默认插槽

App.vue

<template>
    <div class="container">
        <category title="美食">
            <img src="https://tse2-mm.cn.bing.net/th/id/OIP-C.F0xLT-eKcCSOI5tdjBv9FAHaE8?w=303&h=202&c=7&r=0&o=5&pid=1.7">
        </category>
        <category title="游戏"  >
            <ul>
                <li v-for="(p,index) in games" :key="index">{{p}}</li>
            </ul>
        </category>
        <category title="电影">
            <video controls src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"></video>
        </category>
    </div>
</template>
<script>
    import Category from './components/Category'
    export default {
        name: 'App',
        components: {
            Category
        },
        data(){
            return{
                foods:['火锅','烧烤','小龙虾','牛排'],
                games:['红色警戒','穿越火线','劲舞团','超近玛丽'],
                films:['《教父》','《拆弹专家》','《你好李焕英》','《龙门客栈》'],
            }
        }
    }
</script>
<style scoped>
    .container{
        display: flex;
        justify-content: space-around;
    }
    img{
        width: 120%;
        margin-left: -36px;
    }
    video{
        width: 120%;
        margin-left: -36px;
    }
</style>


Category.vue

<template>
    <div class="category">
        <h3>{{title}}分类</h3>
        <ul>
            <!--定义一个插槽(挖个坑,等着组件的使用者进行填充)-->
            <slot>我是一个默认值,当使用者没有传递具体结构时,我会出现</slot>
        </ul>
    </div>
</template>

<script>
    export default {
        name: "Category",
        props:['title'],
        data(){
            return{

            }
        }
    }
</script>

<style scoped>
    .category{
        background-color: skyblue;
        width: 200px;
        height: 300px;
    }

    h3{
        text-align: center;
        background-color: orange;
    }
</style>

效果
Vue-52、Vue技术插槽使用_第1张图片
2、具名插槽

App.vue

<template>
    <div class="container">
        <category title="美食">
            <img slot="center" src="https://tse2-mm.cn.bing.net/th/id/OIP-C.F0xLT-eKcCSOI5tdjBv9FAHaE8?w=303&h=202&c=7&r=0&o=5&pid=1.7">
            <a slot="footer" href="https://www.baidu.com">更多美食</a>
        </category>
        
        <category title="游戏"  >
            <ul slot="center">
                <li v-for="(p,index) in games" :key="index">{{p}}</li>
            </ul>
          <div class="foot" slot="footer">
              <a  href="https://www.baidu.com">单机游戏</a>
              <a  href="https://www.baidu.com">网络游戏</a>
          </div>
        </category>
        <category title="电影"   slot="footer">
            <video  slot="center" controls src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"></video>
            <div slot="footer" class="foot">
                <a  href="https://www.baidu.com">经典</a>
                <a  href="https://www.baidu.com">热门</a>
                <a  href="https://www.baidu.com">推荐</a>
            </div>
            <h4 slot="footer">欢迎来看电影</h4>
        </category>
    </div>
</template>
<script>
    import Category from './components/Category'
    export default {
        name: 'App',
        components: {
            Category
        },
        data(){
            return{
                foods:['火锅','烧烤','小龙虾','牛排'],
                games:['红色警戒','穿越火线','劲舞团','超近玛丽'],
                films:['《教父》','《拆弹专家》','《你好李焕英》','《龙门客栈》'],
            }
        }
    }
</script>
<style scoped>
    .container{
        display: flex;
        justify-content: space-around;
    }
    img{
        width: 120%;
        margin-left: -36px;
    }
    video{
        width: 120%;
        margin-left: -36px;
        /*margin-top: 80px;*/
    }
    .foot{
        display: flex;
        justify-content: space-around;

    }
    h4{
        text-align: center;
    }

</style>

Category.vue

<template>
    <div class="category">
        <h3>{{title}}分类</h3>
        <ul>
            <!--定义一个插槽(挖个坑,等着组件的使用者进行填充)-->
            <slot name="center">我是一个默认值,当使用者没有传递具体结构时,我会出现</slot>
            <slot name="footer">我是一个默认值,当使用者没有传递具体结构时,我会出现</slot>
        </ul>
    </div>
</template>

<script>
    export default {
        name: "Category",
        props:['title'],
        data(){
            return{

            }
        }
    }
</script>

<style scoped>
    .category{
        background-color: skyblue;
        width: 200px;
        height: 300px;
    }

    h3{
        text-align: center;
        background-color: orange;
    }
</style>

效果
Vue-52、Vue技术插槽使用_第2张图片
3、作用域插槽

Category.vue

<template>
    <div class="category">
        <h3>{{title}}分类</h3>
            <!--定义一个插槽(挖个坑,等着组件的使用者进行填充)-->
            <slot :games="games">我是一个默认值,当使用者没有传递具体结构时,我会出现</slot>
    </div>
</template>
<script>
    export default {
        name: "Category",
        props:['title'],
        data(){
            return{
                games:['红色警戒','穿越火线','劲舞团','超近玛丽'],
            }
        }
    }
</script>

<style scoped>
    .category{
        background-color: skyblue;
        width: 200px;
        height: 300px;
    }

    h3{
        text-align: center;
        background-color: orange;
    }
</style>

第一种写法

<category title="游戏"  >
            <template scope="{games}">
                <ul>
                    <li v-for="(p,index) in games" :key="index">{{p}}</li>
                </ul>
            </template>
        </category>

第二种写法

 <category title="游戏"  >
            <template slot-scope="{games}">
                <ol>
                    <li v-for="(p,index) in games" :key="index">{{p}}</li>
                </ol>
            </template>
        </category>

第三种写法

<category title="游戏"  >
            <template scope="ati">
                <h4 v-for="(p,index) in ati.games" :key="index">{{p}}</h4>
            </template>
        </category>

效果
Vue-52、Vue技术插槽使用_第3张图片
总结

1、作用:让父组件可以向子组件制定位置插入html结构,也是一种组件的通信方式,适用于父组件====>子组件
2、分类:默认插槽、具名插槽、作用域插槽

3、使用方式

	1、默认插槽
父组件中:
<Category>
	<div>html</div/>
</Category>

子组件中:
<template>
	<div>
		<slot>
			插槽默认内容
		</slot>
	</div/>
</template>
	2、具名插槽
父组件中:

<Category>
	<template slot="footer">
		<div>html结构1</div/>
	</template>
	
	<template slot="center">
		<div>html结构2</div/>
	</template>

</Category>

子组件中:
<template>
	<div>
		<slot name="center">插槽默认内容</slot>
		<slot name="footer">插槽默认内容</slot>
	</div/>
</template>
	3、作用域插槽
			
		1、理解:数组在组件的自身,但根据数据生成的结构需要组件的使用者来决定。(games数据在Category组件中,但是使用数据所遍历出来的结构由App组件决定)

		2、具体编码:
父组件中:
<Category>
	<template  scope="scopeData">
		<ul>
			<li v-for="(p,index) in scopeData.games" :key="index">{{p}}</li>
		</ul>
	</template>
</Category>

<Category>
	<template  slot-scope="scopeData">
		<ul>
			<h4 v-for="(p,index) in scopeData.games" :key="index">{{p}}</h4>
		</ul>
	</template>
</Category>


子组件:

<template>
	<div>
		<slot :games="games">插槽默认内容</slot>
	</div/>
</template>
<script>
    export default {
        name: "Category",
        props:['title'],
        data(){
            return{
                games:['红色警戒','穿越火线','劲舞团','超近玛丽'],
            }
        }
    }
</script>

你可能感兴趣的:(vue,vue.js,javascript,前端)