zoukankan      html  css  js  c++  java
  • vue.js的<slot>

    使用插槽分发内容
    在封装vue组件的时候,很多时候就不得不使用到vue的一个内置组件<slot>。slot是插槽的意思,顾名思义,这个<slot>组件的意义是预留一个区域,让其中的DOM结构可以由调用它的组件来渲染。

    
    假设现在有一个people组件,结构如下:
    
    
    
    &lt;template&gt;
         &lt;div&gt;
          &lt;strong class="tip"&gt;*填写的内容必须真实&lt;/strong&gt;
          &lt;label&gt;姓名&lt;/label&gt;&lt;input type="text" name="name"&gt;
          &lt;label&gt;性别&lt;/label&gt;&lt;input type="text" name="sex"&gt;
          &lt;button&gt;确定&lt;/button&gt;
        &lt;/div&gt;
    &lt;/template&gt;
    
    
    当我们注册这个组件之后,就可以在其他组件中这样子使用
    
    
    &lt;template&gt;
        &lt;div&gt;
            &lt;h3&gt;用户信息&lt;/h3&gt;
            &lt;people&gt;
            &lt;/people&gt;
        &lt;/div&gt;
    &lt;/template&gt;
    
    
    
    我们都很清楚上面的代码最后渲染的样子。
    
    
    &lt;div&gt;
        &lt;h3&gt;用户信息&lt;/h3&gt;
        &lt;div&gt;
          &lt;strong class="tip"&gt;*填写的内容必须真实&lt;/strong&gt;
          &lt;label&gt;姓名&lt;/label&gt;&lt;input type="text" name="name"&gt;
          &lt;label&gt;性别&lt;/label&gt;&lt;input type="text" name="sex"&gt;
          &lt;button&gt;确定&lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    

    一般来说我们这样子封装<people>组件是没有问题的了。但是有时候我们在开发中,需要的组件还需要更抽象一点。我们试想以下,假设我们的<people>组件的功能是获取用户的信息,点击确定上传到服务器。如果是按照上面的方式封装这个<people>组件,那么我们每次调用这个组件就只能让用户输入姓名和性别。假设在另外的场景中,我们还需要用户输入多一项年龄信息,那我们的这个<people>组件就不能使用了,就还得需要另外一个一个组件。<people2>。而事实上这个<people2>的组件功能逻辑完全和<people>一样,只是多了一项年龄信息。在这种情况下,就相当于再写了一个重复的组件。那有没有办法可以让我们的<people>组件可以更通用点。这时候摆在我们面前的问题就是,能不能在调用<people>的时候,可以指定<people>组件应该怎么渲染?<slot>组件就是为了解决这种问题而存在的。

    
    我们改变一下&lt;people&gt;的封装方式:
    
    
    &lt;template&gt;
         &lt;div&gt;
          &lt;strong class="tip"&gt;*填写的内容必须真实&lt;/strong&gt;
         &lt;slot&gt;如果调用我的组件没有传入内容,那么就渲染&lt;slot&gt;里面的内容。&lt;/slot&gt;
        &lt;/div&gt;
    &lt;/template&gt;
    
    
    我们在需要由父组件来渲染的部分使用&lt;slot&gt;插槽,相当于占位。这样我们就可以在调用的时候,再指定这个&lt;people&gt;组件里面有什么内容:
    
    
    &lt;template&gt;
        &lt;div&gt;
            &lt;h3&gt;用户信息&lt;/h3&gt;
            &lt;people&gt;
                  &lt;label&gt;姓名&lt;/label&gt;&lt;input type="text" name="name"&gt;
                  &lt;label&gt;性别&lt;/label&gt;&lt;input type="text" name="sex"&gt;
                  &lt;button&gt;确定&lt;/button&gt;
            &lt;/people&gt;
        &lt;/div&gt;
    &lt;/template&gt;
    
    渲染之后是:
    
    &lt;div&gt;
        &lt;h3&gt;用户信息&lt;/h3&gt;
        &lt;div&gt;
          &lt;strong class="tip"&gt;*填写的内容必须真实&lt;/strong&gt;
          &lt;label&gt;姓名&lt;/label&gt;&lt;input type="text" name="name"&gt;
          &lt;label&gt;性别&lt;/label&gt;&lt;input type="text" name="sex"&gt;
          &lt;button&gt;确定&lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    
    
    

    这样子我们的<people>组件就更为通用了。并且当调用<people>的组件没有指定内容的时候,<peopel>组件里的<slot></slot>内容会渲染。如下图。这也是vue.js<slot>插槽最基本的用法。

    匿名插槽和具名插槽

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

    可以通过为<slot>插槽指定name(具名插槽)来指定渲染一个组件中多个插槽中的某一个。

    
    &lt;div&gt;
      &lt;slot name="slot1"&gt;&lt;/slot&gt;
      &lt;slot name="slot2"&gt;&lt;/slot&gt;
    &lt;/div&gt;
    
    调用
    &lt;people&gt;
      &lt;div slot="slot1"&gt;slot1的内容&lt;/div&gt;
      &lt;div slot="slot2"&gt;slot2的内容&lt;/div&gt;
    &lt;/people&gt;
    
    渲染的结果:
    &lt;div&gt;
      &lt;div &gt;slot1的内容&lt;/div&gt;
      &lt;div &gt;slot2的内容&lt;/div&gt;
    &lt;/div&gt;
    
    

    作用域插槽

    这种特殊的插槽可以暴露子组件中的内容,把数据交由父组件来渲染。看下面的例子:

    
    子组件&lt;child&gt; 的模板
    &lt;template&gt;
        &lt;div&gt;
          &lt;slot tip='子组件内部的tip'&gt;&lt;/slot&gt;
        &lt;/div&gt;
    &lt;/template&gt;
    
    父组件中调用:
    &lt;div&gt;
        &lt;child&gt;
            &lt;template slot-scope='props'&gt;
                 &lt;!--在这里可以使用child组件暴露在slot中的数据--&gt;
                &lt;p&gt;{{props.tip}}&lt;/p&gt;
            &lt;/template&gt;
        &lt;/child&gt;
    &lt;/div&gt;
    
    渲染的结果为:
    &lt;div&gt;
        &lt;div&gt;
        &lt;p&gt;子组件内部的tip&lt;/p&gt;
        &lt;/div&gt;   
    &lt;/div&gt;
    
    

    原文地址:https://segmentfault.com/a/1190000012836208

  • 相关阅读:
    Moodle 3.8 安装过程
    Discourse 数据分发
    Moodle 安装的时候提示 original IP
    Apache 安装运行测时候提示错误 (13)Permission denied: AH00091: httpd: could not open error log file
    Apache 配置 SELinux 命令的时候的命令 semanage
    Apache Httpd 安装 AH00558错误
    Discourse 如何修改用户自己的密码
    Discourse 如何限制注册用户的密码长度
    Discourse 的快捷键列表
    S3 存储附件和图片无法上传
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9959565.html
Copyright © 2011-2022 走看看