Vue3插槽(slot)使用方法详解

目录
  • 前言-认识slot
  • 一、简单插槽
  • 二、具名插槽
    • 具名插槽扩展-动态插槽名
  • 三、作用域插槽
    • 作用域插槽实例
  • 总结

前言-认识slot

我们经常会有封装组件的需求, 组件需要的往往不只有数据, 有时候我们要给一个模块做内容方面的可自定义, 比如我封装了一个黑板, 但是我有时希望上面是字, 又有时希望上面是图画, 这就要用到插槽了.

感谢你浪费一分钟生命读完了这段废话.

一、简单插槽

就是普通插槽, 也叫默认插槽.

只要你在子组件里写一个< slot></ slot>就可以从父组件向内部填充了.

虽然简单但是不写slot也是不能直接从父组件插内容的.

子组件:

<template>
  <div class="sy-page">
    <slot></slot>
  </div>
</template>

父组件:

<template>
  <sy-turning>BaiX</sy-turning>
</template>

缺点就是不能规定父组件填充内容所指向的插槽, 父组件内填充的所有内容, 会填充到每个子组件内的插槽中:

子组件:

<template>
  <div class="sy-page">
    <slot></slot>
    <a href=""><slot></slot></a>
  </div>
</template>

父组件:

<template>
  <sy-turning>BaiX</sy-turning>
</template>

要解决这个问题 就需要具名插槽了.

二、具名插槽

特点是带有name属性:

<slot name="xxx"></slot>

有时我们会需要在子组件某处写一堆的插槽,又需要在父组件各处分别使用这些插槽.

某些方面计算机是很笨的,它不会看得出哪个插槽该填什么东西,也不知道你在这里填的东西是要给哪个插槽, 你得告诉她该怎么做.

只要有使用多个插槽的需求, 那就用具名插槽吧.

先来看看子组件:

<!--子组件 -->
  <div class="tab-bar-item">
    <slot name="item-icon"></slot>
    <slot name="item-text"></slot>
  <!-- 插槽slot最终会被父组件里传入的html元素替换,
  在插槽上写样式类的东西不会生效,可以用div来包裹slot,
  利用样式继承性来完成样式修改 -->

父组件
< template>来包裹要向插槽里填充的东西, 在template标签的v-slot属性后面写上对应插槽的name值.

v-slot:可以简写为"#"

<!--父组件 -->
  <tab-bar-item>

    <template v-slot:item-icon>
      <div>插槽item-icon内容<img src="#" /></div>
    </template>

    <template #item-text>
      <div>插槽item-text内容</div>
    </template>

  </tab-bar-item>

这样所有在template包裹下的填充内容都会被填入对应的插槽,但如果没有被template包裹呢?

那样就相当于写了个这:

  <template>
  <!--隐含的名字“default”(默认) -->
    <p>我会被填入子组件的每个插槽</p>
  </template>

Vue官方文档: 没有被包裹在带有 v-slot: 的 < template> 中的内容都会被视为默认插槽内容.

具名插槽扩展-动态插槽名

从 2.6.0 开始,可以用方括号括起来的JS表达式作为一个指令(v-bind啥的)的参数,比如在此例中

//随便定义一个方法randomName, 使用这个方法的返回值;
<a v-bind:[randomName]="user"> ... </a>

其实这个东西最常见的是在封装组件时, 我们用computed里的方法返回值来控制:class和:style:

<button
  :class="[theme, isBorder]"
></button>
computed: {
  theme() {
    return this.type ? `sy-button-${this.type}` : "";
  },
  isBorder() {
    return this.border ? "is-border" : "";
  },
}

在2.6版本新增的内容中, 这种用法(动态指令参数)也可以用在具名插槽上定义动态的插槽名, 这其实是具名插槽的扩展用法, 你可以先看看具名插槽.

<base-layout>
  <template v-slot:[动态指令参数]>
    动态决定插入哪个插槽
  </template>
</base-layout>

三、作用域插槽

