Vue element-ui <el-table-column> formatter – 如何显示html?

Vue element-ui <el-table-column> formatter – how to display html?

如何return html格式化单元格值?

我想通过 <el-table-column> formatter.

获取自定义格式的值(使用 html 或其他组件)
<el-table :data="data">
  <el-table-column v-for="(column, index) in columns" 
                   :key="index" :label="column.label" 
                   :formatter="column.formatter">
  </el-table-column>
</el-table>
data() {
  return {
    columns: [
      {
        label: 'Created at',
        formatter: (row, col, value, index) => {
          return `<span class="date">${value}</span>`
        }
      },
      // edit:
      {
        label: 'Address',
        formatter: (row, col, value, index) => {
          return `<mini-map :data="${row}"></mini-map>`
        }
      }
      // other dynamic columns...
    ]
  }
}

但单元格内容显示为转义 html 字符串。有没有可能强制html?

EPIC 编辑: 我添加了一个答案和一个解决方案。

使用模板槽范围添加 html 格式化列

<script src="//unpkg.com/vue/dist/vue.js"></script>
<script src="//unpkg.com/element-ui/lib/index.js"></script>
<div id="app">
<template>
<el-table :data="tblData">
  <el-table-column prop="title"></el-table-column>
  <el-table-column prop="text">
    <template scope="scope">
      <span style="color:red;">{{scope.row.text}}</span>
    </template>
  </el-table-column>
</el-table>
</template>
</div>

var Main = {
  data() {
    return {
                tblData           : [
                    {title: 'title1', text:'text1'},
                    {title: 'title2', text:'text2'},
                    {title: 'title3', text:'text3'},
                ],
            }
  },
  methods : {

  }
}
var Ctor = Vue.extend(Main)
new Ctor().$mount('#app')

如果您想为 <el-table-column> 呈现自定义 HTML,您将需要使用 custom column template 功能,而不是 :formatter 属性。它看起来像这样:

<el-table :data="data">
  <el-table-column
    v-for="(column, index) in columns" 
    :key="index"
    :label="column.label"
  >
    <template slot-scope="scope">
      <span class="date">{{ scope.row.value }}</span>
    </template>
  </el-table-column>
</el-table>

在一般情况下,如果您需要呈现未转义的 HTML,则可以使用 v-html 指令。这涉及到一些安全隐患,因此请确保在获取 v-html 之前了解这些内容。

从本质上讲,它可以归结为:从不 使用v-html 呈现用户提供的内容。

好的,经过几个小时的集思广益,我找到了非常好的解决方案。我把它放在这里是为了其他人 - 我希望这对某人有所帮助。

自定义列中显示的值可以是:

  • 简单字符串(prop)

  • 格式化字符串(安全,没有任何 html 或组件,通过原始格式化程序)

  • 自定义值(html,组件,也安全!)

为了实现这一点,我必须创建自定义格式化程序组件,我将其放在文件夹中,即 /TableFormatters/

为此,有一个简单的功能组件 DatetimeFormatter 用图标显示日期时间。

TableFormatters/DatetimeFormatter.vue

<template functional>
  <span>
    <i class="icon-date"></i> {{ props.row[props.column] }}
  </span>
</template>

<script>
  export default {
    name: 'DatetimeFormatter',
  }
</script>

列配置如下:

import DatetimeFormatter from './TableFormatters/DatetimeFormatter'
// ...
data() {
  return {
    data: [/*...*/],
    columns: [
      name: {
        label: 'Name',
      },
      state: {
        label: 'State',
        formatter: row => {
            return 'State: '+row.state__label
        }
      },
      created_at: {
        label: 'Created at',
        formatter: DatetimeFormatter
      }
    ]
  }
}

现在是时候定义<el-table>:

<el-table :data="data">
  <el-table-column 
    v-for="(column, index) in columns" 
    :key="index" 
    :label="columns[column] ? columns[column].label : column"
    :prop="column"
    :formatter="typeof columns[column].formatter === 'function' ? columns[column].formatter : null">
    <template #default="{row}" v-if="typeof columns[column].formatter !== 'function'">
      <div v-if="columns[column].formatter"
        :is="columns[column].formatter" 
        :row="row" 
        :column="column">
      </div>
      <template v-else>
        {{ row[column] }}
      </template>
    </template>
  </el-table-column>
</el-table>

这很有魅力。格式化程序在这里发生了什么? 首先我们检查格式化程序是否设置为 function。如果是这样,本机 <el-table-column> 格式化程序将取得控制权,因为 <template #default={row}> 将不会被创建。否则将创建格式化程序组件(通过 :is 属性)。但是,如果没有格式化程序,将显示一行的普通值。

这也适用于我:

<el-table
   :data="tenancy.renewals"
   stripe
   height="300"
   style="width: 100%">

   <el-table-column
     prop="term"
     label="Term"
     :formatter="formatTerm"
     width="180">
   </el-table-column>

   <el-table-column
     prop="started"
     label="Started"
     :formatter="formatColDate"
     width="180">
   </el-table-column>

   <el-table-column
     prop="expiry"
     :formatter="formatColDate"
     label="Expiry">
   </el-table-column>

   <el-table-column
     prop="amount"
     :formatter="formatAmount"
     label="Amount">
   </el-table-column>

 </el-table>

然后在你的方法中有对应于格式化程序的方法。

就我而言,我已经有了数字和日期的混合:

...
      formatTerm (row, col, value, index) {
        return this.addSuffix(value, false)
      },

      formatColDate (row, col, value, index) {
        return this.formatDate(value)
      },

      formatAmount (row, col, value, index) {
        return this.formatMoney(value)
      },
...

我感到头疼,但它对我有效

<el-table :data="tableData" style="width: 100%">
              <el-table-column label="shortName" width="180">
                <template v-slot="scope">
                  <span v-html="scope ? scope.row.shortName : ''"></span>
                </template>
              </el-table-column>
...