vue.js的<slot>
使用插槽分发内容
在封装vue组件的时候,很多时候就不得不使用到vue的一个内置组件<slot>。slot是插槽的意思,顾名思义,这个<slot>组件的意义是预留一个区域,让其中的DOM结构可以由调用它的组件来渲染。
假设现在有一个people组件,结构如下:
<template>
<div>
<strong class="tip">*填写的内容必须真实</strong>
<label>姓名</label><input type="text" name="name">
<label>性别</label><input type="text" name="sex">
<button>确定</button>
</div>
</template>
当我们注册这个组件之后,就可以在其他组件中这样子使用
<template>
<div>
<h3>用户信息</h3>
<people>
</people>
</div>
</template>
我们都很清楚上面的代码最后渲染的样子。
<div>
<h3>用户信息</h3>
<div>
<strong class="tip">*填写的内容必须真实</strong>
<label>姓名</label><input type="text" name="name">
<label>性别</label><input type="text" name="sex">
<button>确定</button>
</div>
</div>
一般来说我们这样子封装<people>组件是没有问题的了。但是有时候我们在开发中,需要的组件还需要更抽象一点。我们试想以下,假设我们的<people>组件的功能是获取用户的信息,点击确定上传到服务器。如果是按照上面的方式封装这个<people>组件,那么我们每次调用这个组件就只能让用户输入姓名和性别。假设在另外的场景中,我们还需要用户输入多一项年龄信息,那我们的这个<people>组件就不能使用了,就还得需要另外一个一个组件。<people2>。而事实上这个<people2>的组件功能逻辑完全和<people>一样,只是多了一项年龄信息。在这种情况下,就相当于再写了一个重复的组件。那有没有办法可以让我们的<people>组件可以更通用点。这时候摆在我们面前的问题就是,能不能在调用<people>的时候,可以指定<people>组件应该怎么渲染?<slot>组件就是为了解决这种问题而存在的。
我们改变一下<people>的封装方式:
<template>
<div>
<strong class="tip">*填写的内容必须真实</strong>
<slot>如果调用我的组件没有传入内容,那么就渲染<slot>里面的内容。</slot>
</div>
</template>
我们在需要由父组件来渲染的部分使用<slot>插槽,相当于占位。这样我们就可以在调用的时候,再指定这个<people>组件里面有什么内容:
<template>
<div>
<h3>用户信息</h3>
<people>
<label>姓名</label><input type="text" name="name">
<label>性别</label><input type="text" name="sex">
<button>确定</button>
</people>
</div>
</template>
渲染之后是:
<div>
<h3>用户信息</h3>
<div>
<strong class="tip">*填写的内容必须真实</strong>
<label>姓名</label><input type="text" name="name">
<label>性别</label><input type="text" name="sex">
<button>确定</button>
</div>
</div>
这样子我们的<people>组件就更为通用了。并且当调用<people>的组件没有指定内容的时候,<peopel>组件里的<slot></slot>内容会渲染。如下图。这也是vue.js<slot>插槽最基本的用法。
匿名插槽和具名插槽
除非子组件模板包含至少一个 <slot> 插口,否则父组件的内容将会被丢弃。当子组件模板只有一个没有属性的插槽(匿名插槽)时,父组件传入的整个内容片段将插入到插槽所在的 DOM 位置,并替换掉插槽标签本身。
可以通过为<slot>插槽指定name(具名插槽)来指定渲染一个组件中多个插槽中的某一个。
<div>
<slot name="slot1"></slot>
<slot name="slot2"></slot>
</div>
调用
<people>
<div slot="slot1">slot1的内容</div>
<div slot="slot2">slot2的内容</div>
</people>
渲染的结果:
<div>
<div >slot1的内容</div>
<div >slot2的内容</div>
</div>
作用域插槽
这种特殊的插槽可以暴露子组件中的内容,把数据交由父组件来渲染。看下面的例子:
子组件<child> 的模板
<template>
<div>
<slot tip='子组件内部的tip'></slot>
</div>
</template>
父组件中调用:
<div>
<child>
<template slot-scope='props'>
<!--在这里可以使用child组件暴露在slot中的数据-->
<p>{{props.tip}}</p>
</template>
</child>
</div>
渲染的结果为:
<div>
<div>
<p>子组件内部的tip</p>
</div>
</div>
原文地址:https://segmentfault.com/a/1190000012836208
vue.js的<slot>的更多相关文章
- vue.js 中slot 用处大(转载)
什么是组件? 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有 ...
- 关于vue.js中slot的理解
slot这块看官网文档,起初有点不懂,仔细研究还是最终理解了,slot是用来干嘛的呢,先看下一个例子: <script src="https://unpkg.com/vue/dist/ ...
- vue.js单个slot
刚开始看这个slot的时候有点蒙,想了几分钟才明白过来,汗颜 <script> var mycompoent = Vue.extend({ template:"<div&g ...
- Vue.js插槽slot和作用域插槽slot-scope学习小结
一般来说,在Vue项目中使用父子组建时,都是把通用的HTML结构提取出来写成一个子组件,需要动态展示的数据用过prop属性传递,不过有时候我们可能想给子组件传递一个HTML代码,这个时候用prop不太 ...
- vue.js之数据传递和数据分发slot
一.组件间的数据传递 1.父组件获取子组件的数据 *子组件把自己的数据,发送到父级 *vm.$emit(事件名,数据); *v-on: @ 示例用法:当点击send按钮的时候,"111&qu ...
- vue.js中的slot
vue.js 中的 slot 一.slot 的作用 调用组件的时候,对于数据,我们会用props将数据从父组件传至子组件.但是,如果从父组件到子组件,单纯是页面局部渲染的改变,slot会更合适. 二. ...
- Vue.js 组件的三个 API:prop、event、slot
组件的构成 一个再复杂的组件,都是由三部分组成的:prop.event.slot,它们构成了 Vue.js 组件的 API.如果你开发的是一个通用组件,那一定要事先设计好这三部分,因为组件一旦发布,后 ...
- Vue.js 作用域、slot用法(单个slot、具名slot)
作用域 在介绍slot前,需要先知道一个概念:编译的作用域.比如父组件中有如下模板: <child-component> {{message}} <child-component&g ...
- Vue.js——vue-resource全攻略
概述 上一篇我们介绍了如何将$.ajax和Vue.js结合在一起使用,并实现了一个简单的跨域CURD示例.Vue.js是数据驱动的,这使得我们并不需要直接操作DOM,如果我们不需要使用jQuery的D ...
随机推荐
- git diff详解
这篇文章很好很好 https://www.cnblogs.com/alfayed/p/4682780.html
- Git 合并流程
首先把自己的代码提交到自己的分支 再把master[主分支]的代码拉下来更新 解决冲突 推送至自己的分支 请求合并到master[主分支]
- 启用Maven的代理访问
1. Maven配置文件 找到文件 {M2_HOME}/conf/settings.xml, 并把你的代理服务器信息配置写入.注:{M2_HOME} => D:\software\yiibai. ...
- vivo输入法 需求分析
我使用的输入法:vivo输入法 1,用户界面:界面为白色和灰色,整体简洁大方,个人而言外观挺不错.但是不能自定义界面,更改背景图片或是主题. 2,记住用户选择:可记忆上次使用后的键盘方式(26键或是9 ...
- php 中引入邮箱服务 , 利用第三方的smtp邮件服务
项目中用短信通知有时间限制,对一些频率比较大的信息力不从心. 使用邮箱发送信息是个不错的选择\(^o^)/! 首先要注册一个邮箱,在邮箱设置里开通smtp功能. 简单介绍下smtp,大概就是第三方客户 ...
- C#-单元测试知识点
指的是软件中对最小单元进行测试的一种测试方法 开发阶段的测试发现问题并解决问题是最节省时间和成本 Ctrl+R Ctrl+A 自动化执行单元测试 查看代码覆盖率,通常要达到80,90%的代码测试覆盖率 ...
- php学习之道:php empty()和isset()的差别
在使用 php 编写页面程序时,我常常使用变量处理函数推断 php 页面尾部參数的某个变量值是否为空,開始的时候我习惯了使用 empty() 函数,却发现了一些问题,因此改用 isset() 函数,问 ...
- Accessibility辅助控制类
熟悉Android开发的都知道辅助功能服务 Accessibility service.他的作用有非常多.360豌豆荚等应用市场的非root自己主动安装.微信抢红包插件.盲人辅助程序等等功能都是靠它实 ...
- atitit。流程图的设计与制作 attilax 总结
atitit.流程图的设计与制作 attilax 总结 1. 流程图的规范1 2. 画图语言2 2.1. atitit.CSDN-markdown编辑器2 2.2. js-sequence-diagr ...
- (六)api网关服务 zuul-过滤器
开启上文服务: Zuul给我们的第一印象通常是这样:它包含了对请求的路由和过滤两个功能,其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础.过滤器功能则负责对请求的处理过 ...