vue封装背景知识小插曲之插槽slot的用法

vue封装背景知识小插曲之插槽slot的用法

一 什么是插槽slot,都可以干啥?

直白点说就是子组件使用<slot> 先占了个地方,然后当父组件使用子组件的时候,在对应地方写上自己需求的代码即可,达到了子组件中部分代码的复用。

// 举个例子    
//子组件中
<template>
    <div class='child'>
         // 此处子组件部分代码省略
        <slot></slot>
    </div>
</template>



// 父组件中使用子组件
<template>
    <div>
        <Child>
           <div> 八八八八 <div>
        </Child>
    </div>
</template>


// 父组件中使用子组件
<template>
    <div>
        <Child>
           <el-table> <el-table>
        </Child>
    </div>
</template>


// 父组件中使用子组件
<template>
    <div>
        <Child>
           <el-select> <el-select>
        </Child>
    </div>
</template>



//  从上面例子可以看出,在父组件中,预留插槽的位置可以放任何东西,达到了子组件中部分代码复用的效果

二 常见的插槽用法

一 插槽的默认值:我们定义插槽的时候,可以在子组件的插槽上放默认值,如果父组件中传值了,那么使用传的值,如果没有传值,则使用默认值


//  子组件中    定义插槽,并写上默认值
<button type="submit">
  <slot>
    提交<!-- 默认内容 -->
  </slot>
</button>



// 父组件没有给插槽提供内容的时候
<SubmitButton /> 
<!-- 这个时候按钮的名字是   提交  -->


// 父组件给插槽提供内容
<SubmitButton>  保存 </SubmitButton>
<!-- 这个时候按钮的名字是  保存    -->


具名插槽 :有名字的插槽,可以精准的将代码插到子组件相应的位置

//  子组件   BaseLayout
<div class="container">
  <header>
    <slot name="header"></slot>
  </header>
  <main>
    <slot></slot>
  </main>
  <footer>
    <slot name="footer"></slot>
  </footer>
</div>



// 父组件
<BaseLayout>
  <template v-slot:header>
    <!-- header 插槽的内容放这里 -->
  </template>

  <template v-slot:default>
    <!-- main 插槽的内容放这里 -->
  </template>

  <template v-slot:footer>
    <!-- footer 插槽的内容放这里 -->
  </template>
</BaseLayout>




// 在父组件中,v-slot 有对应的简写:  #,也就是说代码可以写成如下模样
<BaseLayout>
  <template #header>
    <!-- header 插槽的内容放这里 -->
  </template>

  <template #default>
    <!-- main 插槽的内容放这里 -->
  </template>

  <template #footer>
    <!-- footer 插槽的内容放这里 -->
  </template>
</BaseLayout>


作用域插槽:可以让父组件使用插槽时的内容能够访问子组件中的数据

// 参考: https://blog.csdn.net/qq_44858608/article/details/124736943
// 这篇文章写的很详细,我们提炼一下

// 如何通过作用域插槽让父组件能访问到子组件的内容?我们先看普通的情况


// 子组件 ---------Category
<template>
	<div class="category">
		<ul>
            <li v-for="(g,index) in games" :key="index">{{g}}</li>
        </ul>
	</div>
</template>
 
<script>
	export default {
		name:'Category',
		props:['title'],
		data() {
			return {
				games:['红色警戒','穿越火线','劲舞团','超级玛丽'],
			}
		},
	}
</script>



// 父组件
// 这个时候,当使用了子组件<Category>后,子组件的内容会被渲染出来,如下图
<template>
	<div class="container">
		<Category title="游戏"></Category>
	</div>
</template>
 
<script>
	import Category from './components/Category'
	export default {
		name:'App',
		components:{ Category },
	}
</script>
 

在这里插入图片描述

// 那作用域插槽怎么用?(如何通过作用域插槽让父组件能访问到子组件的内容)

// 子组件,绑定了数据,目的是为了传给父组件
<template>
	<div class="category">
		<slot :games="games" msg="hello">我是默认的一些内容</slot>
	</div>
</template>
 
<script>
	export default {
		name:'Category',
		props:['title'],
		data() {
			return {
				games:['红色警戒','穿越火线','劲舞团','超级玛丽'],
			}
		},
	}
</script>



// 父组件
// 接收到数据,并使用数据
<template>
	<div class="container">
 
		<Category title="游戏">
			<template scope="atguigu">
				<ul>
					<li v-for="(g,index) in atguigu.games" :key="index">{{g}}</li>
				</ul>
			</template>
		</Category>
	</div>
</template>
 
<script>
	import Category from './components/Category'
	export default {
		name:'App',
		components:{ Category },
	}
</script>

在这里插入图片描述

// 既然插槽作用域,能够让父组件拿到子组件插槽中的作用,但是我们可以直接写,那他存在的意义是什么呢?


// 我们可以拿到子组件给我们的数据,然后在父组件自由发挥样式,数据有了,样式可以自由发挥很多种。用于展示不用的样式效果。


//  沿用上面的子组件


// 父组件
<template>
	<div class="container">
 
		<Category title="游戏">
			<template scope="atguigu">
				<ul>
					<li v-for="(g,index) in atguigu.games" :key="index">{{g}}</li>
				</ul>
			</template>
		</Category>
 
		<Category title="游戏">
			<template scope="{games}">
				<ol>
					<li style="color:red" v-for="(g,index) in games" :key="index">{{g}}</li>
				</ol>
			</template>
		</Category>
 
		<Category title="游戏">
			<template slot-scope="{games}">
				<h4 v-for="(g,index) in games" :key="index">{{g}}</h4>
			</template>
		</Category>
	</div>
</template>
 
<script>
	import Category from './components/Category'
	export default {
		name:'App',
		components:{ Category },
	}
</script>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值