使用vue的slot插槽做母板组件

版权声明:原创内容转载请注明出处: https://blog.csdn.net/wuzhe128520/article/details/89788806

母板组件是啥?

母板跟模板差不多,就是将一些重用性较高的页面结构抽离出来,封装到一个独立的组件里,以便于在各个项目中使用。比如后台管理,经典的头部,尾部,侧边栏与主要内容区域;我们就可以把这个结构封装成一个母板组件,今后只要写后台管理类的项目,就可以直接使用。下面具体来实现一下。

实现一个后台管理的母板组件

假设我们需要实现的是下面这张图的效果:

母板组件命名为layer.vue;为了快速实现这个布局效果,我直接使用element UI来做,其实用什么UI都无所谓,因为我们抽离出来的是一个布局结构,代码大概是这样的:

<el-container>
  <el-header>Header</el-header>
  <el-container>
    <el-aside width="200px">Aside</el-aside>
    <el-container>
      <el-main>Main</el-main>
      <el-footer>Footer</el-footer>
    </el-container>
  </el-container>
</el-container>

这样很快就可以实现一个后台管理的布局了,但是,如果以后,你又要写同样一个布局,是不是又得复制一份这样的代码呢?而且很可能每个区块里面都有很多其他的子组件在里面,比如像下面这样的代码:

<el-container>
  <el-header>
      <other-child-component></other-child-component>
    </el-header>
  <el-container>
    <el-aside width="200px">
              <el-menu></el-menu>
             <el-tree></el-tree>
        </el-aside>
    <el-container>
      <el-main>
             <el-breadcrumb separator="/"></el-breadcrumb>
              <el-carousel></el-carousel>
                <el-tab></el-tab>
            </el-main>
      <el-footer>Footer</el-footer>
    </el-container>
  </el-container>
</el-container>

我们如果仅仅只是为了需要布局结构,而把所有的代码copy一遍,然后删除掉无用的组件和文字,岂不是太浪费时间了。接下来我们用vue的slot来重构一下之前的代码:
layer.vue

<el-container>
  <el-header>
        <slot name="header"></slot>        
    </el-header>
  <el-container>
    <el-aside width="200px">
            <slot name="aside"></slot>
        </el-aside>
    <el-container>
      <el-main>
                <slot name="main"></slot>
            </el-main>
      <el-footer>
                <slot name="footer"></slot>
            </el-footer>
    </el-container>
  </el-container>
</el-container>

我们把第一个例子的代码,用slot替换了所有的文字;在当前母板里,slot相当于是提前占据区域的一块空间,等待后面使用这个slot的组件,填充具体内容;接下来,我们同样来实现例子二的效果,代码如下:
slot.vue

import layer from 'layer.vue'  
export default {
...
components: {
  layer
}
}

<layer>
    <div slot="footer">Footer</div>
    <other-child-component slot="header"></other-child-component>
    <div slot="aside">
           <el-menu></el-menu>
             <el-tree></el-tree>
    </div>
    <div slot="main">
            <el-breadcrumb separator="/"></el-breadcrumb>
            <el-carousel></el-carousel>
            <el-tab></el-tab>
    </div>
</layer>

可以看到,我们在slot.vue里面引入了layer母板组件,可以不用管div的顺序,在slot.vue里面,我们将footer放到了第一个div里面,这不会影响layer母板组件的布局效果;唯一影响具体效果的只有slot属性,slot.vue里元素的slot属性的值对应layer母板组件里slot标签的name属性的值,然后将内容插入到layer母板组件里。
除了不用管div的顺序以外,在母板组件里,无需关心用的是element UI还是bootstrap之类的UI库,因为只需要改变母板组件的class类名(在当前这种情况,需要将自定义标签替换为div等html自带的标签)就行,无需改变结构;
以后所有的项目,如果是同样的布局结构,就无需重复写代码了,直接在那个组件里引入layer.vue就ok了,还是节省了不少时间的。 同理,在项目中,其他高频出现的页面组件,也可以试着抽离出一个母板组件,简化组件里代码的复杂度,提高代码的复用性。
利用vue的slot插槽将“布局”封装成为一种组件,为大规模页面开发带来了非常大的便利性。从页面布局的角度我们称之为母板,但如果从布局入手又可以得到各种容器类组件,例如:Panel、Tabs、SideBar等等。

猜你喜欢

转载自blog.csdn.net/wuzhe128520/article/details/89788806