22. VUE 插槽-详解

插槽

一直对插槽不理解,今天学习,并整理一下,希望日后可以灵活运用。

(一)插槽内容

先简单来个例子,看一下插槽的租作用。

1.1 不使用插槽

父组件中:

  <div id="app">
      <h1>这是父组件:{{msg}}</h1>
      <child-component>你好</child-component>
  </div>

子组件中:

 <div>
        <h2>这是子组件,Child-Component</h2>
  </div>

结果:

 

 结论:

父组件引用子组件时,在子组件内写入:如(你好或者html),都不会显示。

1.2 使用插槽

父组件中:

  <div id="app">
      <h1>这是父组件:{{msg}}</h1>
      <child-component>你好</child-component>
  </div>

子组件中:

 <div>
        <h2>这是子组件,Child-Component</h2>
<slot></slot> </div>

结果:

 

 结论:

Vue 实现了一套内容分发的 API,这套 API 的设计灵感源自 Web Components 规范草案,将 <slot>元素作为承载分发内容的出口。当组件渲染的时候,<slot></slot> 将会被替换为“你好”。插槽内可以包含任何模板代码,包括 HTML

1.3 包含html

父组件:

  <div id="app">
      <h1>这是父组件:{{msg}}</h1>
      <child-component>
          <span>slot 测试</span>
      </child-component>
  </div>

 

1.4 如果子组件没有<slot>

如果子组件中没有任何的<slot>,那么在父组件中引用子组件时,在子组件的起始标签和结束标签之间的任何内容都会被抛弃。

 

(二)后备内容

后备内容,即为没有为插槽设置任何内容时,显示的默认内容。

父组件:

没有为插槽设置任何内容

  <div id="app">
      <h1>这是父组件:{{msg}}</h1>
      <child-component></child-component>
  </div>

子组件:

在子组件中,添加后备内容

   <div>
        <h2>这是子组件,Child-Component</h2>
        <slot>
            <span>这是后备内容</span>
        </slot>
    </div>

结果:

 

 

但是如果设置插槽,后备内容则不会显示。

 

 (三)具名插槽

有的时候,我们需要多个插槽,例如:

父子件:

  <div id="app">
      <h1 style="text-align: center">这是父组件:{{msg}}</h1>
      <child-component>
          <template v-slot:header>
              <h3 style="text-align: center;color: blue">这是header部分</h3>
          </template>
          <p style="color: blueviolet;text-align: center">这是主题部分</p>
          <template v-slot:fooder>
              <h3 style="text-align: center;color: aqua">这是fooder部分</h3>
          </template>
      </child-component>
  </div>

子组件:

   <div>
        <h2 style="text-align: center">这是子组件,Child-Component</h2>
        <slot name="header"></slot>
        <slot></slot>
        <slot name="footer"></slot>
    </div>

(四)作用域插槽

父组件中插槽中,可以取到子组件中数据。

父组件:

在v-slot添加元素上的特性被称为插槽 prop

   <div id="app">
        <h2 >这是父组件!</h2>
        <child-slot>
            <template v-slot:default="user">
               <p>父组件中,取子组件中的值:{{user.user.lastName}}</p>
            </template>
        </child-slot>
    </div>

子组件:

在<slot>中,绑定数据v-bind:user="user"

  <div>
        <h2>这是子组件</h2>
        <span>FirstName:{{user.firstName}},LastName:{{user.lastName}}</span>
        <slot v-bind:user="user">{{user.lastName}}</slot>
    </div>

结果:

 

 (五)独占默认插槽的缩写语法

当子组件中,只提供默认插槽时,组件的标签才可以被当作插槽的模板来使用。这样我们就可以把 v-slot 直接用在组件上:

<child-slot>
            <template v-slot:default="user">
               <p>父组件中,取子组件中的值:{{user.user.lastName}}</p>
            </template>
  </child-slot>

也可以,简写为:

<child-slot>
            <template v-slot="user">
               <p>父组件中,取子组件中的值:{{user.user.lastName}}</p>
            </template>
</child-slot>

 

转载于:https://www.cnblogs.com/shix0909/p/11519819.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值