使用插槽分发内容
在封装vue组件的时候,很多时候就不得不使用到vue的一个内置组件<slot>。slot是插槽的意思,顾名思义,这个<slot>组件的意义是预留一个区域,让其中的DOM结构可以由调用它的组件来渲染。


假设现在有一个people组件,结构如下:

&lt;template&gt;
&lt;div&gt;
&lt;strong class="tip"&gt;*填写的内容必须真实&lt;/strong&gt;
&lt;label&gt;姓名&lt;/label&gt;&lt;input type="text" name="name"&gt;
&lt;label&gt;性别&lt;/label&gt;&lt;input type="text" name="sex"&gt;
&lt;button&gt;确定&lt;/button&gt;
&lt;/div&gt;
&lt;/template&gt;

当我们注册这个组件之后,就可以在其他组件中这样子使用

&lt;template&gt;
&lt;div&gt;
&lt;h3&gt;用户信息&lt;/h3&gt;
&lt;people&gt;
&lt;/people&gt;
&lt;/div&gt;
&lt;/template&gt;

我们都很清楚上面的代码最后渲染的样子。

&lt;div&gt;
&lt;h3&gt;用户信息&lt;/h3&gt;
&lt;div&gt;
&lt;strong class="tip"&gt;*填写的内容必须真实&lt;/strong&gt;
&lt;label&gt;姓名&lt;/label&gt;&lt;input type="text" name="name"&gt;
&lt;label&gt;性别&lt;/label&gt;&lt;input type="text" name="sex"&gt;
&lt;button&gt;确定&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;

一般来说我们这样子封装<people>组件是没有问题的了。但是有时候我们在开发中,需要的组件还需要更抽象一点。我们试想以下,假设我们的<people>组件的功能是获取用户的信息,点击确定上传到服务器。如果是按照上面的方式封装这个<people>组件,那么我们每次调用这个组件就只能让用户输入姓名和性别。假设在另外的场景中,我们还需要用户输入多一项年龄信息,那我们的这个<people>组件就不能使用了,就还得需要另外一个一个组件。<people2>。而事实上这个<people2>的组件功能逻辑完全和<people>一样,只是多了一项年龄信息。在这种情况下,就相当于再写了一个重复的组件。那有没有办法可以让我们的<people>组件可以更通用点。这时候摆在我们面前的问题就是,能不能在调用<people>的时候,可以指定<people>组件应该怎么渲染?<slot>组件就是为了解决这种问题而存在的。


我们改变一下&lt;people&gt;的封装方式:

&lt;template&gt;
&lt;div&gt;
&lt;strong class="tip"&gt;*填写的内容必须真实&lt;/strong&gt;
&lt;slot&gt;如果调用我的组件没有传入内容,那么就渲染&lt;slot&gt;里面的内容。&lt;/slot&gt;
&lt;/div&gt;
&lt;/template&gt;

我们在需要由父组件来渲染的部分使用&lt;slot&gt;插槽,相当于占位。这样我们就可以在调用的时候,再指定这个&lt;people&gt;组件里面有什么内容:

&lt;template&gt;
&lt;div&gt;
&lt;h3&gt;用户信息&lt;/h3&gt;
&lt;people&gt;
&lt;label&gt;姓名&lt;/label&gt;&lt;input type="text" name="name"&gt;
&lt;label&gt;性别&lt;/label&gt;&lt;input type="text" name="sex"&gt;
&lt;button&gt;确定&lt;/button&gt;
&lt;/people&gt;
&lt;/div&gt;
&lt;/template&gt; 渲染之后是: &lt;div&gt;
&lt;h3&gt;用户信息&lt;/h3&gt;
&lt;div&gt;
&lt;strong class="tip"&gt;*填写的内容必须真实&lt;/strong&gt;
&lt;label&gt;姓名&lt;/label&gt;&lt;input type="text" name="name"&gt;
&lt;label&gt;性别&lt;/label&gt;&lt;input type="text" name="sex"&gt;
&lt;button&gt;确定&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;

这样子我们的<people>组件就更为通用了。并且当调用<people>的组件没有指定内容的时候,<peopel>组件里的<slot></slot>内容会渲染。如下图。这也是vue.js<slot>插槽最基本的用法。

匿名插槽和具名插槽

除非子组件模板包含至少一个 <slot> 插口,否则父组件的内容将会被丢弃。当子组件模板只有一个没有属性的插槽(匿名插槽)时,父组件传入的整个内容片段将插入到插槽所在的 DOM 位置,并替换掉插槽标签本身。

可以通过为<slot>插槽指定name(具名插槽)来指定渲染一个组件中多个插槽中的某一个。


&lt;div&gt;
&lt;slot name="slot1"&gt;&lt;/slot&gt;
&lt;slot name="slot2"&gt;&lt;/slot&gt;
&lt;/div&gt; 调用
&lt;people&gt;
&lt;div slot="slot1"&gt;slot1的内容&lt;/div&gt;
&lt;div slot="slot2"&gt;slot2的内容&lt;/div&gt;
&lt;/people&gt; 渲染的结果:
&lt;div&gt;
&lt;div &gt;slot1的内容&lt;/div&gt;
&lt;div &gt;slot2的内容&lt;/div&gt;
&lt;/div&gt;

作用域插槽

