Vue插槽

插槽内容

Vue实现一套内容分发的API, 这套API基于当前的web组件规范草案,将<slot>元素作为承载分发内容的出口。


&lt;navigation-link url="/profile"&gt;
    Your Profile
&lt;/navigation-link&gt;

然后在<navigation-link>的模板中可能会写为:


&lt;a :href="url" class="nav-link"&gt;
    &lt;slot&gt;&lt;/slot&gt;
&lt;/a&gt;

当组件渲染的时候,这个<slot>元素将会被"Yourt Profile"替换。插槽可以包括任何模板代码,包括HTML:


&lt;navigation-link url="/profile"&gt;
    &lt;span class="fa fa-user"&gt;&lt;/span&gt;
    Your Profile
&lt;/navigation-link&gt;

甚至其他的组件:


&lt;navigation-link url="/profile"&gt;
    &lt;font-awesome-icon name="user"&gt;&lt;/font-awesome-icon&gt;
    Your Profile
&lt;/navigation-link&gt;

如果<navigation-link>没有包含一个<slot>元素,则任何传入它的内容都会被抛弃。

具名插槽

有些时候我们需要多个插槽,例如:


&lt;div&gt;
    &lt;header&gt;我们希望把页头放这里&lt;/header&gt;
    &lt;main&gt;我们希望把主要内容放这里&lt;/main&gt;
    &lt;footer&gt;我们希望把页脚放这里&lt;/footer&gt;
&lt;/div&gt;

对于这种情况,<slot>元素有一个特殊的特性:name。这个特性可以用来定义额外的插槽:


&lt;div class="container"&gt;
    &lt;header&gt;
        &lt;slot name="header"&gt;&lt;/slot&gt;
    &lt;/header&gt;
    &lt;main&gt;
        &lt;slot&gt;&lt;/slot&gt;
    &lt;/main&gt;
    &lt;footer&gt;
        &lt;slot name="footer"&gt;&lt;/slot&gt;
    &lt;/footer&gt;
&lt;/div&gt;

在向具名插槽提供内容的时候,我们可以在一个父组件的<template>元素上使用slot特性:


&lt;base-layout&gt;
    &lt;template slot="header"&gt;
        &lt;h1&gt;Here might be a page title&lt;/h1&gt;
    &lt;/template&gt;
    &lt;p&gt;A paragraph for the main content&lt;/p&gt;
    &lt;p&gt;And another one&lt;/p&gt;
    &lt;template slot="footer"&gt;
        &lt;p&gt;here is some contact info&lt;/p&gt;
    &lt;/template&gt;
&lt;/base-layout&gt;

另一种slot特性的用法是直接用在一个普通元素上:


&lt;base-layout&gt;
    &lt;h1 slot="header"&gt;Here might be a page title&lt;/h1&gt;

    &lt;p&gt;A paragraph for the main content&lt;/p&gt;
    &lt;p&gt;And another one&lt;/p&gt;

    &lt;p slot="footer"&gt;Here is some contact info&lt;/p&gt;
&lt;/base-layout&gt;

我们还是可以保留一个未命名插槽,这个插槽是默认插槽,也就是说它会作为所有未匹配到插槽的内容的统一出口,上述两个示例渲染出来的HTML都将会是:


&lt;div class="container"&gt;
  &lt;header&gt;
    &lt;h1&gt;Here might be a page title&lt;/h1&gt;
  &lt;/header&gt;
  &lt;main&gt;
    &lt;p&gt;A paragraph for the main content.&lt;/p&gt;
    &lt;p&gt;And another one.&lt;/p&gt;
  &lt;/main&gt;
  &lt;footer&gt;
    &lt;p&gt;Here‘s some contact info&lt;/p&gt;
  &lt;/footer&gt;
&lt;/div&gt;

插槽的默认内容

有的时候为插槽提供默认内容是很有用的。例如,一个<submit-button>组件可能希望这个按钮的默认内容是"Submit",但是同时允许用户覆盖"Save","Upload"或者别的内容。

你可以在组件模板里的<slot>标签内部指定默认的内容来做到这一点。


&lt;button type="submit"&gt;
    &lt;slot&gt;Submit&lt;/slot&gt;
&lt;/button&gt;

如果父组件为这个插槽提供内容,则默认内容会被替换。

编译作用域

当你想在插槽内使用数据时,例如:


&lt;navigation-link url="/profile"&gt;
    Logged in as {{ user.name }}
&lt;/navigation-link&gt;

该插槽可以访问跟这个模板的其他地方相同的实例属性(也就是说作用域相同)。但这个插槽不能访问<navigation-link>的作用域。例如尝试访问URL是不会工作的。牢记:


&gt;**父组件模板的所有东西都会在父级作用域内编译;子组件的模板的所有东西都会在子级作用域内编译。**

作用域插槽

有时候你希望提供的组件带有一个可从子组件获取数据的可复用的插槽:


&lt;ul&gt;
    &lt;li v-for="todo in todos" v-bind="todo.id"&gt;
        {{ todo.text }}
    &lt;/li&gt;
&lt;/ul&gt;

但是在我们应用的某些部分,我们希望每个独立的代办项渲染出和todo.text不太一样的东西。这也是作用域插槽的用武之地。

为了让这个特性成为可能,你需要做的全部事情就是将代办项内容包裹在一个<slot>元素上,然后将所有和其上下文有关的数据传递给这个插槽:在这个例子中,这个数据是todo对象:


