vue中插槽slot的使用

更新日期: 2020-12-25阅读: 1.4k标签: 插槽

一、什么是插槽

官方解释:vue 实现了一套内容分发的 api,将 <slot> 元素作为承载分发内容的出口。

大白话:插槽就是子组件中的提供给父组件使用的一个占位符,用<slot></slot> 表示,父组件可以在这个占位符中填充任何模板代码,如 html、组件等,填充的内容会替换子组件的<slot></slot>标签。


二、基本用法

1、在子组件中放一个占位符

<template>
  <div>
    <div>我是子组件</div>
    <div>
      <slot></slot>
    </div>
  </div>
</template>

2、在父组件中给这个占位符填充内容

<template>
  <div>
    <childTest>
      <p>我就测试一下插槽的</p>
    </childTest>
  </div>
</template>

<script>
import childTest from './ChiledTests'
export default {
  components:{
    childTest
  }
}
</script>


三、具名插槽的使用

描述:具名插槽其实就是给插槽取个名字。一个子组件可以放多个插槽,而且可以放在不同的地方,而父组件填充内容时,可以根据这个名字把内容填充到对应插槽中。

代码如下:

1、子组件代码

<slot> 元素特殊的 attribute:name属性,设置对应的插槽名称

一个不带name属性的<slot>元素的出口实际默认的name值是default

<template>
  <div>
    <div>我是子组件</div>
    <div>
      <slot></slot>
    </div>
    <div>
      <slot name="header"></slot>
    </div>
  </div>
</template>

2、父组件使用

在一个 <template> 元素上使用 v-slot 指令,并以v-slot:[name]的形式提供其名称:

注意:v-slot只能添加在<template> 上 (除非下面第3点中的情况)

template>
  <div>
    <childTest>
      <p>我就测试一下插槽的</p>
      <template v-slot:header><h1>我是标题哦</h1></template>
    </childTest>
  </div>
</template>

<script>
import childTest from './ChiledTests'
export default {
  components:{
    childTest
  }
}
</script>


3、当被提供的内容只有默认插槽时,组件的标签才可以被当作插槽的模板来使用。这样我们就可以把 v-slot 直接用在组件上:

子级:

<template>
  <div>
    <div>我是子组件</div>
      <slot :userObj2="user"></slot>
    </div>
  </div>
</template>

父级:

<template>
  <div>
    <childTest v-slot:default="{ userObj2 }">
      {{userObj2}}
    </childTest>
  </div>
</template>

<script>
import childTest from './ChiledTests'
export default {
  components:{
    childTest
  }
}
</script>

四、作用域插槽

平时用的比较多的可能就是这个;作用域插槽:将只能在子组件访问的数据传递出去,父组件调用子组件时可以通过设置的参数访问到在子组件的数据(个人理解——类似于父子级之间的传值props传值)

1、子组件传递参数——将需要传递出去的数据,通过一个自定义的属性绑定上去v-bind:[data]=”data”

<template>
  <div>
    <div>我是子组件</div>
    <div>
      <slot></slot>
    </div>
    <div>
      <slot name="header"></slot>
    </div>
    <div>
      <slot name="content" :userObj="user"></slot>
    </div>
  </div>
</template>

2、父组件接受传递出来的参数

父组件通过v-slot:[name]=”自定义data参数名”,name为<slot>具名参数的名称,默认为default,这里为了与默认的插槽区分,定义为content

<template>
  <div>
    <childTest>
      <p>我就测试一下插槽的</p>
      <template v-slot:header><h1>我是标题哦</h1></template>
      <template v-slot:content="useDate">
        <p>{{useDate.userObj.name}}</p>
      </template>
    </childTest>
  </div>
</template>

<script>
import childTest from './ChiledTests'

五、解构插槽 Prop

作用域插槽的内部工作原理是将你的插槽内容包裹在一个拥有单个参数的函数里;所以上面例子的父级组件中要获取到name属性——userDate.userObj.name

但是我们也可以通过解构复制来使获取到的数据更为简洁;

<template v-slot:content="{ userObj }">
   <p>{{userObj.name}}</p>
</template>

尤其是在该插槽提供了多个参数 的时候。它同样开启了参数重命名等其它可能,例如将 userObj重命名为personObj:

<template v-slot:content="{ userObj: personObj }">
  <p>{{personObj.name}}</p>
</template>

效果和上面一样。


链接: https://www.fly63.com/article/detial/9986

Vue 技能进阶:使用设计模式写出优雅的前端代码

本文针对 Vue 中如何控制组件子树之外的东西,探讨了四种解决方案,并展示了每种解决方案的优缺点。希望读者能从中受到启发。问你个问题,以前你可能从来没想过:有没有办法从子组件填充父组件插槽?

vue插槽slot和slot-scope

插槽我对他的理解就是父组件的东西插到子组件的<slot></slot>里面,也不知道这样理解对不对,方便自己记忆;作用域插槽我对他的理解就是数据在子组件里面,父组件可以用

一个案例搞懂 Vue.js 的作用域插槽

作用域插槽是 Vue.js 中一个很有用的特性,可以显著提高组件的通用性和可复用性。问题在于,它实在不太好理解。尝试搞清楚父子作用域之间错综复杂的关系,其痛苦程度不亚于求解一个棘手的数学方程。

Vue.js 中的无渲染行为插槽

在本文中我们讨论 Vue 中的无渲染插槽模式能够帮助解决哪些问题。在 Vue.js 2.3.0 中引入的作用域插槽显著提高了组件的可重用性。无渲染组件模式应运而生,解决了提供可重用行为和可插入表示的问题。

vue具名插槽、作用域插槽的新写法

有时让插槽内容能够访问子组件中才有的数据是很有用的。但是由于子组件的作用域在子组件,而父组件的作用域在父组件,这样一来,父组件就访问不到子组件的信息了,但是我们又不想用$emit发送事件去传递信息

深入了解Vue.js的作用域插槽

作用域槽是Vue.js的一个有用特性,它可以使组件更加通用和可重用。唯一的问题是它们很难理解!试着让你的头在父母和孩子的范围内交织,就像解决一个棘手的数学方程。

Vue 2.60 中, 插槽新增的v-slot

注意v-slot只能添加在<template>上(只有一种例外情况),这一点和已经废弃的slotattribute不同。有时让插槽内容能够访问子组件中才有的数据是很有用的。例如,设想一个带有如下模板的<current-user>组件:

如何通过带有Vue插槽的组件传递HTML内容

这篇文章将向您介绍如何使用Vue插槽在Vue.js中将数据从父组件传递到子组件。这篇文章适合所有阶段的开发人员(包括初学者)。

如何使用Vue中的嵌套插槽(包括作用域插槽)

最近我弄清楚了如何递归地实现嵌套插槽,包括如何使用作用域插槽来实现。起因是我想看看是否可以构建一个复制v-for指令但仅使用template组件。

在Vue中,如何从插槽中发出数据

我们知道使用作用域插槽可以将数据传递到插槽中,但是如何从插槽传回来呢?将一个方法传递到我们的插槽中,然后在插槽中调用该方法。 我信无法发出事件

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!