这种特殊的插槽可以暴露子组件中的内容,把数据交由父组件来渲染。看下面的例子:


子组件&lt;child&gt; 的模板
&lt;template&gt;
&lt;div&gt;
&lt;slot tip='子组件内部的tip'&gt;&lt;/slot&gt;
&lt;/div&gt;
&lt;/template&gt; 父组件中调用:
&lt;div&gt;
&lt;child&gt;
&lt;template slot-scope='props'&gt;
&lt;!--在这里可以使用child组件暴露在slot中的数据--&gt;
&lt;p&gt;{{props.tip}}&lt;/p&gt;
&lt;/template&gt;
&lt;/child&gt;
&lt;/div&gt; 渲染的结果为:
&lt;div&gt;
&lt;div&gt;
&lt;p&gt;子组件内部的tip&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

原文地址:https://segmentfault.com/a/1190000012836208

vue.js的<slot>的更多相关文章

  1. vue.js 中slot 用处大(转载)

    什么是组件? 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有 ...

  2. 关于vue.js中slot的理解

    slot这块看官网文档,起初有点不懂,仔细研究还是最终理解了,slot是用来干嘛的呢,先看下一个例子: <script src="https://unpkg.com/vue/dist/ ...

  3. vue.js单个slot

    刚开始看这个slot的时候有点蒙,想了几分钟才明白过来,汗颜 <script> var mycompoent = Vue.extend({ template:"<div&g ...

  4. Vue.js插槽slot和作用域插槽slot-scope学习小结

    一般来说,在Vue项目中使用父子组建时,都是把通用的HTML结构提取出来写成一个子组件,需要动态展示的数据用过prop属性传递,不过有时候我们可能想给子组件传递一个HTML代码,这个时候用prop不太 ...

  5. vue.js之数据传递和数据分发slot

    一.组件间的数据传递 1.父组件获取子组件的数据 *子组件把自己的数据,发送到父级 *vm.$emit(事件名,数据); *v-on: @ 示例用法:当点击send按钮的时候,"111&qu ...

  6. vue.js中的slot

    vue.js 中的 slot 一.slot 的作用 调用组件的时候,对于数据,我们会用props将数据从父组件传至子组件.但是,如果从父组件到子组件,单纯是页面局部渲染的改变,slot会更合适. 二. ...

  7. Vue.js 组件的三个 API:prop、event、slot

    组件的构成 一个再复杂的组件,都是由三部分组成的:prop.event.slot,它们构成了 Vue.js 组件的 API.如果你开发的是一个通用组件,那一定要事先设计好这三部分,因为组件一旦发布,后 ...

  8. Vue.js 作用域、slot用法(单个slot、具名slot)

    作用域 在介绍slot前,需要先知道一个概念:编译的作用域.比如父组件中有如下模板: <child-component> {{message}} <child-component&g ...

  9. Vue.js——vue-resource全攻略

    概述 上一篇我们介绍了如何将$.ajax和Vue.js结合在一起使用,并实现了一个简单的跨域CURD示例.Vue.js是数据驱动的,这使得我们并不需要直接操作DOM,如果我们不需要使用jQuery的D ...

随机推荐

  1. CommonJS 与 ES6 的依赖操作方法(require、import)

    CommonJS:http://www.commonjs.org/specs/modules/1.0/ ES2015的 export:https://developer.mozilla.org/en- ...

  2. HDU1420 - Prepared for New Acmer

    集训进行了将近2个礼拜,这段时间以恢复性训练为主,我一直在密切关注大家的训练情况,目前为止,对大家的表现相当满意,首先是绝大部分队员的训练积极性很高,其次,都很遵守集训纪律,最后,老队员也起到了很好的 ...

  3. CF833B The Bakery (线段树+DP)

    题目大意:给你一个序列(n<=35000),最多分不大于m块(m<=50),求每个块内不同元素的数量之和的最大值 考试的时候第一眼建图,没建出来,第二眼贪心 ,被自己hack掉了,又随手写 ...

  4. javaScript - 面向对象 - ES5 和 ES6

    javaScript - 面向对象 - ES5 和 ES6 ES5之前用 构造函数 构造函数的特点 就是一个普通函数, 他的函数名要大写.: 带方法的写法: 原型的方式: prototype 为内置的 ...

  5. Unity的Json解析<一>--读取Json文件

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50373558 作者:car ...

  6. ExcelToHtmlTable转换算法:将Excel转换成Html表格并展示(项目源码+详细注释+项目截图)

    功能概述 Excel2HtmlTable的主要功能就是把Excel的内容以表格的方式,展现在页面中.Excel的多个Sheet对应页面的多个Tab选项卡.转换算法的难点在于,如何处理行列合并,将Exc ...

  7. VUE:计算属性和监视

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. HTML5与后台服务器的数据流动问题

    编辑中,尚未完稿...2017.7.14 1345 很多前端开发出来的HTML5可能对于后台开发者来说,并不是很清楚,也许像我一样一知半解.而且真的让人很糊涂的地方就是前端的JS如何与后端的数据库进行 ...

  9. npm API文档

    npm API文档 https://docs.npmjs.com/

  10. Testbench代码设计技巧

    Testbench代码设计技巧 " There are many ways " to code a test case, it all depens on the creativi ...