首页 > 其他分享 >Vue进阶(幺贰柒):插槽详解

Vue进阶(幺贰柒):插槽详解

时间:2023-06-17 10:32:26浏览次数:46  
标签:slot Vue 进阶 插槽 组件 scope data name

(文章目录)

一、概述

插槽就是子组件中用slot标签定义的预留位置,可以设置name属性,也可以不设置name属性,设置name属性的叫具名插槽,不设置name属性的叫不具名插槽,在父组件中使用子组件时候,可以在使用子组件标签内通过声明插槽名或不声明插槽名的方式往子组件中的具名插槽或者不具名插槽写入html代码。

插槽使用的关键在于:在父组件中使用子组件标签的时候可以往子组件内写入html代码。

二、使用步骤

  1. 子组件中定义插槽;
  2. 父组件使用子组件时往插槽写入代码;

三、何时使用插槽?

简单的举个栗子:有2个组件,父组件father,子组件son。

父组件 father

<template>
    <div>
        <h3>这是父组件</h3>
        <son>实践slot</son>
    </div>
</template>

子组件 son

<template>
    <div>
        <h4>这是子组件</h4>
        <input type="text" placeholder="请输入">
    </div>
</template>

一般我们的组件都会怎么写,但是这么写的话,会发现子组件中的实践slot是显示不出来的。如果需要让他显示出来,这时我们就可以用到插槽slot了。

四、如何使用插槽?

首先,子组件中我们要添加插槽slot

<template>
    <div>
        <h4>这是子组件</h4>
        <input type="text" placeholder="请输入">
        <slot></slot> 
    </div>
</template>

这时,终于出现了slotslot的位置就会出现父组件中实践slot这几个大字。 在这里插入图片描述 可以看到,这里 的slot是没有名称的,顾名思义,这是插槽中的不具名插槽

然后再看看具名插槽,直接上代码。

父组件

<template>
    <div>
        <h3>这是父组件</h3>
        <son>
        	<span>实践slot</span>
        </son>
        <son>
            <template slot="myslot">
                <div>
                    实践具名slot
                </div>
            </template>
        </son>
    </div>
</template>

子组件

<template>
    <div>
        <h4>这是子组件</h4>
        <input type="text" placeholder="请输入">
        <slot></slot>
        <slot name="myslot"></slot>
    </div>
</template>

可以看出,和默认插槽不同的是,在子组件中,我们给插槽一个name属性,这个就是插槽的名称,同时在父组件中,我们在需要将内容插入的地方标签上加了一个slot属性,他的值就是我们的slot 名称name在这里插入图片描述

接下来看下slot-scopeslot-scope是作用域插槽。

官网中有一句特别强调的话:父组件模板的所有内容都会在父级作用域内编译;子组件模板的所有内容都会在子级作用域内编译。简单的说,就是父组件中不能直接用子组件中定义的data数据。而slot-scope的出现就是解决了这样的问题。

父组件

<template lang="">
    <div>
        <h3>这是父组件</h3>
        <son>
            <template slot="myslot" slot-scope="scope">
                <ul>
                    <li v-for="item in scope.data">
                        {{item}}
                    </li>
                </ul>
            </template>
        </son>
    </div>
</template>

子组件

<template>
    <div>
        <h4>这是子组件</h4>
        <input type="text" placeholder="请输入">
        <slot name="myslot" :data='list'></slot>
    </div>
</template>
<script>
export default {
    name:'Son',
    data(){
        return{
            list:[
                {name:"Tom",age:15},
                {name:"Jim",age:25},
                {name:"Tony",age:13}
            ]
        }
    }
}
</script>

在这里插入图片描述 其中,下方三个对象的值,我们本身是在子组件中定义的,按照官方文档中说的,本来父组件中是无法显示出来这些数据的,但是为什么现在显示出来了呢?这就要归功于我们强大的slot-scope了。

首先,在子组件中的插槽上有一句data="list",而在父组件中也有slot-scope="scope"slot-scope就是取data的值,slot-scope的值是自定义的,我们可以取任何名称,但是data的值传过来时是以对象形式传输的,所以在这scope.data才是list的值。

这样我们就可以在父组件中取到子组件的值,并且加以应用了。

