vue中的插槽slot理解

本篇文章参考赛冷思的个人博客

1.函数默认传参

在我们写js函数我们的可能会给他们一个默认的参数,写法是

function show(age,name){
  var age = age || 20;
  var name = name || 张三;
console.log(age,name); } show();
// 20,张三 show(18,"命名") // 18,明明

如果用户不传入参数,那么会输出默认值,如果用户传入,会输出传入的值,这种写法很灵活

vue中的组件,也可以有默认的模板,当我们调用一个组件,啥都不传时,显示我们定义的默认模板,当我们传了自定义模板时,就应该使用我们自定义的模板,来替换默认模板,那么,今天说的slot,其实它就是实现的这个功能,可以理解为函数的传参。下面以类似官方的例子进行解释。

现在有个一个模板 child

<div>
      <h2>我是子组件的标题</h2>
      <slot>
        <p>当父组件调用我时,没有传自定义内容时,我就会显示了,如果传了自定义内容,我就不显示了。</p>
      </slot>
</div>

slot中的就是默认参数,如果我们不传入参数

<child></child>就会被渲染成

<div>
      <h2>我是子组件的标题</h2>
        <p>当父组件调用我时,没有传自定义内容时,我就会显示了,如果传了自定义内容,我就不显示了。</p>
</div>

如果我们传入参数

<child><p>这是我自定义的内容,覆盖子组件slot中的内容</p></child>渲染为

    <div>
          <h2>我是子组件的标题</h2>
          <p>这是我自定义的内容,覆盖子组件slot中的内容</p>
    </div>     

我们可以看到child中的元素会把模板中的内容改变,就好像我们传入的参数一样,所有理解为默认模板

但是可以看到,这种方式过于粗暴,并且只能定义一块默认内容,不是很方便,所以官方说了,slot还提供了一个具名功能,意思就是,在子组件定义slot时,加个标识,在父组件调用,自定义内容时,也加上标识,这样就实现了可以在任意地方定义默认内容,下面有请具名slot,其实就是给slot起个名字

<div class="container">
      <header>
        <slot name="header"><h1>默认header</h1></slot>
      </header>
      <main>
        <slot><p>默认main</p></slot>
      </main>
      <footer>
        <slot name="footer"><p>默认footer</p></slot>
      </footer>
</div>

上面的是子组件,我们给每一个slot一个name属性,如果是默认值的话,name是没有什么作用的,在传参时,我们可以让child中的元素,加上slot属性

<div>
      <child>
          <h1 slot='header'>自定义标题</h1>
          <p slot='footer'>自定义底部</p>
          <p>自定义main</p>
      </child>
</div>

所以,我们的child最后就被渲染成了

<div>
      <div class="container">
          <header>
            <h1>自定义标题</h1>
          </header>
          <main>
            <p>自定义main</p>
          </main>
          <footer>
            <p>自定义底部</p>
          </footer>
    </div>
</div>

在子组件定义slot加个name属性值,在父组件调用时,加上slot属性,值就是子组件中slot的name属性值,这样就会自动定位到对应的slot中,就实现了多个地方定义默认内容。

2019年7月3日更新,最近vue跟新了2.6版本,slot的语法变了,但是整体的作用没有改变,上面的语法已经废弃了,新的语法是 slot 和 template+v-slot,需要用的小伙伴去官网查看新的语法

原文地址:https://www.cnblogs.com/czy960731/p/9507686.html