美文网首页Vue
[vue] 插槽 slot

[vue] 插槽 slot

作者: ddai_Q | 来源:发表于2018-01-05 14:36 被阅读7515次

    之前对插槽的理解并不深入,参考官网理解一下~

    单个插槽

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

    最初在 <slot> 标签中的任何内容都被视为备用内容。备用内容在子组件的作用域内编译,并且只有在宿主元素为空,且没有要插入的内容时才显示备用内容。

    假定 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>
    
      <p>主要内容的一个段落。</p>
      <p>另一个主要段落。</p>
    
      <p slot="footer">这里有一些联系信息</p>
    </app-layout>
    

    渲染结果为:

    <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 的 <template> 元素必须存在,表示它是作用域插槽的模板。slot-scope 的值将被用作一个临时变量名,此变量接收从子组件传递过来的 prop 对象:

    <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>
    

    在 2.5.0+,slot-scope 能被用在任意元素或组件中而不再局限于 <template>

    作用域插槽更典型的用例是在列表组件中,允许使用者自定义如何渲染列表的每一项:

    <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>
    

    解构

    slot-scope 的值实际上是一个可以出现在函数签名参数位置的合法的 JavaScript 表达式。这意味着在受支持的环境 (单文件组件或现代浏览器) 中,您还可以在表达式中使用 ES2015 解构:

    <child>
      <span slot-scope="{ text }">{{ text }}</span>
    </child>  
    

    编写可复用组件

    在编写组件时,最好考虑好以后是否要进行复用。一次性组件间有紧密的耦合没关系,但是可复用组件应当定义一个清晰的公开接口,同时也不要对其使用的外层数据作出任何假设。

    Vue 组件的 API 来自三部分——prop、事件和插槽:

    • Prop 允许外部环境传递数据给组件;
    • 事件允许从组件内触发外部环境的副作用;
    • 插槽允许外部环境将额外的内容组合在组件中。

    使用 v-bind 和 v-on 的简写语法,模板的意图会更清楚且简洁:

    <my-component
      :foo="baz"
      :bar="qux"
      @event-a="doThis"
      @event-b="doThat"
    >
      <img slot="icon" src="...">
      <p slot="main-text">Hello!</p>
    </my-component>
    

    话说小主开了一个微信公众号:[民间程序员],分享H5相关知识点,H5踩坑记,H5实战案例分享等,欢迎大家关注~

    博主小号-欢迎关注

    相关文章

      网友评论

        本文标题:[vue] 插槽 slot

        本文链接:https://www.haomeiwen.com/subject/ifmjnxtx.html