vue 插槽 slot
[vue] 插槽 slot
<!-- 文章内容 -->
<div data-note-content="" class="show-content">
<div class="show-content-free">
<p>之前对插槽的理解并不深入,参考官网理解一下~</p>
单个插槽
除非子组件模板包含至少一个 当子组件模板只有一个没有属性的插槽时,父组件传入的整个内容片段将插入到插槽所在的 DOM 位置,并替换掉插槽标签本身。
最初在
假定 my-component 组件有如下模板:
<div>
<h2>我是子组件的标题</h2>
<slot>
只有在没有要分发的内容时才会显示。
</slot>
</div>
父组件模板:
<div>
<h1>我是父组件的标题</h1>
<my-component>
<p>这是一些初始内容</p>
<p>这是更多的初始内容</p>
</my-component>
</div>
渲染结果:
<div>
<h1>我是父组件的标题</h1>
<div>
<h2>我是子组件的标题</h2>
<p>这是一些初始内容</p>
<p>这是更多的初始内容</p>
</div>
</div>
具名插槽
场景:
设计组合使用的组件时,内容分发 API 是非常有用的机制
<slot>
元素可以用一个特殊的特性 name 来进一步配置如何分发内容。多个插槽可以有不同的名字。具名插槽将匹配内容片段中有对应 slot 特性的元素。
仍然可以有一个匿名插槽,它是默认插槽,作为找不到匹配的内容片段的备用插槽。如果没有默认插槽,这些找不到匹配的内容片段将被抛弃。
例如,假定我们有一个 app-layout 组件,它的模板为:
<div class="container">
<header>
<slot name="header"></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>
父组件模板:
<app-layout>
<h1 slot="header">这里可能是一个页面标题</h1>
主要内容的一个段落。
另一个主要段落。
这里有一些联系信息
渲染结果为:
<div class="container">
<header>
<h1>这里可能是一个页面标题</h1>
</header>
<main>
<p>主要内容的一个段落。</p>
<p>另一个主要段落。</p>
</main>
<footer>
<p>这里有一些联系信息</p>
</footer>
</div>
作用域插槽
作用域插槽还不是特别理解。。。。。主要是没想清楚他的应用场景。。。如果有比较理解的可以留言指点一下~ 下面是一个例子但是这种场景我也没太理解这个list有何意义,通用性在哪里?http://blog.csdn.net/oak160/article/details/65447195
2.1.0 新增
作用域插槽是一种特殊类型的插槽,用作一个 (能被传递数据的) 可重用模板,来代替已经渲染好的元素。
在子组件中,只需将数据传递到插槽,就像你将 prop 传递给组件一样:
<div class="child">
<slot text="hello from child"></slot>
</div>
在父级中,具有特殊特性 slot-scope 的 元素必须存在,表示它是作用域插槽的模板。slot-scope 的值将被用作一个临时变量名,此变量接收从子组件传递过来的 prop 对象:
如果我们渲染上述模板,得到的输出会是: 在 2.5.0+,slot-scope 能被用在任意元素或组件中而不再局限于
列表组件的模板: 解构 slot-scope 的值实际上是一个可以出现在函数签名参数位置的合法的 JavaScript 表达式。这意味着在受支持的环境 (单文件组件或现代浏览器) 中,您还可以在表达式中使用 ES2015 解构: 在编写组件时,最好考虑好以后是否要进行复用。一次性组件间有紧密的耦合没关系,但是可复用组件应当定义一个清晰的公开接口,同时也不要对其使用的外层数据作出任何假设。 Vue 组件的 API 来自三部分——prop、事件和插槽: 使用 v-bind 和 v-on 的简写语法,模板的意图会更清楚且简洁:<div class="parent">
<child>
<template slot-scope="props">
<span>hello from parent</span>
<span>{
{ props.text }}</span>
</template>
</child>
</div>
<div class="parent">
<div class="child">
<span>hello from parent</span>
<span>hello from child</span>
</div>
</div>
作用域插槽更典型的用例是在列表组件中,允许使用者自定义如何渲染列表的每一项:
<my-awesome-list :items="items">
<!-- 作用域插槽也可以是具名的 -->
<li slot="item" slot-scope="props" class="my-fancy-item">
{
{ props.text }}
</li>
</my-awesome-list>
<ul>
<slot name="item" v-for="item in items" :text="item.text">
<!-- 这里写入备用内容 -->
</slot>
</ul>
<child>
<span slot-scope="{ text }">{
{ text }}</span>
</child>
编写可复用组件
<my-component :foo="baz" :bar="qux" @event-a="doThis" @event-b="doThat" >
<img slot="icon" src="...">
<p slot="main-text">Hello!</p>
</my-component>
还没有评论,来说两句吧...