14

在使用vue自定义组件内容过程之中,我们绝大多数情况下都是通过预先写好不同的html模板,再通过props传入不同的值来渲染不同的模板。例如我们需要实现一个<v-title size='1'>组件。传入不同的size,标题显示不同的字号大小,我们可能这样去实现这个组件:

<template>
    <h1 v-if='size==1'><slot></slot></h1>
    <h2 v-if='size==2'><slot></slot></h1>
    <h3 v-if='size==3'><slot></slot></h1>
</template>

这样做法显得代码过多,而且有时候我们需要真的JavaScript完全编程能力,即通过js代码生成html结构,再插入到页面之中。实现这样要求我们需要了解render函数。首先我们先了解三点

  1. render方法的实质就是生成template模板;
  2. 通过调用一个方法来生成,而这个方法是通过render方法的参数传递给它的;
  3. 这个方法有三个参数,分别提供标签名,标签相关属性,标签内部的html内容

下面通过一个element ui自定义表格表头内容的功能来展示render函数使用。
页面代码部分:


<el-table-column  prop='timeSlice' :render-header="renderHeader">
    <template slot-scope="scope">
        {{scope.row.timeSlice}}
    </template>
</el-table-column>

js部分:使用render函数

 //自定义列标题内容
    renderHeader(h, { column, $index },index){
       return h('span', {}, [
        h('span', {}, '时间片段'),
        h('el-popover', { props: { placement: 'top-start', width: '200', trigger: 'hover', content: '领先/落后品类=单店平均单量-该品类城市店均单量' }}, [
           h('i', { slot: 'reference', class:'el-icon-question'}, '')
          ])
       ])

    },

实现效果:

clipboard.png

可以看到第一个函数参数即 标签名,第二个为属性名组成的对象,第三个参数代表值,如果值依然包含html标签,我们可以使用数组来定义。以上就是本文全部内容。


黎明破晓的街道
165 声望3 粉丝