vue插槽的使用(slot)

插槽

该页面假设你已经阅读过了组件基础。如果你还对组件不太了解,推荐你先阅读它。

插槽内容

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

它允许你像这样合成组件:

<navigation-link url="/profile">
Your Profile
</navigation-link>

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

<a
v-bind:href="url"
class="nav-link"
>
<slot></slot>
</a>

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

<navigation-link url="/profile">
<!-- 添加一个 Font Awesome 图标 -->
<span class="fa fa-user"></span>
Your Profile
</navigation-link>

甚至其它的组件:

<navigation-link url="/profile">
<!-- 添加一个图标的组件 -->
<font-awesome-icon name="user"></font-awesome-icon>
Your Profile
</navigation-link>

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

具名插槽

有些时候我们需要多个插槽。例如,一个假设的 <base-layout> 组件多模板如下:

<div class="container">
<header>
<!-- 我们希望把页头放这里 -->
</header>
<main>
<!-- 我们希望把主要内容放这里 -->
</main>
<footer>
<!-- 我们希望把页脚放这里 -->
</footer>
</div>

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

<div class="container">
<header>
<slot name="header"></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>

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

<base-layout>
<template slot="header">
<h1>Here might be a page title</h1>
</template>

<p>A paragraph for the main content.</p>
<p>And another one.</p>

<template slot="footer">
<p>Here's some contact info</p>
</template>
</base-layout>

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

<base-layout>
<h1 slot="header">Here might be a page title</h1>

<p>A paragraph for the main content.</p>
<p>And another one.</p>

<p slot="footer">Here's some contact info</p>
</base-layout>

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

<div class="container">
<header>
<h1>Here might be a page title</h1>
</header>
<main>
<p>A paragraph for the main content.</p>
<p>And another one.</p>
</main>
<footer>
<p>Here's some contact info</p>
</footer>
</div>

默认插槽的内容

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

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

<button type="submit">
<slot>Submit</slot>
</button>

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

编译作用域

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

<navigation-link url="/profile">
Logged in as {{ user.name }}
</navigation-link>

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

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

作用域插槽

2.1.0+ 新增

有的时候你希望提供的组件带有一个可从子组件获取数据的可复用的插槽。例如一个简单的 <todo-list> 组件的模板可能包含了如下代码:

<ul>
<li
v-for="todo in todos"
v-bind:key="todo.id"
>
{{ todo.text }}
</li>
</ul>

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

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

<ul>
<li
v-for="todo in todos"
v-bind:key="todo.id"
>
<!-- 我们为每个 todo 准备了一个插槽,-->
<!-- 将 `todo` 对象作为一个插槽的 prop 传入。-->
<slot v-bind:todo="todo">
<!-- 回退的内容 -->
{{ todo.text }}
</slot>
</li>
</ul>

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

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

在 2.5.0+,slot-scope 不再限制在 <template> 元素上使用,而可以用在插槽内的任何元素或组件上。

解构 slot-scope

如果一个 JavaScript 表达式在一个函数定义的参数位置有效,那么这个表达式实际上就可以被 slot-scope 接受。也就是说你可以在支持的环境下 (单文件组件或现代浏览器),在这些表达式中使用 ES2015 解构语法。例如:

<todo-list v-bind:todos="todos">
<template slot-scope="{ todo }">
<span v-if="todo.isComplete">✓</span>
{{ todo.text }}
</template>
</todo-list>

这会使作用域插槽变得更干净一些。

转载于:https://www.cnblogs.com/e493825156/p/9034395.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图片与二进制流转换

#region//图片转换为二进制流 public void PictureToBinaryStream() { //获取当前程序运行路径 string path Application.StartupPath; //拼接成测试图片路径 string fullPath path "\\images\\test.png"; //初始化类 Bitmap bmp…

仿MIUI弹性列表

前言 最近去小米之家体验了下小米9&#xff0c;发现MIUI有一个挺特别的列表动画效果&#xff0c;在系统上的各种应用上都能见到它的身影。 网上查了下&#xff0c;小米早在几个系统版本前就有这个&#xff0c;网上也有了实现这个效果的控件库。实现方法大同小异&#xff0c;大多…

10、angular的全部api