&lt;ul&gt;
    &lt;li v-for="todo in todos" :key="todo.id"&gt;
        &lt;slot :todo="todo"&gt;{{ todo.text }}&lt;/slot&gt;
    &lt;/li&gt;
&lt;/ul&gt;

现在当我们使用<todo-list>组件的适合,我们可以选择为代码项定义一个不一样的<template>作为替代方案,并且可以通过slot-scope特性从子组件获取数据:


&lt;todo-list :todos="todos"&gt;
    &lt;!-- 将 `slotProps` 定义为插槽作用域的名字 --&gt;
    &lt;template slot-scope="slotProps"&gt;
        &lt;!-- 为待办项自定义一个模板,--&gt;
        &lt;!-- 通过 `slotProps` 定制每个待办项。--&gt;
        &lt;span v-if="slotProps.todo.is"&gt;good&lt;/span&gt;
        {{ slotProps.todo.text }}
    &lt;/template&gt;
&lt;/todo-list&gt;

解构 slot-scope
如果一个JavaScript表达式在一个函数定义的参数位置有效,那么这个表达式实际上就可以被slot-scope接受。也就是说你可以在支持的环境下,在这些表达式中使用ES2015解构语法。


&lt;todo-list :todos="todos"&gt;
    &lt;template slot-scope="{ todo }"&gt;
    &lt;span v-if="todo.isComplete"&gt;?&lt;/span&gt;
    {{ todo.text }}
  &lt;/template&gt;
&lt;/todo-list&gt;

来源:https://segmentfault.com/a/1190000016886400

原文地址:https://www.cnblogs.com/lovellll/p/10126095.html

时间: 2024-08-30 18:03:24

Vue插槽的相关文章

Vue插槽、ref和$refs用法

1.vue插槽 1.插槽的作用:以局部组件为例 插槽就是Vue实现的一套内容分发的API,将<slot></slot>元素作为承载分发内容的出口.插槽内可以是任意内容. (1)不带插槽的情况: <div id="app"> <vue> <h2>我是里面的内容</h2></vue> </div> <script> var Child = { template: '<div&g

vue 插槽slot

本文是对官网内容的整理 https://cn.vuejs.org/v2/guide/components.html#编译作用域 在使用组件时,我们常常要像这样组合它们: <app> <app-header></app-header> <app-footer></app-footer> </app> 注意两点: <app> 组件不知道它会收到什么内容.这是由使用 <app> 的父组件决定的. <app>

vue 插槽理解

插槽,顾名思义留一个坑在组件中,然后动态的去填坑,例如: //Child.vue 子组件 <template> <div> <slot></slot> </div> </template> <script> </script> <style lang=""> </style> //Parent.vue 引入子组件的文件 <template> <div

vue插槽slot的理解与使用

一.个人理解及插槽的使用场景 刚开始看教程我的疑惑是为什么要用插槽,它的使用场景是什么,很多解释都是“父组件向子组件传递dom时会用到插槽”,这并不能很好的解决我的疑惑.既然你用了子组件,你为什么要给她传一些dom,直接去定义复用的子组件不就好了.后来想想觉得一个复用的组件在不同的地方只有些许变化,如果去重写子组件是很不明智的一件事,当然也可以将不同之处都写在子组件里,然后通过父组件传来的标识进行选择显示.其实质是对子组件的扩展,通过slot插槽向组件内部指定位置传递内容,即将<slot>&l

Vue插槽详解 | 什么是插槽?

作者 | Jeskson 来源 | 达达前端小酒馆 什么是插槽?插槽的指令为v-slot,它目前取代了slot和slot-scope,插槽内容,vue实例一套内容分发的api,将slot元素作为承载分发内容的出口. 组件的书写: <my-link url="/profile"> dada </my-link> 运用组件模板,可以在里面书写: <a v-bind:href="url" class="css-link"&

vue插槽嵌套

插槽嵌套的关键是父组件插槽的slot=子组件插槽的名称 子组件 slotTest1.vue <template> <div> <slot name='slot1'></slot> </div> </template> slotTest2.vue <template> <slot-test1> <slot name='slot2' slot='slot1' record='我是插槽2'> </s

vue插槽,也就是子页面、父页面相互传值的另一写法

父页面: <template> <div class="parent"> <p>父组件</p> <child> <div slot='s1'> <p >插槽1</p> <p >插槽101</p> </div> <p slot='s2'>插槽2</p> <p slot-scope='props' slot='s3'> {{

VUE 插槽

插槽就是在组件标签内 预留位置 例如: <component>ddd</component> 默认情况下内部的内容会被忽略,  在组件模板中加入 插槽 <slot></slot> ddd 就不会被忽略 slot 上可以 v-bind 绑定变量,传递到父组件上 原文地址:https://www.cnblogs.com/chillaxyw/p/10447867.html

2.6.0版vue 插槽文档小结

<slot>插槽  一般使用组件时 在标签内填写的内容是不被编译的,当想要在父级使用组件时能填写内容则需要在定义组件时添加<slot></slot>标签,在插槽内可以给上默认内容,当父级调用时没有给内容时也就有了默认的值 一个不带 name 的 <slot> 出口会带有隐含的名字"default". 具名插槽 在需要多个插槽的模板中,为了区分插槽,使用name属性,然后在父级使用组件时用v-slot:header区分要为哪个插槽添加内容,