父组件内需要访问子组件中的数据以正常工作, 可以作用域插槽.

作用域插槽的渲染是在子组件完成, 所以我们也需要子组件的数据.

在子组件的slot上利用v-bind / v-for之类绑定上父组件需要的各种数据, 渲染时就可以从子组件拿数据来渲染.

绑定在 < slot> 上的属性被Vue官方称为"slotProps"(这并不重要);

子组件:

<span class="current-user">
  <slot :user="data.user"></slot>
</span>

<!-- 或者 -->
<span v-for="item in data.someThing" :key="item">
  <slot :num="item.num" :awsl="item.id"></slot>
</span>

在父组件内使用v-slot属性接收子组件数据;

父组件

<current-user>
  <template v-slot="{ user, name }">
  <!--其实这里写的参数是什么真的无所谓, 比如我子组件传出item,
   父组件要接收item.id, 写v-slot="awsl.id"接收也可以-->
  </template>
</current-user>
<!--或者 -->
<current-user>
  <template v-slot="num"> <!-- 只传一个时不要加大括号. -->
  </template>
</current-user>

作用域插槽会被解析为一个传入了slotProps作参的函数:

function (slotProps) {
  // 插槽内容
}

所以, 父组件中v-slot: 的值实际上可以是任何 [能作为函数的参数来传入] 的东西;

作用域插槽实例

我现在二次封装一个el-tabs, 实现传入数据数组自动生成:

子组件:

<div class="sy_tabs">
  <el-tabs>
    <el-tab-pane
      v-for="item in sy_tab_data"
      :key="item"
      :label="item.label"
      :name="item.name"
    >
      <slot :item="item"></slot>  <!--然后我们直接在这里吧item传出去,传作"item"
    </el-tab-pane>
  </el-tabs>
</div>
//我想了一下还是不要用props接收了, 我们直接把标签页数据写死吧...
export default {
  setup() {
    const sy_tab_data =  [
        { label: "推荐", name: "first", id: 0 },
        { label: "热门", name: "second", id: 1 },
        { label: "关注", name: "third", id: 2 },
      ],
  }
}

这样我们有三个标签页了:

父组件:

为了根据不同标签页显示不同的内容, 这里我们要拿到tab标签页的id, 来决定 “在id为几的标签页显示article_content的哪个子数组”

<sy-tabs>
  <template v-slot="slotProps">
  <!--然后你可以看到, 我们在这里用slotProps来接收item,
    没有任何问题, 也能拿到里面的id属性(见下); -->
    <ul>
      <li
        v-for="i in data.article_content[slotProps.item.id]"
        :key="i"
       >
       <!--这样把article_content的序号和tab的序号对应起来,
         实现第2页显示第2个数组, 第3页显示第3个数组 -->
      </li>
    </ul>
  </template>
</sy-tabs>
let data = reactive({
  article_content: [
    [xxx, xxx], //详细数据略
    [xxx, xxx],
    [xxx, xxx],
  ]
})

就可以正常呈现了:

总结

注意 v-slot 只能添加在 < template> 上, 不然会标红;

我为什么要把这些玩意儿写在插槽里, 这么麻烦为什么不直接写那些标签?
是,我一开始也在问我自己, 为什么不直接写标签而要写插槽.

(现在是22年4月22, 我刚做完我的个人网站, 回来说一句, 不封装实在是——太乱了代码很多,就算复制粘贴下来到别处还要改属性改参数改样式,主要是还要改样式,老天!做了三个页面我就开始封装了。)

