1

在我的 Vue 应用程序中,我使用v-data-table,并且列值使用函数组件内的渲染函数呈现,如下所示:

render(createElement) {
    if (this.$props.format) {
      return this.$props.format(this.item, this.index, createElement);
    }
    return createElement('div', this.getText());
  },

然后在我的format函数(它是单独文件中对象的一部分)中,您可以使用它createElement来创建一个 hTML 元素并返回它。这是应用程序另一部分的示例:

format: (template, index, createElement) => {
    const captureType = template.captureType === 'passphrase' ? 'voice' : template.captureType;
    return createElement('div', captureType);
  },

因此,尽管如此,我正在尝试做一些相当复杂的事情,这是一个带有徽章的 Vuetify 图标。这是来自Vuetify 文档的代码。

<v-badge left>
  <template v-slot:badge>
    <span>6</span>
  </template>
  <v-icon
    large
    color="grey lighten-1"
  >
    shopping_cart
  </v-icon>
</v-badge>

作为起点,我可以很好地创建基本的徽章 HTML

    format: (item, index, createElement) => {
      const propsObj = {
        attrs: {
          color: 'blue',
        },
        props: {
          overlap: true,
          left: true,
        },
        slots: {
          badge: 'dummy',
        },
      };
      return createElement('v-badge', propsObj, [createElement('v-icon', { attrs: { color: 'success', large: true } }, 'account_circle')]);
    },

这让我几乎到了那里,因为它显示了我的图标,并且它被元素包裹badge,尽管没有显示徽章内容:

<span class="v-badge v-badge--left v-badge--overlap">
  <i aria ....>account_circle></a>
</span>

我的问题是获取badge插槽的显示值。我错过了什么?

4

1 回答 1

2

在朋友的帮助下,我得到了它的工作。这是最终的代码:

format: (item, index, createElement) => {
      const propsObj = {
        props: {
          overlap: true,
          left: true,
          color: 'success',
        },
      };
      const icon = createElement('v-icon', { props: { color: 'success', large: true } }, 'account_circle');
      const span = createElement('span', { slot: 'badge' }, '5');
      return createElement('v-badge', propsObj, [span, icon]);
    },

这个想法是我把它分解成更小的块,模仿我试图创建的结构。在这种情况下,它基本上是一个v-badge包含两个孩子的 a:badge插槽和v-icon元素。我将适当的配置选项传递给每个子元素,然后将两个渲染元素传递createElement给父元素v-badge

于 2020-04-13T18:31:22.310 回答