五、拓展阅读

vue2.6.0开始,slotslot-scope已经被废弃,推荐使用v-slot;有关两者的用法区别,请移步博文《Vue进阶(幺贰捌):Vue插槽:slot、slot-scope与指令v-slot使用方法区别讲解》。

标签:slot,Vue,进阶,插槽,组件,scope,data,name
From: https://blog.51cto.com/shq5785/6504589

相关文章

  • TienChin 开篇-运行 RuoYiVue
    开篇目的:让大家随心所欲的DIY若依的脚手架不会涉及到太多基础知识踊跃提问(不懂得地方大家提问我会根据提问,后续一一解答疑惑)下载RuoYiVueGitee:https://gitee.com/y_project/RuoYi-Vue下载完毕之后,这个项目当中存在一个ruoyi-ui这个是前端,只是放在了这个项目当中方便我们进......
  • 基于uniapp+vite4+vue3搭建跨端项目|uni-app+uview-plus模板
    最近得空学习了下uniapp结合vue3搭建跨端项目。之前也有使用uniapp开发过几款聊天/仿抖音/后台管理等项目,但都是基于vue2开发。随着vite.js破局出圈,越来越多的项目偏向于vue3开发,就想着uniapp搭配vite4.x构建项目效果会如何?经过一番尝试果然真香~版本信息HBuilderX:3.8.4Vite......
  • [ARM 汇编]进阶篇—存储访问指令—2.3.3 栈操作指令
    栈是一种特殊的数据结构,其特点是后进先出(LIFO,LastInFirstOut)。在ARM汇编中,栈通常用于保存函数调用时的寄存器状态、局部变量和返回地址等。本节将详细介绍ARM汇编中的栈操作指令,并通过实例帮助你更好地理解和掌握这些指令。推入栈(PUSH)PUSH指令用于将一个或多个寄存器......
  • vue链接 sse 接口 实现实施通讯
    sendSSEMessage(){fetch('http://152.xxx.xx.76:xxxxx/api/v1/chat/message/send?prompt=什么是Python&chat_session_id=1',{headers:{token:"abbb78cbbdde1727ac43bd7770497eee6d598310"......
  • java基于springboot+vue的网吧管理系统,附源码+数据库+论文+PPT,适合课程设计、毕业设计
    1、项目介绍随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,网吧管理系统就是信息时代变革中的产物之一。任何系统都要遵循系统设计的基......
  • Vue进阶(幺贰陆):表格复用 TypeError: _self.$scopedSlots.default is not a function解
    (文章目录)一、前言在使用elementUI的el-table组件时,表头应用v-if判断来动态显示,正常来说这样的操作是没有问题的,但是如果在这基础上使用<templateslot-scope="scope">操作的话,表头一旦切换就会报错,错误信息如下:_self.$scopedSlots.defaultisnotafunction二、解决方......
  • vue3:vue+nginx+php进行服务端部署的配置(nginx/1.18.0 / [email protected])
    一,开发环境中的配置:1,前端:vue的vue.config.jsconst{defineConfig}=require('@vue/cli-service')module.exports=defineConfig({transpileDependencies:true,publicPath:process.env.NODE_ENV==="production"?"./":"/&qu......
  • vue-文字转语音
    vueSpeechSynthesisUtterance监听事件onstart开始合成onend合成结束onerror合成错误onpause暂停onresume恢复暂停onboundary在句子或单词边界<template><divclass="language"><!--<divclass="right-lanage">--><imgsrc=&q......
  • vue实现点击按钮一键复制功能
    点击复制按钮后,将内容一键复制下来,不用去选中复制第一种直接使用js方式:<divclass="mask-cont"><p><inputid="input"/></p><buttonclass="btns"@click="copyToClip">复制</button></div>copyToClip()......
  • 【vue】vue全家桶是什么?
    Vue全家桶一般来说包括项目构建工具vue-cli、路由管理器vue-Router、状态管理模式vuex、网络请求库Axios、ui框架、打包工具webpack,下面我们分别介绍。1.项目构建工具:vue-cliVue.js+webpack的项目模板。Vuecli提供了强大的功能,用于定制新项目、配置原型、添加插件和检查webpac......