1、lowercase var app angular.module(myApp, []);app.controller(myCtrl, function($scope) { console.log(angular.lowercase(AbCdEf))}); 2、uppercase var app angular.module(myApp, []);app.controller(myCtrl, function($scope) { console.log(angular.uppercas…

JavaScript快速入门-ECMAScript本地对象(String)

一、String对象 String对象和python中的字符串一样&#xff0c;也有很多方法&#xff0c;这些方法大概分为以下种类&#xff1a; 1、索引和查找 1、charAt() 返回指定位置的字符。 2、charCodeAt() 返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。 …

8、angular的select

1、数据源为数组 x for x in names第一个x代表在下拉框内显示的数据 第二个x指的是在names里数据 <!DOCTYPE html><html><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0…

ZOJ4116 Game on a Graph

给一个含n个点 m条边的连通图 把k个人分成两组 轮流拿掉一条边 当取走一条边后图不再连通 这个队就输了 水题啦 边为n-1时 下一个拿掉边的那个组就输啦 AC代码&#xff1a; 1 #include<bits/stdc.h>2 using namespace std;3 typedef long long ll;4 typedef unsigned lon…

集美大学1414班软件工程个人作业2——个人作业2:APP案例分析

一、作业链接 个人作业2&#xff1a;APP案例分析 二、博文要求 通过分析你选中的产品&#xff0c;结合阅读《构建之法》&#xff0c;写一篇随笔&#xff0c;包含下述三个环节的所有要求。 第一部分 调研&#xff0c; 评测 下载软件并使用起来&#xff0c;描述最简单直观的个人第…

全局eslint不生效的处理

react项目里能用上 eslint 的 airbnb 规范真是的&#xff0c;对自己的编码有很好的帮助&#xff0c;不经可以养成良好的代码风格&#xff0c;而且还能检测出 state或者变量 是否 使用过&#xff0c; 然而&#xff0c;所在团队的小伙伴们&#xff0c;却并未使用&#xff0c;或者…

IP通信基础

源端口和目的端口字段--各占2字节。端口是传输层与应用层的服务接口。传输层的复用和分用功能都要通过端口才能实现。序号字段--占4字节。TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号转载于:https://www.…

回溯算法 ------回溯算法的几个例子

1.回溯算法的小结 2.回溯算法的几个例子 2.1 ------ 4后问题 搜索空间&#xff1a; 2.2 ------01背包问题 01背包问题的算法设计 01背包问题的实例分析 01背包问题的搜索空间 2.3 ------- 货郎问题 货郎问题实例 货郎问题的搜索空间 最后再来个小结 转载于:https://www.cnb…

Phaserjs V2的state状态解析及技巧

用phaserjs开发了好多游戏了&#xff0c;但是对phaser还是了解不深&#xff0c;只知道怎么去用&#xff0c;今天就特意花点时间研究下phaser的状态管理到底是怎么回事。 首先&#xff0c;new Phaser.Game&#xff0c;以下是Phaser.Game的部分源码&#xff1a; Phaser.Game fun…

JAVA_出神入化学习路线大纲

注&#xff1a;参考GitHub上的项目&#xff08;toBeTopJavaer&#xff09;总结出来 也是自己的目标。 基础篇&#xff1a;https://www.cnblogs.com/blogzcc/p/10899066.html 进阶篇&#xff1a;https://www.cnblogs.com/blogzcc/p/10899841.html 高级篇&#xff1a;https://www…

Ubuntu安装并使用sogou输入法

1.下载搜狗输入法的安装包 下载地址为&#xff1a;http://pinyin.sogou.com/linux/ ,如下图&#xff0c;要选择与自己系统位数一致的安装包&#xff0c;我的系统是64位&#xff0c;所以我下载64位的安装包 2.按键CtrAltT打开终端&#xff0c;输入以下命令切换到下载文件夹: [ht…

面試題之web

1. django和flask框架的区别&#xff1f; django&#xff1a;大而全的全的框架&#xff0c;重武器&#xff1b;内置很多组件&#xff1a;ORM、admin、Form、ModelForm、中间件、信号、缓存、csrf等 flask: 微型框架、可扩展强&#xff0c;如果开发简单程序使用flask比较快速&am…

python 常用镜像

pip镜像https://pypi.tuna.tsinghua.edu.cn/simplehttps://pypi.douban.io.com/simple pip install python-qt -i https://pypi.tuna.tsinghua.edu.cn/simple清华开源软件镜像&#xff1a;&#xff08;anaconda&#xff09;https://mirrors.tuna.tsinghua.edu.cn/https://mirro…

flutter 几秒前, 几分钟前, 几小时前, 几天前...

Show me the code!!! class RelativeDateFormat {static final num ONE_MINUTE 60000;static final num ONE_HOUR 3600000;static final num ONE_DAY 86400000;static final num ONE_WEEK 604800000;static final String ONE_SECOND_AGO "秒前";static final St…

CMake 使用笔记

记录 CMake 相关知识。 Prelude&#xff1a;读文档一定要有耐心&#xff01; 问题一 CLion&#xff1a; CMakeLists.txt 中 set(CMAKE_CXX_FLAGS -Wall) 不起作用 Solution: 改用 target_compile_options(main PUBLIC -Wall) Reference:target_compile_optionsGCC: Options to …

Docker 完全指南

Docker 最初 dotCloud 公司内部的一个业余项目Docker 基于 Go 语言Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案Docker 的基础是 Linux 容器&#xff08;LXC&#xff09;等技术Docker 容器的启动可以在秒级实现&#xff0c;这相比传统的虚拟机方式要快得多Docker 对…

NOIP 2016【蚯蚓】

好吧&#xff0c;我承认我是个智障…… 这道题一眼看上去就是个堆&#xff0c;然而实际上有单调性。 注意到&#xff0c;如果 \(q 0\) 的话&#xff0c;将蚯蚓的左右两边分开丢进两个队列中&#xff0c;则两个队列都是单调不增的&#xff0c;因为每次取出的蚯蚓长度单调不增。…

Ajax异步(客户端测试)

客户端测试&#xff1a;GET方法实现Ajax异步 var request new XMLHttpRequest(); request.open("GET","sever.php?number" document.getElementById("keyword").value); request.send(); request.onreadystatechange function(){ if(request.…