• 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,需要用的小伙伴去官网查看新的语法

  • 相关阅读:
    PHP的超全局变量
    Python 切片
    Python for else语句 以及 break和continue
    niceScroll 滚动条的用法
    python 短路求值或惰性求值
    python 中的 __name__
    python3 中的Counter函数
    谷歌浏览器 F12
    python reversed()的使用
    python字符串格式化% 操作符 {}操作符
  • 原文地址:https://www.cnblogs.com/czy960731/p/9507686.html
Copyright © 2020-2023  润新知