到此这篇关于Vue3插槽(slot)使用方法的文章就介绍到这了,更多相关Vue3插槽使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Vue3中插槽(slot)用法汇总(推荐)

    目录 什么是插槽 默认内容 具名插槽 动态插槽名 作用域插槽 作用域插槽 具名作用域插槽 写在最后 Vue中的插槽相信使用过Vue的小伙伴或多或少的都用过,但是你是否了解它全部用法呢?本篇文章就为大家带来Vue3中插槽的全部用法来帮助大家查漏补缺. 什么是插槽 简单来说就是子组件中的提供给父组件使用的一个 坑位 ,用 <slot></slot> 表示,父组件可以在这个坑位中填充任何模板代码然后子组件中 <slot></slot> 就会被替换成这些内容.比如一

  • Vue3父子通讯方式及Vue3插槽的使用方法详解

    在Vue3中父子通讯方式 Vue3父传子(props) 父组件如下: <template> <div class="about"> <h1>This is an about page</h1> <children :num="num" age="30"></children> </div> </template> <script> impo

  • Vue中插槽Slot基本使用与具名插槽详解

    目录 一.插槽Slot 1.1.插槽Slot的作用 1.2.具名插槽Slot Ps:作用域插槽 总结 一.插槽Slot 1.1.插槽Slot的作用 初识插槽: 为了让这个组件具备更强的通用性,我们不能将组件中的内容限制为固定的div.span等等这些元素: 比如某种情况下我们使用组件,希望组件显示的是一个按钮,某种情况下我们使用组件希望显示的是一张图片: 我们应该让使用者可以决定某一块区域到底存放什么内容和元素: 所以就可以使用插槽来解决这个问题 换句话说就是,我们要是想在一个组件标签中添加新的

  • Vue3中插槽(slot)的全部使用方法

    目录 什么是插槽 默认内容 具名插槽 动态插槽名 作用域插槽 作用域插槽 具名作用域插槽 写在最后 Vue中的插槽相信使用过Vue的小伙伴或多或少的都用过,但是它的所有用法你是否全部理解呢?本篇文章就为大家带来Vue3中插槽的全部用法来帮助大家查漏补缺. 什么是插槽 简单来说就是子组件中的提供给父组件使用的一个坑位,用<slot></slot> 表示,父组件可以在这个坑位中填充任何模板代码. 比如一个最简单插槽例子: //父组件 <template> <div&g

  • Vue中slot插槽作用与原理详解

    目录 1.作用 2.插槽内心 2.1.默认插槽 2.2.具名插槽(命名插槽) 2.3.作用域插槽 实现原理 1.作用 父组件向子组件传递内容 扩展.复用.定制组件 2.插槽内心 2.1.默认插槽 把父组件中的数组,显示在子组件中,子组件通过一个slot插槽标签显示父组件中的数据. 子组件 <template> <div class="slotChild"> <h4>{{msg}}</h4> <slot>这是子组件插槽默认的值&

  • Vue插槽slot全部使用方法示例解析

    目录 何为插槽 示例解析 插槽的基本使用 具名插槽 作用域插槽 总结 何为插槽 我们都知道在父子组件间可以通过v-bind,v-model搭配props 的方式传递值,但是我们传递的值都是以一些数字,字符串为主,但是假如我们要传递一个div或者其他的dom元素甚至是组件,那v-bind和v-model搭配props的方式就行不通了,但是插槽(slot)可以,插槽可以传递dom元素,在子组件中通过接收使用父组件传递过来的dom元素,我的理解就是在定义一个组件时,有些dom是动态显示的,即子组件现在

  • Vue3插槽Slot实现原理详解

    目录 Vue官方对插槽的定义 Slot到底是什么 如何使用插槽 回顾组件渲染的原理 插槽的初始化原理 解析插槽中的内容 作用域插槽原理 具名插槽原理 默认内容插槽的原理 Vue官方对插槽的定义 Vue 实现了一套内容分发的 API,这套 API 的设计灵感源自 Web Components 规范草案,将 <slot> 元素作为承载分发内容的出口. Slot到底是什么 那么Slot到底是什么呢?Slot其实是一个接受父组件传过来的插槽内容,然后生成VNode并返回的函数. 我们一般是使用 <

  • Vue3生命周期函数和方法详解

     1. 概述 所谓生命周期函数,就是在某一条件下被自动触发的函数. 2. VUE3 生命周期函数介绍 2.1 beforeCreate 在 VUE 实例生成之前会自动执行的函数 2.2 created 在 VUE 实例生成之后会自动执行的函数 2.3 beforeMount 在组件内容被渲染到页面之前自动执行的函数 2.4 mounted 在组件内容被渲染到页面之后自动执行的函数 2.5 beforeUpdate 当data中的数据发生变化前执行的函数 2.6 updated 当data中的数据

  • vue3使用vue-i18n的方法详解(ts中使用$t, vue3不用this)

    vue项目里多语言工具一直用的vue-i18n. 以前用的 vue2,也没啥大问题,就是配置好之后用t(“你的属性名”)就行,现在用vue3其实本来也没太大变化. 但是配置完之后,在html中用$t()没有问题,显示文案什么的一切正常.而在ts中使用$t()方法报错,后来才发现是我没有设置全局的$t()方法. 记录一下在vue3中使用vue-i18n的方法: 安装vue-18n 配置 应用 挂载全局方法$t以方便在ts中使用(本次记录的重点) 由于1.2.3.好多人写过了,我就简单的写一下,本次

  • Vue3内置组件Teleport使用方法详解

    目录 1.Teleport用法 2.完成模态对话框组件 3.组件的渲染 前言: Vue 3.0 新增了一个内置组件 teleport ,主要是为了解决以下场景: 有时组件模板的一部分逻辑上属于该组件,而从技术角度来看,最好将模板的这一部分移动到 DOM 中 Vue app 之外的其他位置 场景举例:一个 Button ,点击后呼出模态对话框 这个模态对话框的业务逻辑位置肯定是属于这个 Button ,但是按照 DOM 结构来看,模态对话框的实际位置应该在整个应用的中间 这样就有了一个问题:组件的

  • Vue3中使用Supabase Auth方法详解

    目录 引言 安装Supabase 设置Supabase 创建一个AuthUser组合 创建页面 注册.vue EmailConfirmation.vue 登录.vu ForgotPassword.vue Me.vue login() loginWithSocialProvider() logout() isLoggedIn() register() update() sendPasswordResetEmail() 观察Auth状态的变化 测试东西 注销 家庭作业 总结 引言 Supabase是

  • 利用Vue3实现可复制表格的方法详解

    目录 前言 最基础的表格封装 实现复制功能 处理表格中的不可复制元素 测试 前言 表格是前端非常常用的一个控件,但是每次都使用v-for指令手动绘制tr/th/td这些元素是非常麻烦的.同时,基础的 table 样式通常也是不满足需求的,因此一个好的表格封装就显得比较重要了. 最基础的表格封装 最基础基础的表格封装所要做的事情就是让用户只关注行和列的数据,而不需要关注 DOM 结构是怎样的,我们可以参考 AntDesign,columns dataSource 这两个属性是必不可少的,代码如下:

  • 何时/使用 Vue3 render 函数的教程详解

    什么是 DOM? 如果我们把这个 HTML 加载到浏览器中,浏览器创建这些节点,用来显示网页.所以这个HTML映射到一系列DOM节点,然后我们可以使用JavaScript进行操作.例如: let item = document.getElementByTagName('h1')[0] item.textContent = "New Heading" VDOM 网页可以有很多DOM节点,这意味着DOM树可以有数千个节点.这就是为什么我们有像Vue这样的框架,帮我们干这些重活儿,并进行大量

  • vue2.x中h函数(createElement)与vue3中的h函数详解

    目录 1. vue2.x的 h 函数(createElement) 2. vue3 h函数配置项 2.1 v-model实现(以下开始为官网实现) 2.2 v-on 2.3 事件修饰符 2.4 插槽 2.5 component 和 is 2.6 自定义指令 2.7 内置组件 2.8 渲染函数的返回值 2.9 JSX 总结 1. vue2.x的 h 函数(createElement) 使用方法及介绍:(参考官网提取) h函数第一个是标签名字 或者是组件名字,第二个参数是配置项,第三个参数是 inn

随机推荐