视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
详解vue2.6插槽更新v-slot用法总结
2020-11-27 22:00:10 责编:小采
文档


在 2.6.0 中,我们为具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令)。它取代了 slot 和 slot-scope 这两个目前已被废弃但未被移除且仍在文档中的特性。新语法的由来可查阅 RFC。

引vue官方文档

之前做项目时,对插槽理解太少了,这两天学习时,才发现插槽更新用v-slot了,自己做了些简单总结,与大家分享一下~

插槽

我的理解就是父页面在组件标签内插入任意内容,子组件内插糟slot控制摆放位置(匿名插槽,具名插槽)

插槽分类

插槽一共就三大类
1.匿名插槽(也叫默认插槽): 没有命名,有且只有一个
2.具名插槽: 相对匿名插槽组件slot标签带name命名的
3.作用域插槽: 子组件内数据可以被父页面拿到(解决了数据只能从父页面传递给子组件)

匿名插槽(也叫默认插槽default)

用法:我的理解,匿名插糟只需要一个.(就是这些,不太复杂)

父页面:

 <todo-list> 
 <template v-slot:default>
 任意内容
 <p>我是匿名插槽 </p>
 </template>
</todo-list> 
//v-slot:default写上感觉和具名写法比较统一,容易理解,也可以不用写

子组件 todoList.vue

<slot>我是默认值</slot>
##显示##
// 任意内容
// 我是匿名插槽

具名插槽(name)

用法:我的理解,和匿名插槽比较,就是必须起名todo对应,可以有多个具名插槽.(没了~)

父页面

 <todo-list> 
 <template v-slot:todo>
 任意内容
 <p>我是匿名插槽 </p>
 </template>
</todo-list> 
// todo
data() {
 return {
 dynamicSlotName:"todo" 
 }

 },

子组件

<slot name="todo">我是默认值</slot>
##显示##
// 任意内容
// 我是匿名插槽

对 v-slot:todo 做操作:

动态命名

v-slot:{dynamicSlotName}//替换标签上 v-slot:todo

具名插槽缩写(匿名插槽用法)(可以后看)

#todo 替换标签上 v-slot:todo

匿名如果想用必须加上default

#default 替换标签上 v-slot:todo

父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。

作用域插槽

1.重点是slotProps接取子组件里:user="user" :test="test"类似属性的数据

父页面

<todo-list>
 <template v-slot:todo="slotProps" >
 {{slotProps.user.firstName}}
 </template> 
</todo-list> 
//slotProps 可以随意命名
//slotProps 接取的是子组件标签slot上属性数据的集合所有v-bind:user="user"

子组件

 <slot name="todo" :user="user" :test="test">
 {{ user.lastName }}
 </slot> 
data() {
 return {
 user:{
 lastName:"Zhang",
 firstName:"yue"
 },
 test:[1,2,3,4]
 }
 },
// {{ user.lastName }}是默认数据 v-slot:todo 当父页面没有(="slotProps")
// 时显示 Zhang


## 显示 ##
// yue

解构插槽Prop

父页面 (子组件不变 显示一样)

// 相当于
function (slotProps) {
 // 插槽内容
}
(slotProps)=>参数可以用slot标签上现有的值({user,test})替换
<todo-list>
 <template v-slot:todo="{user,test}
" >
 {{user.firstName}}
 </template> 
</todo-list> 
## 显示 ##
## // yue

参数值替换名字(可以后看)

<todo-list>
 <template v-slot:todo="{user:person,test}
" >
 {{person.firstName}}
 </template> 
</todo-list> 

// v-slot:[dynamicSlotName]="{user:person,test}
## 显示 ##
## // yue

独占默认插槽缩写(可以后看)
感觉没什么机会用,条件太多

总结

在用上v-slot之后 只需要考虑好

1.是否需要命名(匿名插槽,具名插槽)
2.父页面是否需要取存在子页面的数据(作用域插槽)

todo-list实例

可以试一下,便于理解~

父页面

<template>
 <div>
 新插槽 v-slot 代替具名插槽 作用于插槽
 <todo-list
 > 
 <template #todo="{todos:list}">
 <div @click = type(todos.id)>
 {{list.text}}
 </div>
 
 </template>
 </todo-list> 
 </div >
</template>
<script>
import todoList from "@/components/component/slotTodoChildren";
export default {
 name:"vSlot",
 components:{
 todoList
 },
 data() {
 return {

 }
 },
 methods: {
 type(data){
 console.log(data)
 }
 },
}
</script> 

子组件

<template>
 <ul class="slotTodoChildren">
 <li class="lis"
 v-for="todo in todoList"
 v-bind:key="todo.id"
 >
 <!--
 我们为每个 todo 准备了一个插槽,
 将 `todo(todoList里的)` 对象作为一个插槽的 prop 传入。
 -->
 <slot name="todo" :todos="todo">
 <!-- 后备内容 -->
 {{ todo.text }}
 </slot>
 </li>
 </ul>
</template>
<script>
export default {
 name:"slotChildren",

 data() {
 return {
 todoList:[
 {
 id:1, 
 text:"扫地"
 },
 {
 id:2,
 text:"做饭"
 },
 {
 id:3,
 text:"擦桌子"
 }
 ]
 }
 },
 created(){
 console.log(this.filteredTodos)
 }
}
</script>
<style scoped>
.slotTodoChildren .lis{
 display: block;
 background: #434534;
 line-height:40px;
 margin-top: 10px;
 color: #fff;
 font-size: 24px;
 height: 40px;
}
</style>

下载本文
显示全文
专题