美文网首页
【转发】具名插槽简写和作用域插槽

【转发】具名插槽简写和作用域插槽

作者: Prince_0716 | 来源:发表于2022-02-08 13:54 被阅读0次

10. [组件]具名插槽简写和作用域插槽

在父模板中确定插槽位置时,使用了v-slot:one这种方法,其实这个语法可以简写成#one。这时候的代码就变成了下面的样子。

const app = Vue.createApp({
    template: ` 
    <h2>欢迎光临红浪漫-请选择您的技师</h2>
    <hong-lang-man>
        <template v-slot:one><div>1.女宾一位,请上三楼。</div></template>
        <template v-slot:two><div>3.顾客选择了全身SPA。</div></template>
    </hong-lang-man>
`
})

修改后,可以打开浏览器,进行预览,发现也可以出现正确的结果。学完具名插槽的简写方法后,就可以学习这节的重点了作用域插槽。

作用域插槽-基础代码准备

其实作用域插槽主要解决的问题是,子组件中有插槽,也有变量,这些变量如何在父组件中进行使用。先来看这样一个需求:编写一个子组件,里边有大脚、刘英和晓红三个名字变量,然后在子组件中用循环的形式输出出来。

在学习作用域插槽前,我们先来完成这个基本需求,复制Demo9的代码到Demo10.html页面中,然后留下最基础的代码。

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Demo10</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/3.0.2/vue.global.js"></script>
</head>

<body>
    <div id="app"></div>
</body>
<script>
    const app = Vue.createApp({
        template: `  <h2>欢迎光临红浪漫-请选择您的技师</h2>`
    })

    const vm = app.mount("#app")
</script>

上边就是最基础的Vue3代码,不作过多解释,你可以直接复制这段代码,开始你的学习。接下来我们要写一个子组件,满足刚才说的需求。

<script>
    const app = Vue.createApp({
        template: `  
            <h2>欢迎光临红浪漫-请选择您的技师</h2>
            <list />
        `
    })
    app.component('List', {
        data() {
            return {
                list: ['大脚', '刘英', '晓红']
            }
        },
        template: `
            <div>
                <div v-for="item in list">{{item}}</div>    
            </div>
        `
    })

    const vm = app.mount("#app")
</script>

上面的代码,编写了一个子组件list,然后在list组件里,声明了一个list的数组数据项。数据项里有三个值大脚刘英晓红。在模板中试用v-for的形式,进行循环。

写完这段代码后,可以到浏览器里调试一下,看看可以正常运行吗?如果一切正常,应该在页面上显示出循环的值了。

作用域插槽-具体讲解

有了基础代码,就可以学习作用域插槽的内容了。目前子组件里循环使用的是<div>标签,现在要求这个标签是父组件调用时确定,也就是要使用插槽了。(需要说明,这种情况在你写组件时,经常遇到,所以你要足够的重视)。

我们刚开始的想法,可以是先改造子组件,增加slot插槽,增加插槽后的模板代码如下。

template: `
    <div>
        <slot v-for="item in list"  />    
    </div>
`

然后在父组件里进行调用,调用方法如下。

const app = Vue.createApp({
    template: `  
        <h2>欢迎光临红浪漫-请选择您的技师</h2>
        <list> <span></span> </list>
    `
})

这时候在浏览器中查看,打开控制台,可以看到DOM中,是有三个<span>标签的。说明DOM通过插槽的形式,传递过来了。那接下来的问题,就是父组件如何使用子组件中的变量。

父组件想使用子组件插槽中的值,可以使用:绑定的形式进行传递,比如写成:item="item",具体的代码可以写成下面的样子。

app.component('List', {
    data() {
        return {
            list: ['大脚', '刘英', '晓红']
        }
    },
    template: `
        <div>
            <slot v-for="item in list" :item="item" />    
        </div>
    `

写完后父组件中用v-slot="xxx"的形式接受,接收后就可以使用了。

const app = Vue.createApp({
    template: `  
    <h2>欢迎光临红浪漫-请选择您的技师</h2>
    <list v-slot="props"> 
        <span>{{props.item}}</span> 
    </list>
`
})

这时候你会发现列表是可以正常显示的,也可以进行更换标签了,你可以试着把<span>标签换成<div>标签来尝试一下。

注意这里的props是子组件传递过来的数据都是对象,所以我们要加上.item才能使用。可以把代码修改一下。

<list v-slot="props">
    <div>{{props.item}}-{{props}}</div> 
</list>

输出结果如下

大脚-{ "item": "大脚" }
刘英-{ "item": "刘英" }
晓红-{ "item": "晓红" }

简化作用域插槽写法

其实简化的方法也非常简单,只要使用解构的形式,这是ES6的一种写法。如果对这部分,不熟悉,可以看看ES6关于解构的语法知识。

const app = Vue.createApp({
    template: `  
        <h2>欢迎光临红浪漫-请选择您的技师</h2>
        <list v-slot="{item}"> 
            <div>{{item}}</div> 
        </list>
        `
})

这种写法虽然简单,但是理解起来还是有些麻烦的。

总结一下:这节课我们主要学习了二个知识,一个是具名插槽的简写方法,第二个是作用域插槽的使用和简写方法。重点是作用域插槽,也正是因为有了作用域插槽,子组件才可以传递自身的数据项让父组件进行使用。

相关文章

  • vue3中的插槽

    插槽 默认插槽 具名插槽,v-slot可以简写为# 动态插槽 #[dynamicSlotName] 作用域插槽(...

  • 【转发】具名插槽简写和作用域插槽

    10. [组件]具名插槽简写和作用域插槽 在父模板中确定插槽位置时,使用了v-slot:one这种方法,其实这个语...

  • 2.插槽

    匿名插槽 具名插槽 作用域插槽

  • vue----slot插槽

    插槽分类 匿名插槽 具名插槽 作用域插槽

  • Vue之深入理解插槽—slot, slot-scope, v-s

    Vue 2.6.0 以前Vue 2.6.0 以后具名插槽 slot具名插槽 v-slot作用域插槽 slot-sc...

  • Vue-使用插槽

    二。具名卡槽 作用域插槽:插槽循环时使用

  • vue中slot插槽的使用

    插槽的种类:1、默认插槽、具名插槽、作用域插槽、解构插槽、动态插槽几种。转原文:https://www.jians...

  • 插槽

    默认插槽: 具名插槽:slot name='footer' 作用域插槽:v-slot===slot-scope 默...

  • vue插槽

    默认插槽(没有名字的插槽) 具名插槽(带名字的插槽) 老版 2.6.0以前 新版 作用域插槽(父组件可以获取子组件...

  • 具名插槽和作用域插槽

    具名插槽 其实就是在父组件中添加一个 slot='自定义名字' 的属性,然后在子组件中的 里面添加 name...

网友评论

      本文标题:【转发】具名插槽简写和作用域插槽

      本文链接:https://www.haomeiwen.com/subject/aowmkrtx.html